[vlc-devel] [PATCH] demux: mock: Add orientation option

Tanguy Dubroca tanguy.dubroca at lse.epita.fr
Wed Sep 16 16:01:50 CEST 2020


Usage: ./vlc 'mock://<mock options>;video_orientation=<orientation>'

The video_orientation option is a simplification of the values from
video_orientation_t. The possible values are:

- normal
- transposed / antitransposed
- hflipped / vflipped
- rotated_90 / rotated_180 / rotated_270

Fix #25054
---
 modules/demux/mock.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/modules/demux/mock.c b/modules/demux/mock.c
index 3e40de176d..d2156132ea 100644
--- a/modules/demux/mock.c
+++ b/modules/demux/mock.c
@@ -118,6 +118,10 @@ var_Read_float(const char *psz)
     return atof(psz);
 }
 
+typedef char* orientation_str_t;
+
+#define var_Read_orientation_str_t(psz) NULL
+
 #define OPTIONS_AUDIO(Y) \
     Y(audio, packetized, bool, add_bool, Bool, true) \
     Y(audio, add_track_at, vlc_tick_t, add_integer, Integer, VLC_TICK_INVALID) \
@@ -136,7 +140,8 @@ var_Read_float(const char *psz)
     Y(video, width, unsigned, add_integer, Unsigned, 640) \
     Y(video, height, unsigned, add_integer, Unsigned, 480) \
     Y(video, frame_rate, unsigned, add_integer, Unsigned, 25) \
-    Y(video, frame_rate_base, unsigned, add_integer, Unsigned, 1)
+    Y(video, frame_rate_base, unsigned, add_integer, Unsigned, 1) \
+    Y(video, orientation, orientation_str_t, add_string, String, NULL)
 
 #define OPTIONS_SUB(Y) \
     Y(sub, packetized, bool, add_bool, Bool, true)\
@@ -620,6 +625,31 @@ CreateTrack(demux_t *demux, int i_cat, int id, int group)
     return track;
 }
 
+static bool
+OrientationFromString(const char *orient, video_orientation_t *result)
+{
+    if (!orient || !strcmp(orient, "normal"))
+        *result = ORIENT_NORMAL;
+    else if (!strcmp(orient, "transposed"))
+        *result = ORIENT_TRANSPOSED;
+    else if (!strcmp(orient, "antitransposed"))
+        *result = ORIENT_ANTI_TRANSPOSED;
+    else if (!strcmp(orient, "hflipped"))
+        *result = ORIENT_HFLIPPED;
+    else if (!strcmp(orient, "vflipped"))
+        *result = ORIENT_VFLIPPED;
+    else if (!strcmp(orient, "rotated_180"))
+        *result = ORIENT_ROTATED_180;
+    else if (!strcmp(orient, "rotated_270"))
+        *result = ORIENT_ROTATED_270;
+    else if (!strcmp(orient, "rotated_90"))
+        *result = ORIENT_ROTATED_90;
+    else
+        return false;
+
+    return true;
+}
+
 static int
 ConfigureVideoTrack(demux_t *demux,
                     const struct mock_video_options *options,
@@ -649,6 +679,12 @@ ConfigureVideoTrack(demux_t *demux,
         return VLC_EGENERIC;
     }
 
+    if (!OrientationFromString(options->orientation, &fmt->video.orientation))
+    {
+        msg_Err(demux, "Invalid orientation value %s", options->orientation);
+        return VLC_EGENERIC;
+    }
+
     fmt->i_codec = chroma;
     fmt->video.i_chroma = chroma;
     fmt->video.i_width = fmt->video.i_visible_width = options->width;
@@ -959,6 +995,7 @@ Close(vlc_object_t *obj)
     struct demux_sys *sys = demux->p_sys;
 
     free( sys->config );
+    free( sys->video.orientation );
 
     struct mock_track *track;
     vlc_vector_foreach(track, &sys->tracks)
-- 
2.28.0



More information about the vlc-devel mailing list