mirror of
https://github.com/mpv-player/mpv
synced 2024-12-26 17:12:36 +00:00
demux_mkv: don't set codec crop rect when there is no crop
Unfortunately there are files out there with broken tags where the width/height doesn't match the actual width/height of the file. That means the cropping logic which normally should be a no-op resulting in (0, 0, w, h) ends up being a crop which is probably not wanted by the user. Workaround this by simply keeping the entire crop rect as 0 when there is no container cropping. All zeros is internally treated the same as (0, 0, w, h) and avoids bad container data messing up the width or height of the window. Also simplify the logic a bit and get rid of some superflorous bools that had no real use. Fixes #12680.
This commit is contained in:
parent
9ea9279cf4
commit
dc2298f4da
@ -110,7 +110,6 @@ typedef struct mkv_track {
|
||||
int stereo_mode;
|
||||
struct mp_colorspace color;
|
||||
uint32_t v_crop_top, v_crop_left, v_crop_right, v_crop_bottom;
|
||||
bool v_crop_top_set, v_crop_left_set, v_crop_right_set, v_crop_bottom_set;
|
||||
float v_projection_pose_roll;
|
||||
bool v_projection_pose_roll_set;
|
||||
|
||||
@ -663,22 +662,18 @@ static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track,
|
||||
}
|
||||
if (video->n_pixel_crop_top) {
|
||||
track->v_crop_top = video->pixel_crop_top;
|
||||
track->v_crop_top_set = true;
|
||||
MP_DBG(demuxer, "| + Crop top: %"PRIu32"\n", track->v_crop_top);
|
||||
}
|
||||
if (video->n_pixel_crop_left) {
|
||||
track->v_crop_left = video->pixel_crop_left;
|
||||
track->v_crop_left_set = true;
|
||||
MP_DBG(demuxer, "| + Crop left: %"PRIu32"\n", track->v_crop_left);
|
||||
}
|
||||
if (video->n_pixel_crop_right) {
|
||||
track->v_crop_right = video->pixel_crop_right;
|
||||
track->v_crop_right_set = true;
|
||||
MP_DBG(demuxer, "| + Crop right: %"PRIu32"\n", track->v_crop_right);
|
||||
}
|
||||
if (video->n_pixel_crop_bottom) {
|
||||
track->v_crop_bottom = video->pixel_crop_bottom;
|
||||
track->v_crop_bottom_set = true;
|
||||
MP_DBG(demuxer, "| + Crop bottom: %"PRIu32"\n", track->v_crop_bottom);
|
||||
}
|
||||
if (video->n_colour)
|
||||
@ -1510,16 +1505,23 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
|
||||
sh_v->disp_w = track->v_width;
|
||||
sh_v->disp_h = track->v_height;
|
||||
|
||||
sh_v->crop.x0 = track->v_crop_left_set ? track->v_crop_left : 0;
|
||||
sh_v->crop.y0 = track->v_crop_top_set ? track->v_crop_top : 0;
|
||||
sh_v->crop.x1 = track->v_width -
|
||||
(track->v_crop_right_set ? track->v_crop_right : 0);
|
||||
sh_v->crop.y1 = track->v_height -
|
||||
(track->v_crop_bottom_set ? track->v_crop_bottom : 0);
|
||||
struct mp_rect crop;
|
||||
crop.x0 = track->v_crop_left;
|
||||
crop.y0 = track->v_crop_top;
|
||||
crop.x1 = track->v_width - track->v_crop_right;
|
||||
crop.y1 = track->v_height - track->v_crop_bottom;
|
||||
|
||||
int dw = track->v_dwidth_set ? track->v_dwidth : mp_rect_w(sh_v->crop);
|
||||
int dh = track->v_dheight_set ? track->v_dheight : mp_rect_h(sh_v->crop);
|
||||
struct mp_image_params p = {.w = mp_rect_w(sh_v->crop), .h = mp_rect_h(sh_v->crop)};
|
||||
// Keep the codec crop rect as 0s if we have no cropping since the
|
||||
// file may have broken width/height tags.
|
||||
if (track->v_crop_left || track->v_crop_top ||
|
||||
track->v_crop_right || track->v_crop_bottom)
|
||||
{
|
||||
sh_v->crop = crop;
|
||||
}
|
||||
|
||||
int dw = track->v_dwidth_set ? track->v_dwidth : mp_rect_w(crop);
|
||||
int dh = track->v_dheight_set ? track->v_dheight : mp_rect_h(crop);
|
||||
struct mp_image_params p = {.w = mp_rect_w(crop), .h = mp_rect_h(crop)};
|
||||
mp_image_params_set_dsize(&p, dw, dh);
|
||||
sh_v->par_w = p.p_w;
|
||||
sh_v->par_h = p.p_h;
|
||||
|
Loading…
Reference in New Issue
Block a user