Title: [228680] releases/WebKitGTK/webkit-2.20/Source/WebCore
Revision
228680
Author
carlo...@webkit.org
Date
2018-02-19 07:16:21 -0800 (Mon, 19 Feb 2018)

Log Message

Merge r228316 - [EME][GStreamer] Add support for encrypted caps in GStreamerUtilities
https://bugs.webkit.org/show_bug.cgi?id=181990

Patch by Yacine Bandou <yacine.bandou_...@softathome.com> on 2018-02-09
Reviewed by Xabier Rodriguez-Calvar.

Add the support of encrypted caps in GStreamerUtilities.
Refactor the manner that the caps are handled, such as how to extract the resolution
from the video caps or how to check if the caps are encrypted.

The attachTrack function in PlaybackPipeline doesn't need the "structure" parameter,
it is already included in the "caps" parameter.

Replace the "mediaType" parameter by the "caps" parameter in reattachTrack function,
it allows to use the new functions that handle the caps in GStreamerUtilities.

Tests:
    media/encrypted-media/clearKey/clearKey-cenc-audio-playback-mse.html
    media/encrypted-media/clearKey/clearKey-cenc-video-playback-mse.html

* platform/graphics/gstreamer/GStreamerUtilities.cpp:
(WebCore::getVideoSizeAndFormatFromCaps): Add the support of video encrypted caps.
(WebCore::getVideoResolutionFromCaps):
(WebCore::capsMediaType):
(WebCore::doCapsHaveType):
(WebCore::areEncryptedCaps): Add a new functions in order to handle the caps properly.
* platform/graphics/gstreamer/GStreamerUtilities.h:
* platform/graphics/gstreamer/mse/AppendPipeline.cpp:
(WebCore::AppendPipeline::parseDemuxerSrcPadCaps):
* platform/graphics/gstreamer/mse/GStreamerMediaDescription.cpp:
(WebCore::GStreamerMediaDescription::codec const):
(WebCore::GStreamerMediaDescription::isVideo const):
(WebCore::GStreamerMediaDescription::isAudio const):
* platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::trackDetected):
* platform/graphics/gstreamer/mse/PlaybackPipeline.cpp:
(WebCore::PlaybackPipeline::attachTrack):
(WebCore::PlaybackPipeline::reattachTrack):
* platform/graphics/gstreamer/mse/PlaybackPipeline.h:
* platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp:
(webKitMediaSrcUpdatePresentationSize): Refactor some parts by using the new added functions.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog	2018-02-19 15:16:21 UTC (rev 228680)
@@ -1,3 +1,46 @@
+2018-02-09  Yacine Bandou  <yacine.bandou_...@softathome.com>
+
+        [EME][GStreamer] Add support for encrypted caps in GStreamerUtilities
+        https://bugs.webkit.org/show_bug.cgi?id=181990
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Add the support of encrypted caps in GStreamerUtilities.
+        Refactor the manner that the caps are handled, such as how to extract the resolution
+        from the video caps or how to check if the caps are encrypted.
+
+        The attachTrack function in PlaybackPipeline doesn't need the "structure" parameter,
+        it is already included in the "caps" parameter.
+
+        Replace the "mediaType" parameter by the "caps" parameter in reattachTrack function,
+        it allows to use the new functions that handle the caps in GStreamerUtilities.
+
+        Tests:
+            media/encrypted-media/clearKey/clearKey-cenc-audio-playback-mse.html
+            media/encrypted-media/clearKey/clearKey-cenc-video-playback-mse.html
+
+        * platform/graphics/gstreamer/GStreamerUtilities.cpp:
+        (WebCore::getVideoSizeAndFormatFromCaps): Add the support of video encrypted caps.
+        (WebCore::getVideoResolutionFromCaps):
+        (WebCore::capsMediaType):
+        (WebCore::doCapsHaveType):
+        (WebCore::areEncryptedCaps): Add a new functions in order to handle the caps properly.
+        * platform/graphics/gstreamer/GStreamerUtilities.h:
+        * platform/graphics/gstreamer/mse/AppendPipeline.cpp:
+        (WebCore::AppendPipeline::parseDemuxerSrcPadCaps):
+        * platform/graphics/gstreamer/mse/GStreamerMediaDescription.cpp:
+        (WebCore::GStreamerMediaDescription::codec const):
+        (WebCore::GStreamerMediaDescription::isVideo const):
+        (WebCore::GStreamerMediaDescription::isAudio const):
+        * platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
+        (WebCore::MediaPlayerPrivateGStreamerMSE::trackDetected):
+        * platform/graphics/gstreamer/mse/PlaybackPipeline.cpp:
+        (WebCore::PlaybackPipeline::attachTrack):
+        (WebCore::PlaybackPipeline::reattachTrack):
+        * platform/graphics/gstreamer/mse/PlaybackPipeline.h:
+        * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp:
+        (webKitMediaSrcUpdatePresentationSize): Refactor some parts by using the new added functions.
+
 2018-02-09  Philippe Normand  <pnorm...@igalia.com>
 
         [GStreamer] Layout test fast/replaced/border-radius-clip.html crashes with GStreamer-CRITICAL **: gst_segment_to_stream_time: assertion 'segment->format == format' failed in gst_segment_to_stream_time()

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -59,22 +59,72 @@
 #if ENABLE(VIDEO)
 bool getVideoSizeAndFormatFromCaps(GstCaps* caps, WebCore::IntSize& size, GstVideoFormat& format, int& pixelAspectRatioNumerator, int& pixelAspectRatioDenominator, int& stride)
 {
-    GstVideoInfo info;
-
-    gst_video_info_init(&info);
-    if (!gst_video_info_from_caps(&info, caps))
+    if (!doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
+        GST_WARNING("Failed to get the video size and format, these are not a video caps");
         return false;
+    }
 
-    format = GST_VIDEO_INFO_FORMAT(&info);
-    size.setWidth(GST_VIDEO_INFO_WIDTH(&info));
-    size.setHeight(GST_VIDEO_INFO_HEIGHT(&info));
-    pixelAspectRatioNumerator = GST_VIDEO_INFO_PAR_N(&info);
-    pixelAspectRatioDenominator = GST_VIDEO_INFO_PAR_D(&info);
-    stride = GST_VIDEO_INFO_PLANE_STRIDE(&info, 0);
+    if (areEncryptedCaps(caps)) {
+        GstStructure* structure = gst_caps_get_structure(caps, 0);
+        format = GST_VIDEO_FORMAT_ENCODED;
+        stride = 0;
+        int width = 0, height = 0;
+        gst_structure_get_int(structure, "width", &width);
+        gst_structure_get_int(structure, "height", &height);
+        if (!gst_structure_get_fraction(structure, "pixel-aspect-ratio", &pixelAspectRatioNumerator, &pixelAspectRatioDenominator)) {
+            pixelAspectRatioNumerator = 1;
+            pixelAspectRatioDenominator = 1;
+        }
 
+        size.setWidth(width);
+        size.setHeight(height);
+    } else {
+        GstVideoInfo info;
+        gst_video_info_init(&info);
+        if (!gst_video_info_from_caps(&info, caps))
+            return false;
+
+        format = GST_VIDEO_INFO_FORMAT(&info);
+        size.setWidth(GST_VIDEO_INFO_WIDTH(&info));
+        size.setHeight(GST_VIDEO_INFO_HEIGHT(&info));
+        pixelAspectRatioNumerator = GST_VIDEO_INFO_PAR_N(&info);
+        pixelAspectRatioDenominator = GST_VIDEO_INFO_PAR_D(&info);
+        stride = GST_VIDEO_INFO_PLANE_STRIDE(&info, 0);
+    }
+
     return true;
 }
 
