[vlc-devel] [PATCH 02/10] vout: parse crop string into dedicated structure

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


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

This changes the parser function to output into a single structure
rather than half a dozen different variables.

No functional changes.
---
 src/video_output/video_output.c  | 18 +++++++-------
 src/video_output/vout_internal.h |  5 +---
 src/video_output/vout_intf.c     | 41 +++++++++++++++-----------------
 3 files changed, 28 insertions(+), 36 deletions(-)

diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index d01bf880d6..9ca6dab765 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -2214,24 +2214,22 @@ static void vout_InitSource(vout_thread_sys_t *vout)
 
     char *psz_crop = var_InheritString(&vout->obj, "crop");
     if (psz_crop) {
-        unsigned num, den;
-        unsigned y, x;
-        unsigned width, height;
-        enum vout_crop_mode mode;
+        struct vout_crop crop;
 
-        if (GetCropMode(psz_crop, &mode, &num, &den,
-                        &x, &y, &width, &height))
+        if (vout_ParseCrop(&crop, psz_crop))
         {
-            switch (mode)
+            switch (crop.mode)
             {
             case VOUT_CROP_RATIO:
-                vout_SetCropRatio(vout, num, den);
+                vout_SetCropRatio(vout, crop.ratio.num, crop.ratio.den);
                 break;
             case VOUT_CROP_WINDOW:
-                vout_SetCropWindow(vout, x, y, width, height);
+                vout_SetCropWindow(vout, crop.window.x, crop.window.y,
+                                   crop.window.width, crop.window.height);
                 break;
             case VOUT_CROP_BORDER:
-                vout_SetCropBorder(vout, x, y, width, height);
+                vout_SetCropBorder(vout, crop.border.left, crop.border.top,
+                                   crop.border.right, crop.border.bottom);
                 break;
             case VOUT_CROP_NONE:
                 break;
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index a351106224..42e5748d54 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -126,10 +126,7 @@ struct vout_crop {
     };
 };
 
-bool GetCropMode(const char *crop_str, enum vout_crop_mode *mode,
-                        unsigned *num, unsigned *den,
-                        unsigned *x, unsigned *y,
-                        unsigned *width, unsigned *height );
+bool vout_ParseCrop(struct vout_crop *, const char *crop_str);
 bool GetAspectRatio(const char *ar_str, unsigned *num, unsigned *den);
 
 /* TODO to move them to vlc_vout.h */
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index a4ea6bf5af..daa1d70eab 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -449,22 +449,21 @@ exit:
     free( psz_path );
 }
 
-bool GetCropMode(const char *crop_str, enum vout_crop_mode *mode,
-                        unsigned *num, unsigned *den,
-                        unsigned *x, unsigned *y,
-                        unsigned *width, unsigned *height )
+bool vout_ParseCrop(struct vout_crop *restrict cfg, const char *crop_str)
 {
-    if (sscanf(crop_str, "%u:%u", num, den) == 2) {
-        *mode = VOUT_CROP_RATIO;
+    if (sscanf(crop_str, "%u:%u", &cfg->ratio.num, &cfg->ratio.den) == 2) {
+        cfg->mode = VOUT_CROP_RATIO;
     } else if (sscanf(crop_str, "%ux%u+%u+%u",
-                      width, height, x, y) == 4) {
-        *mode = VOUT_CROP_WINDOW;
+                      &cfg->window.width, &cfg->window.height,
+                      &cfg->window.x, &cfg->window.y) == 4) {
+        cfg->mode = VOUT_CROP_WINDOW;
     } else if (sscanf(crop_str, "%u+%u+%u+%u",
-                    x, y, width, height) == 4) {
-        *mode = VOUT_CROP_BORDER;
+                      &cfg->border.left, &cfg->border.top,
+                      &cfg->border.right, &cfg->border.bottom) == 4) {
+        cfg->mode = VOUT_CROP_BORDER;
     } else if (*crop_str == '\0') {
-        *mode = VOUT_CROP_RATIO;
-        *num = *den = 0;
+        cfg->mode = VOUT_CROP_RATIO;
+        cfg->ratio.num = cfg->ratio.den = 0;
     } else {
         return false;
     }
@@ -479,23 +478,21 @@ static int CropCallback( vlc_object_t *object, char const *cmd,
 {
     vout_thread_t *vout = (vout_thread_t *)object;
     VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(data);
-    unsigned num, den;
-    unsigned y, x;
-    unsigned width, height;
-    enum vout_crop_mode mode;
+    struct vout_crop crop;
 
-    if (GetCropMode(newval.psz_string, &mode, &num, &den,
-                    &x, &y, &width, &height)) {
-        switch (mode)
+    if (vout_ParseCrop(&crop, newval.psz_string)) {
+        switch (crop.mode)
         {
             case VOUT_CROP_RATIO:
-                vout_ChangeCropRatio(vout, num, den);
+                vout_ChangeCropRatio(vout, crop.ratio.num, crop.ratio.den);
                 break;
             case VOUT_CROP_WINDOW:
-                vout_ChangeCropWindow(vout, x, y, width, height);
+                vout_ChangeCropWindow(vout, crop.window.x, crop.window.y,
+                                      crop.window.width, crop.window.height);
                 break;
             case VOUT_CROP_BORDER:
-                vout_ChangeCropBorder(vout, x, y, width, height);
+                vout_ChangeCropBorder(vout, crop.border.left, crop.border.top,
+                                      crop.border.right, crop.border.bottom);
                 break;
             case VOUT_CROP_NONE:
                 break;
-- 
2.30.0



More information about the vlc-devel mailing list