Zebediah Figura : winegstreamer: Compare wg_format structures in GST_QUERY_ACCEPT_CAPS.

Alexandre Julliard julliard at winehq.org
Wed Feb 10 15:34:01 CST 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Feb  9 17:13:55 2021 -0600

winegstreamer: Compare wg_format structures in GST_QUERY_ACCEPT_CAPS.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/gstdemux.c | 71 ++++++++++++++++++-------------------------
 1 file changed, 29 insertions(+), 42 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 7c70041000c..51e7a5abef1 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -628,14 +628,6 @@ static bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format
     return false;
 }
 
-static bool amt_from_gst_caps(const GstCaps *caps, AM_MEDIA_TYPE *mt)
-{
-    struct wg_format wg_format;
-
-    wg_format_from_caps(&wg_format, caps);
-    return amt_from_wg_format(mt, &wg_format);
-}
-
 static bool amt_to_wg_format_audio(const AM_MEDIA_TYPE *mt, struct wg_format *format)
 {
     static const struct
@@ -906,6 +898,32 @@ static GstCaps *amt_to_gst_caps(const AM_MEDIA_TYPE *mt)
     return wg_format_to_caps(&wg_format);
 }
 
+static bool wg_format_compare(const struct wg_format *a, const struct wg_format *b)
+{
+    if (a->major_type != b->major_type)
+        return false;
+
+    switch (a->major_type)
+    {
+        case WG_MAJOR_TYPE_UNKNOWN:
+            return false;
+
+        case WG_MAJOR_TYPE_AUDIO:
+            return a->u.audio.format == b->u.audio.format
+                    && a->u.audio.channels == b->u.audio.channels
+                    && a->u.audio.rate == b->u.audio.rate;
+
+        case WG_MAJOR_TYPE_VIDEO:
+            return a->u.video.format == b->u.video.format
+                    && a->u.video.width == b->u.video.width
+                    && a->u.video.height == b->u.video.height
+                    && a->u.video.fps_d * b->u.video.fps_n == a->u.video.fps_n * b->u.video.fps_d;
+    }
+
+    assert(0);
+    return false;
+}
+
 static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
 {
     struct parser_source *pin = gst_pad_get_element_private(pad);
@@ -941,8 +959,8 @@ static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
         }
         case GST_QUERY_ACCEPT_CAPS:
         {
+            struct wg_format format;
             gboolean ret = TRUE;
-            AM_MEDIA_TYPE mt;
             GstCaps *caps;
 
             if (!stream->enabled)
@@ -952,45 +970,14 @@ static gboolean query_sink(GstPad *pad, GstObject *parent, GstQuery *query)
             }
 
             gst_query_parse_accept_caps(query, &caps);
-            if (!amt_from_gst_caps(caps, &mt))
-                return FALSE;
-
-            if (!IsEqualGUID(&mt.majortype, &pin->pin.pin.mt.majortype)
-                    || !IsEqualGUID(&mt.subtype, &pin->pin.pin.mt.subtype)
-                    || !IsEqualGUID(&mt.formattype, &pin->pin.pin.mt.formattype))
-                ret = FALSE;
-
-            if (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video))
-            {
-                const VIDEOINFOHEADER *req_vih = (VIDEOINFOHEADER *)mt.pbFormat;
-                const VIDEOINFOHEADER *our_vih = (VIDEOINFOHEADER *)pin->pin.pin.mt.pbFormat;
-
-                if (req_vih->bmiHeader.biWidth != our_vih->bmiHeader.biWidth
-                        || req_vih->bmiHeader.biHeight != our_vih->bmiHeader.biHeight
-                        || req_vih->bmiHeader.biBitCount != our_vih->bmiHeader.biBitCount
-                        || req_vih->bmiHeader.biCompression != our_vih->bmiHeader.biCompression)
-                    ret = FALSE;
-            }
-            else if (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio))
-            {
-                const WAVEFORMATEX *req_wfx = (WAVEFORMATEX *)mt.pbFormat;
-                const WAVEFORMATEX *our_wfx = (WAVEFORMATEX *)pin->pin.pin.mt.pbFormat;
-
-                if (req_wfx->nChannels != our_wfx->nChannels
-                        || req_wfx->nSamplesPerSec != our_wfx->nSamplesPerSec
-                        || req_wfx->wBitsPerSample != our_wfx->wBitsPerSample)
-                    ret = FALSE;
-            }
-
-            FreeMediaType(&mt);
-
+            wg_format_from_caps(&format, caps);
+            ret = wg_format_compare(&format, &stream->current_format);
             if (!ret && WARN_ON(gstreamer))
             {
                 gchar *str = gst_caps_to_string(caps);
                 WARN("Rejecting caps \"%s\".\n", debugstr_a(str));
                 g_free(str);
             }
-
             gst_query_set_accept_caps_result(query, ret);
             return TRUE;
         }




More information about the wine-cvs mailing list