+std::optional<FloatSize> getVideoResolutionFromCaps(const GstCaps* caps)
+{
+    if (!doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
+        GST_WARNING("Failed to get the video resolution, these are not a video caps");
+        return std::nullopt;
+    }
+
+    int width = 0, height = 0;
+    int pixelAspectRatioNumerator = 1, pixelAspectRatioDenominator = 1;
+
+    if (areEncryptedCaps(caps)) {
+        GstStructure* structure = gst_caps_get_structure(caps, 0);
+        gst_structure_get_int(structure, "width", &width);
+        gst_structure_get_int(structure, "height", &height);
+        gst_structure_get_fraction(structure, "pixel-aspect-ratio", &pixelAspectRatioNumerator, &pixelAspectRatioDenominator);
+    } else {
+        GstVideoInfo info;
+        gst_video_info_init(&info);
+        if (!gst_video_info_from_caps(&info, caps))
+            return std::nullopt;
+
+        width = GST_VIDEO_INFO_WIDTH(&info);
+        height = GST_VIDEO_INFO_HEIGHT(&info);
+        pixelAspectRatioNumerator = GST_VIDEO_INFO_PAR_N(&info);
+        pixelAspectRatioDenominator = GST_VIDEO_INFO_PAR_D(&info);
+    }
+
+    return std::make_optional(FloatSize(width, height * (static_cast<float>(pixelAspectRatioNumerator) / static_cast<float>(pixelAspectRatioDenominator))));
+}
+
 bool getSampleVideoInfo(GstSample* sample, GstVideoInfo& videoInfo)
 {
     if (!GST_IS_SAMPLE(sample))
@@ -113,6 +163,47 @@
     return buffer;
 }
 
