Rémi Bernon : winegstreamer: Only filter video caps attributes when format uses 0.

Alexandre Julliard julliard at winehq.org
Wed May 25 16:51:48 CDT 2022


Module: wine
Branch: master
Commit: 7adcdb6ff8c6ac321a1f21bfa4123d08c3bc52d5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7adcdb6ff8c6ac321a1f21bfa4123d08c3bc52d5

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Apr  5 11:45:47 2022 +0200

winegstreamer: Only filter video caps attributes when format uses 0.

In wg_transform we only want to remove width/height/framerate if the
transform supports format change, and we want to keep the caps fixed
otherwise so we can use gst_caps_is_always_compatible to monitor caps
changes.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45988
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47084
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49715
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52183
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>

---

 dlls/mf/tests/mf.c                | 2 +-
 dlls/winegstreamer/h264_decoder.c | 8 ++++++++
 dlls/winegstreamer/wg_format.c    | 9 ++++++---
 dlls/winegstreamer/wg_parser.c    | 6 ++++++
 4 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index e873712085b..9de7308f9ff 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -7200,7 +7200,7 @@ static void test_h264_decoder(void)
             "got status %#lx\n", status);
     hr = IMFSample_GetTotalLength(output.pSample, &length);
     ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr);
-    todo_wine_if(length == 1920 * 1080 * 3 / 2)
+    todo_wine
     ok(length == 0, "got length %lu\n", length);
     ret = IMFSample_Release(output.pSample);
     ok(ret == 0, "Release returned %lu\n", ret);
diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c
index b7174d097ad..66d53a3a5ce 100644
--- a/dlls/winegstreamer/h264_decoder.c
+++ b/dlls/winegstreamer/h264_decoder.c
@@ -75,6 +75,14 @@ static HRESULT try_create_wg_transform(struct h264_decoder *decoder)
     if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN)
         return MF_E_INVALIDMEDIATYPE;
 
+    /* Don't force any specific size, H264 streams already have the metadata for it
+     * and will generate a MF_E_TRANSFORM_STREAM_CHANGE result later.
+     */
+    output_format.u.video.width = 0;
+    output_format.u.video.height = 0;
+    output_format.u.video.fps_d = 0;
+    output_format.u.video.fps_n = 0;
+
     if (!(decoder->wg_transform = wg_transform_create(&input_format, &output_format)))
         return E_FAIL;
 
diff --git a/dlls/winegstreamer/wg_format.c b/dlls/winegstreamer/wg_format.c
index 5b3a5617ff1..4cebeac9182 100644
--- a/dlls/winegstreamer/wg_format.c
+++ b/dlls/winegstreamer/wg_format.c
@@ -394,11 +394,14 @@ static GstCaps *wg_format_to_caps_video(const struct wg_format *format)
     gst_video_info_set_format(&info, video_format, format->u.video.width, abs(format->u.video.height));
     if ((caps = gst_video_info_to_caps(&info)))
     {
-        /* Clear some fields that shouldn't prevent us from connecting. */
         for (i = 0; i < gst_caps_get_size(caps); ++i)
         {
-            gst_structure_remove_fields(gst_caps_get_structure(caps, i),
-                    "framerate", "pixel-aspect-ratio", "colorimetry", "chroma-site", NULL);
+            if (!format->u.video.width)
+                gst_structure_remove_fields(gst_caps_get_structure(caps, i), "width", NULL);
+            if (!format->u.video.height)
+                gst_structure_remove_fields(gst_caps_get_structure(caps, i), "height", NULL);
+            if (!format->u.video.fps_d && !format->u.video.fps_n)
+                gst_structure_remove_fields(gst_caps_get_structure(caps, i), "framerate", NULL);
         }
     }
     return caps;
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 48b88a4b11c..7d55897aa0a 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -598,6 +598,7 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
         {
             GstCaps *caps, *filter, *temp;
             gchar *str;
+            gsize i;
 
             gst_query_parse_caps(query, &filter);
 
@@ -608,6 +609,11 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
             if (!caps)
                 return FALSE;
 
+            /* Clear some fields that shouldn't prevent us from connecting. */
+            for (i = 0; i < gst_caps_get_size(caps); ++i)
+                gst_structure_remove_fields(gst_caps_get_structure(caps, i),
+                        "framerate", "pixel-aspect-ratio", "colorimetry", "chroma-site", NULL);
+
             str = gst_caps_to_string(caps);
             GST_LOG("Stream caps are \"%s\".", str);
             g_free(str);




More information about the wine-cvs mailing list