[vlc-devel] [PATCH 10/10] vout: use struct vout_crop in display

remi at remlab.net remi at remlab.net
Sat Feb 6 16:27:32 UTC 2021


From: RĂ©mi Denis-Courmont <remi at remlab.net>

---
 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;
 
-- 
2.30.0



More information about the vlc-devel mailing list