+const char* capsMediaType(const GstCaps* caps)
+{
+    ASSERT(caps);
+    GstStructure* structure = gst_caps_get_structure(caps, 0);
+    if (!structure) {
+        GST_WARNING("caps are empty");
+        return nullptr;
+    }
+#if ENABLE(ENCRYPTED_MEDIA)
+    if (gst_structure_has_name(structure, "application/x-cenc"))
+        return gst_structure_get_string(structure, "original-media-type");
+#endif
+    return gst_structure_get_name(structure);
+}
+
+bool doCapsHaveType(const GstCaps* caps, const char* type)
+{
+    const char* mediaType = capsMediaType(caps);
+    if (!mediaType) {
+        GST_WARNING("Failed to get MediaType");
+        return false;
+    }
+    return g_str_has_prefix(mediaType, type);
+}
+
+bool areEncryptedCaps(const GstCaps* caps)
+{
+    ASSERT(caps);
+#if ENABLE(ENCRYPTED_MEDIA)
+    GstStructure* structure = gst_caps_get_structure(caps, 0);
+    if (!structure) {
+        GST_WARNING("caps are empty");
+        return false;
+    }
+    return gst_structure_has_name(structure, "application/x-cenc");
+#else
+    UNUSED_PARAM(caps);
+    return false;
+#endif
+}
+
 char* getGstBufferDataPointer(GstBuffer* buffer)
 {
     GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h	2018-02-19 15:16:21 UTC (rev 228680)
@@ -20,6 +20,7 @@
 #pragma once
 
 
+#include "FloatSize.h"
 #include <gst/gst.h>
 #include <gst/video/video-format.h>
 #include <gst/video/video-info.h>
@@ -50,14 +51,22 @@
     return true;
 }
 
+#define GST_VIDEO_CAPS_TYPE_PREFIX  "video/"
+#define GST_AUDIO_CAPS_TYPE_PREFIX  "audio/"
+#define GST_TEXT_CAPS_TYPE_PREFIX   "text/"
+
 GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate*, const gchar* name, GstPad* target);
 #if ENABLE(VIDEO)
 bool getVideoSizeAndFormatFromCaps(GstCaps*, WebCore::IntSize&, GstVideoFormat&, int& pixelAspectRatioNumerator, int& pixelAspectRatioDenominator, int& stride);
+std::optional<FloatSize> getVideoResolutionFromCaps(const GstCaps*);
 bool getSampleVideoInfo(GstSample*, GstVideoInfo&);
 #endif
 GstBuffer* createGstBuffer(GstBuffer*);
 GstBuffer* createGstBufferForData(const char* data, int length);
 char* getGstBufferDataPointer(GstBuffer*);
+const char* capsMediaType(const GstCaps*);
+bool doCapsHaveType(const GstCaps*, const char*);
+bool areEncryptedCaps(const GstCaps*);
 void mapGstBuffer(GstBuffer*, uint32_t);
 void unmapGstBuffer(GstBuffer*);
 bool initializeGStreamer();

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -27,6 +27,7 @@
 #include "GRefPtrGStreamer.h"
 #include "GStreamerEMEUtilities.h"
 #include "GStreamerMediaDescription.h"
+#include "GStreamerUtilities.h"
 #include "MediaSampleGStreamer.h"
 #include "InbandTextTrackPrivateGStreamer.h"
 #include "MediaDescription.h"
