vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sat Feb 6 18:14:24 2021 +0200| [63384a250570bf26c7cedd3061f6df64f8958cbf] | committer: Rémi Denis-Courmont
vout: use struct vout_crop in display > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=63384a250570bf26c7cedd3061f6df64f8958cbf --- src/video_output/display.c | 105 ++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 69 deletions(-) diff --git a/src/video_output/display.c b/src/video_output/display.c index 6d91d57849..06dd9533db 100644 --- a/src/video_output/display.c +++ b/src/video_output/display.c @@ -263,15 +263,7 @@ typedef struct { /* */ vout_display_cfg_t cfg; - - struct { - int left; - int top; - int right; - int bottom; - unsigned num; - unsigned den; - } crop; + struct vout_crop crop; /* */ video_format_t source; @@ -457,35 +449,48 @@ static int vout_UpdateSourceCrop(vout_display_t *vd) { vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display); video_format_t fmt = osys->source; - const unsigned crop_num = osys->crop.num; - const unsigned crop_den = osys->crop.den; + int left, top, right, bottom; - if (crop_num != 0 && crop_den != 0) { - VoutDisplayCropRatio(&osys->crop.left, &osys->crop.top, - &osys->crop.right, &osys->crop.bottom, - &osys->source, crop_num, crop_den); + switch (osys->crop.mode) { + case VOUT_CROP_NONE: + left = top = right = bottom = 0; + break; + case VOUT_CROP_RATIO: + VoutDisplayCropRatio(&left, &top, &right, &bottom, &osys->source, + osys->crop.ratio.num, osys->crop.ratio.den); + break; + case VOUT_CROP_WINDOW: + left = osys->crop.window.x; + top = osys->crop.window.y; + right = osys->crop.window.width; + bottom = osys->crop.window.height; + break; + case VOUT_CROP_BORDER: + left = osys->crop.border.left; + top = osys->crop.border.top; + right = -(int)osys->crop.border.right; + bottom = -(int)osys->crop.border.bottom; + break; } const int right_max = osys->source.i_x_offset + osys->source.i_visible_width; const int bottom_max = osys->source.i_y_offset + osys->source.i_visible_height; - int left = VLC_CLIP((int)osys->source.i_x_offset + osys->crop.left, - 0, right_max - 1); - int top = VLC_CLIP((int)osys->source.i_y_offset + osys->crop.top, - 0, bottom_max - 1); - int right, bottom; - - if (osys->crop.right <= 0) - right = (int)(osys->source.i_x_offset + osys->source.i_visible_width) + osys->crop.right; + + left = VLC_CLIP((int)osys->source.i_x_offset + left, 0, right_max - 1); + top = VLC_CLIP((int)osys->source.i_y_offset + top, 0, bottom_max - 1); + + if (right <= 0) + right = (int)(osys->source.i_x_offset + osys->source.i_visible_width) + right; else - right = (int)osys->source.i_x_offset + osys->crop.right; + right = (int)osys->source.i_x_offset + right; right = VLC_CLIP(right, left + 1, right_max); - if (osys->crop.bottom <= 0) - bottom = (int)(osys->source.i_y_offset + osys->source.i_visible_height) + osys->crop.bottom; + if (bottom <= 0) + bottom = (int)(osys->source.i_y_offset + osys->source.i_visible_height) + bottom; else - bottom = (int)osys->source.i_y_offset + osys->crop.bottom; + bottom = (int)osys->source.i_y_offset + bottom; bottom = VLC_CLIP(bottom, top + 1, bottom_max); osys->source.i_x_offset = left; @@ -513,8 +518,7 @@ static int vout_SetSourceAspect(vout_display_t *vd, ret = -1; /* If a crop ratio is requested, recompute the parameters */ - if (osys->crop.num != 0 && osys->crop.den != 0 - && vout_UpdateSourceCrop(vd)) + if (osys->crop.mode != VOUT_CROP_NONE && vout_UpdateSourceCrop(vd)) ret = -1; return ret; @@ -622,41 +626,9 @@ void vout_SetDisplayCrop(vout_display_t *vd, const struct vout_crop *restrict crop) { vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display); - unsigned crop_num = 0, crop_den = 0, left = 0, top = 0; - int right = 0, bottom = 0; - - switch (crop->mode) { - case VOUT_CROP_NONE: - break; - case VOUT_CROP_RATIO: - crop_num = crop->ratio.num; - crop_den = crop->ratio.den; - break; - case VOUT_CROP_WINDOW: - left = crop->window.x; - top = crop->window.y; - right = crop->window.width; - bottom = crop->window.height; - break; - case VOUT_CROP_BORDER: - left = crop->border.left; - top = crop->border.top; - right = -(int)crop->border.right; - bottom = -(int)crop->border.bottom; - break; - } - - if (osys->crop.left != (int)left || osys->crop.top != (int)top || - osys->crop.right != right || osys->crop.bottom != bottom || - (crop_num != 0 && crop_den != 0 && - (crop_num != osys->crop.num || crop_den != osys->crop.den))) { - osys->crop.left = left; - osys->crop.top = top; - osys->crop.right = right; - osys->crop.bottom = bottom; - osys->crop.num = crop_num; - osys->crop.den = crop_den; + if (!vout_CropEqual(crop, &osys->crop)) { + osys->crop = *crop; if (vout_UpdateSourceCrop(vd)) vout_display_Reset(vd); @@ -712,12 +684,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent, osys->pool = NULL; video_format_Copy(&osys->source, source); - osys->crop.left = 0; - osys->crop.top = 0; - osys->crop.right = 0; - osys->crop.bottom = 0; - osys->crop.num = 0; - osys->crop.den = 0; + osys->crop.mode = VOUT_CROP_NONE; osys->src_vctx = vctx ? vlc_video_context_Hold( vctx ) : NULL; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