@@ -582,74 +583,36 @@
 
     m_demuxerSrcPadCaps = adoptGRef(demuxerSrcPadCaps);
     m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Unknown;
-
-    GstStructure* structure = gst_caps_get_structure(m_demuxerSrcPadCaps.get(), 0);
-    bool sizeConfigured = false;
-
-#if GST_CHECK_VERSION(1, 5, 3) && ENABLE(ENCRYPTED_MEDIA)
-    if (gst_structure_has_name(structure, "application/x-cenc")) {
+#if ENABLE(ENCRYPTED_MEDIA)
+    if (areEncryptedCaps(m_demuxerSrcPadCaps.get())) {
         // Any previous decryptor should have been removed from the pipeline by disconnectFromAppSinkFromStreamingThread()
         ASSERT(!m_decryptor);
-
+        GstStructure* structure = gst_caps_get_structure(m_demuxerSrcPadCaps.get(), 0);
         m_decryptor = GStreamerEMEUtilities::createDecryptor(gst_structure_get_string(structure, "protection-system"));
         if (!m_decryptor) {
             GST_ERROR("decryptor not found for caps: %" GST_PTR_FORMAT, m_demuxerSrcPadCaps.get());
             return;
         }
-
-        const gchar* originalMediaType = gst_structure_get_string(structure, "original-media-type");
-
-        if (!MediaPlayerPrivateGStreamerMSE::supportsCodec(originalMediaType)) {
-            m_presentationSize = WebCore::FloatSize();
-            m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Invalid;
-        } else if (g_str_has_prefix(originalMediaType, "video/")) {
-            int width = 0;
-            int height = 0;
-            float finalHeight = 0;
-
-            if (gst_structure_get_int(structure, "width", &width) && gst_structure_get_int(structure, "height", &height)) {
-                int ratioNumerator = 1;
-                int ratioDenominator = 1;
-
-                gst_structure_get_fraction(structure, "pixel-aspect-ratio", &ratioNumerator, &ratioDenominator);
-                finalHeight = height * ((float) ratioDenominator / (float) ratioNumerator);
-            }
-
-            m_presentationSize = WebCore::FloatSize(width, finalHeight);
-            m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Video;
-        } else {
-            m_presentationSize = WebCore::FloatSize();
-            if (g_str_has_prefix(originalMediaType, "audio/"))
-                m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Audio;
-            else if (g_str_has_prefix(originalMediaType, "text/"))
-                m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Text;
-        }
-        sizeConfigured = true;
     }
 #endif
-
-    if (!sizeConfigured) {
-        const char* structureName = gst_structure_get_name(structure);
-        GstVideoInfo info;
-
-        if (!MediaPlayerPrivateGStreamerMSE::supportsCodec(structureName)) {
+    const char* originalMediaType = capsMediaType(m_demuxerSrcPadCaps.get());
+    if (!MediaPlayerPrivateGStreamerMSE::supportsCodec(originalMediaType)) {
             m_presentationSize = WebCore::FloatSize();
             m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Invalid;
-        } else if (g_str_has_prefix(structureName, "video/") && gst_video_info_from_caps(&info, demuxerSrcPadCaps)) {
-            float width, height;
+    } else if (doCapsHaveType(m_demuxerSrcPadCaps.get(), GST_VIDEO_CAPS_TYPE_PREFIX)) {
+        std::optional<FloatSize> size = getVideoResolutionFromCaps(m_demuxerSrcPadCaps.get());
+        if (size.has_value())
+            m_presentationSize = size.value();
+        else
+            m_presentationSize = WebCore::FloatSize();
 
-            width = info.width;
-            height = info.height * ((float) info.par_d / (float) info.par_n);
-
-            m_presentationSize = WebCore::FloatSize(width, height);
-            m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Video;
-        } else {
-            m_presentationSize = WebCore::FloatSize();
-            if (g_str_has_prefix(structureName, "audio/"))
-                m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Audio;
-            else if (g_str_has_prefix(structureName, "text/"))
-                m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Text;
-        }
+        m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Video;
+    } else {
+        m_presentationSize = WebCore::FloatSize();
+        if (doCapsHaveType(m_demuxerSrcPadCaps.get(), GST_AUDIO_CAPS_TYPE_PREFIX))
+            m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Audio;
+        else if (doCapsHaveType(m_demuxerSrcPadCaps.get(), GST_TEXT_CAPS_TYPE_PREFIX))
+            m_streamType = WebCore::MediaSourceStreamTypeGStreamer::Text;
     }
 }
 

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -20,7 +20,7 @@
 
 #include "config.h"
 #include "GStreamerMediaDescription.h"
-
+#include "GStreamerUtilities.h"
 #include "GUniquePtrGStreamer.h"
 
 #include <gst/pbutils/pbutils.h>
@@ -33,35 +33,17 @@
 
 AtomicString GStreamerMediaDescription::codec() const
 {
-    GUniquePtr<gchar> description(gst_pb_utils_get_codec_description(m_caps.get()));
-    String codecName(description.get());
-
-    // Report "H.264 (Main Profile)" and "H.264 (High Profile)" just as "H.264" to allow changes between both variants
-    // go unnoticed to the SourceBuffer layer.
-    if (codecName.startsWith("H.264")) {
-        size_t braceStart = codecName.find(" (");
-        size_t braceEnd = codecName.find(")");
-        if (braceStart != notFound && braceEnd != notFound)
-            codecName.remove(braceStart, braceEnd-braceStart);
-    }
-
-    return codecName;
+    return m_codecName;
 }
 
 bool GStreamerMediaDescription::isVideo() const
 {
-    GstStructure* structure = gst_caps_get_structure(m_caps.get(), 0);
-    const gchar* name = gst_structure_get_name(structure);
-
-    return g_str_has_prefix(name, "video/");
+    return doCapsHaveType(m_caps.get(), GST_VIDEO_CAPS_TYPE_PREFIX);
 }
 
 bool GStreamerMediaDescription::isAudio() const
 {
-    GstStructure* structure = gst_caps_get_structure(m_caps.get(), 0);
-    const gchar* name = gst_structure_get_name(structure);
-
-    return g_str_has_prefix(name, "audio/");
+    return doCapsHaveType(m_caps.get(), GST_AUDIO_CAPS_TYPE_PREFIX);
 }
 
 bool GStreamerMediaDescription::isText() const
@@ -70,6 +52,43 @@
     return false;
 }
 
+AtomicString GStreamerMediaDescription::extractCodecName()
+{
+    GRefPtr<GstCaps> originalCaps = m_caps;
+
+    if (areEncryptedCaps(originalCaps.get())) {
+        originalCaps = adoptGRef(gst_caps_copy(originalCaps.get()));
+        GstStructure* structure = gst_caps_get_structure(originalCaps.get(), 0);
+
+        if (!gst_structure_has_field(structure, "original-media-type"))
+            return AtomicString();
+
+        gst_structure_set_name(structure, gst_structure_get_string(structure, "original-media-type"));
+        // Remove the DRM related fields from the caps.
+        for (int j = 0; j < gst_structure_n_fields(structure); ++j) {
+            const char* fieldName = gst_structure_nth_field_name(structure, j);
+
+            if (g_str_has_prefix(fieldName, "protection-system")
+                || g_str_has_prefix(fieldName, "original-media-type"))
+                gst_structure_remove_field(structure, fieldName);
+        }
+    }
+
+    GUniquePtr<gchar> description(gst_pb_utils_get_codec_description(originalCaps.get()));
+    String codecName(description.get());
+
+    // Report "H.264 (Main Profile)" and "H.264 (High Profile)" just as "H.264" to allow changes between both variants
+    // go unnoticed to the SourceBuffer layer.
+    if (codecName.startsWith("H.264")) {
+        size_t braceStart = codecName.find(" (");
+        size_t braceEnd = codecName.find(")");
+        if (braceStart != notFound && braceEnd != notFound)
+            codecName.remove(braceStart, braceEnd - braceStart);
+    }
+
+    return codecName;
+}
+
 } // namespace WebCore.
 
 #endif // USE(GSTREAMER)

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.h (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.h	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/GStreamerMediaDescription.h	2018-02-19 15:16:21 UTC (rev 228680)
@@ -26,6 +26,7 @@
 #include "MediaDescription.h"
 
 #include <gst/gst.h>
+#include <wtf/text/AtomicString.h>
 
 namespace WebCore {
 
@@ -48,9 +49,12 @@
         : MediaDescription()
         , m_caps(caps)
     {
+        m_codecName = extractCodecName();
     }
 
+    AtomicString extractCodecName();
     GRefPtr<GstCaps> m_caps;
+    AtomicString m_codecName;
 };
 
 } // namespace WebCore.

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -739,23 +739,16 @@
     ASSERT(caps);
     GST_DEBUG("track ID: %s, caps: %" GST_PTR_FORMAT, newTrack->id().string().latin1().data(), caps);
 
-    GstStructure* structure = gst_caps_get_structure(caps, 0);
-    const gchar* mediaType = gst_structure_get_name(structure);
-    GstVideoInfo info;
-
-    if (g_str_has_prefix(mediaType, "video/") && gst_video_info_from_caps(&info, caps)) {
-        float width, height;
-
-        width = info.width;
-        height = info.height * ((float) info.par_d / (float) info.par_n);
-        m_videoSize.setWidth(width);
-        m_videoSize.setHeight(height);
+    if (doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
+        std::optional<FloatSize> size = getVideoResolutionFromCaps(caps);
+        if (size.has_value())
+            m_videoSize = size.value();
     }
 
     if (firstTrackDetected)
-        m_playbackPipeline->attachTrack(appendPipeline->sourceBufferPrivate(), newTrack, structure, caps);
+        m_playbackPipeline->attachTrack(appendPipeline->sourceBufferPrivate(), newTrack, caps);
     else
-        m_playbackPipeline->reattachTrack(appendPipeline->sourceBufferPrivate(), newTrack, mediaType);
+        m_playbackPipeline->reattachTrack(appendPipeline->sourceBufferPrivate(), newTrack, caps);
 }
 
 const static HashSet<AtomicString>& codecSet()

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -162,7 +162,7 @@
         webKitMediaSrcFreeStream(m_webKitMediaSrc.get(), stream);
 }
 
-void PlaybackPipeline::attachTrack(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, RefPtr<TrackPrivateBase> trackPrivate, GstStructure* structure, GstCaps* caps)
+void PlaybackPipeline::attachTrack(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, RefPtr<TrackPrivateBase> trackPrivate, GstCaps* caps)
 {
     WebKitMediaSrc* webKitMediaSrc = m_webKitMediaSrc.get();
 
@@ -177,8 +177,7 @@
     stream->parent->priv->numberOfPads++;
     GST_OBJECT_UNLOCK(webKitMediaSrc);
 
-    const gchar* mediaType = gst_structure_get_name(structure);
-
+    const char* mediaType = capsMediaType(caps);
     GST_DEBUG_OBJECT(webKitMediaSrc, "Configured track %s: appsrc=%s, padId=%u, mediaType=%s", trackPrivate->id().string().utf8().data(), GST_ELEMENT_NAME(stream->appsrc), padId, mediaType);
 
     GUniquePtr<gchar> parserBinName(g_strdup_printf("streamparser%u", padId));
@@ -217,6 +216,7 @@
         gst_element_add_pad(stream->parser, gst_ghost_pad_new("src", pad.get()));
     } else if (!g_strcmp0(mediaType, "audio/mpeg")) {
         gint mpegversion = -1;
+        GstStructure* structure = gst_caps_get_structure(caps, 0);
         gst_structure_get_int(structure, "mpegversion", &mpegversion);
 
         GstElement* parser = nullptr;
@@ -272,17 +272,17 @@
     int signal = -1;
 
     GST_OBJECT_LOCK(webKitMediaSrc);
-    if (g_str_has_prefix(mediaType, "audio")) {
+    if (doCapsHaveType(caps, GST_AUDIO_CAPS_TYPE_PREFIX)) {
         stream->type = Audio;
         stream->parent->priv->numberOfAudioStreams++;
         signal = SIGNAL_AUDIO_CHANGED;
         stream->audioTrack = RefPtr<WebCore::AudioTrackPrivateGStreamer>(static_cast<WebCore::AudioTrackPrivateGStreamer*>(trackPrivate.get()));
-    } else if (g_str_has_prefix(mediaType, "video")) {
+    } else if (doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
         stream->type = Video;
         stream->parent->priv->numberOfVideoStreams++;
         signal = SIGNAL_VIDEO_CHANGED;
         stream->videoTrack = RefPtr<WebCore::VideoTrackPrivateGStreamer>(static_cast<WebCore::VideoTrackPrivateGStreamer*>(trackPrivate.get()));
-    } else if (g_str_has_prefix(mediaType, "text")) {
+    } else if (doCapsHaveType(caps, GST_TEXT_CAPS_TYPE_PREFIX)) {
         stream->type = Text;
         stream->parent->priv->numberOfTextStreams++;
         signal = SIGNAL_TEXT_CHANGED;
@@ -295,7 +295,7 @@
         g_signal_emit(G_OBJECT(stream->parent), webKitMediaSrcSignals[signal], 0, nullptr);
 }
 
-void PlaybackPipeline::reattachTrack(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, RefPtr<TrackPrivateBase> trackPrivate, const char* mediaType)
+void PlaybackPipeline::reattachTrack(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, RefPtr<TrackPrivateBase> trackPrivate, GstCaps* caps)
 {
     GST_DEBUG("Re-attaching track");
 
@@ -313,15 +313,15 @@
     int signal = -1;
 
     GST_OBJECT_LOCK(webKitMediaSrc);
-    if (g_str_has_prefix(mediaType, "audio")) {
+    if (doCapsHaveType(caps, GST_AUDIO_CAPS_TYPE_PREFIX)) {
         ASSERT(stream->type == Audio);
         signal = SIGNAL_AUDIO_CHANGED;
         stream->audioTrack = RefPtr<WebCore::AudioTrackPrivateGStreamer>(static_cast<WebCore::AudioTrackPrivateGStreamer*>(trackPrivate.get()));
-    } else if (g_str_has_prefix(mediaType, "video")) {
+    } else if (doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
         ASSERT(stream->type == Video);
         signal = SIGNAL_VIDEO_CHANGED;
         stream->videoTrack = RefPtr<WebCore::VideoTrackPrivateGStreamer>(static_cast<WebCore::VideoTrackPrivateGStreamer*>(trackPrivate.get()));
-    } else if (g_str_has_prefix(mediaType, "text")) {
+    } else if (doCapsHaveType(caps, GST_TEXT_CAPS_TYPE_PREFIX)) {
         ASSERT(stream->type == Text);
         signal = SIGNAL_TEXT_CHANGED;
 

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.h (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.h	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/PlaybackPipeline.h	2018-02-19 15:16:21 UTC (rev 228680)
@@ -57,8 +57,8 @@
 
     MediaSourcePrivate::AddStatus addSourceBuffer(RefPtr<SourceBufferPrivateGStreamer>);
     void removeSourceBuffer(RefPtr<SourceBufferPrivateGStreamer>);
-    void attachTrack(RefPtr<SourceBufferPrivateGStreamer>, RefPtr<TrackPrivateBase>, GstStructure*, GstCaps*);
-    void reattachTrack(RefPtr<SourceBufferPrivateGStreamer>, RefPtr<TrackPrivateBase>, const char*);
+    void attachTrack(RefPtr<SourceBufferPrivateGStreamer>, RefPtr<TrackPrivateBase>, GstCaps*);
+    void reattachTrack(RefPtr<SourceBufferPrivateGStreamer>, RefPtr<TrackPrivateBase>, GstCaps*);
     void notifyDurationChanged();
 
     // From MediaSourceGStreamer.

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp (228679 => 228680)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp	2018-02-19 15:16:12 UTC (rev 228679)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp	2018-02-19 15:16:21 UTC (rev 228680)
@@ -452,18 +452,13 @@
 
 void webKitMediaSrcUpdatePresentationSize(GstCaps* caps, Stream* stream)
 {
-    GstStructure* structure = gst_caps_get_structure(caps, 0);
-    const gchar* structureName = gst_structure_get_name(structure);
-    GstVideoInfo info;
-
     GST_OBJECT_LOCK(stream->parent);
-    if (g_str_has_prefix(structureName, "video/") && gst_video_info_from_caps(&info, caps)) {
-        float width, height;
-
-        // FIXME: Correct?.
-        width = info.width;
-        height = info.height * ((float) info.par_d / (float) info.par_n);
-        stream->presentationSize = WebCore::FloatSize(width, height);
+    if (WebCore::doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
+        std::optional<WebCore::FloatSize> size = WebCore::getVideoResolutionFromCaps(caps);
+        if (size.has_value())
+            stream->presentationSize = size.value();
+        else
+            stream->presentationSize = WebCore::FloatSize();
     } else
         stream->presentationSize = WebCore::FloatSize();
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to