Title: [240148] trunk
Revision
240148
Author
ctur...@igalia.com
Date
2019-01-18 07:59:22 -0800 (Fri, 18 Jan 2019)

Log Message

[GStreamer][EME][ClearKey] Request keys from CDMInstance rather than passing via bus messages
https://bugs.webkit.org/show_bug.cgi?id=192229

Reviewed by Xabier Rodriguez-Calvar.

Source/WebCore:

Covered by existing tests.

* platform/encryptedmedia/clearkey/CDMClearKey.cpp:
(WebCore::parseLicenseFormat): There is a defect in some C++11
compiles where they will copy this return value since the type
doesn't exactly match. Force a move with WTFMove.
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
(WebCore::MediaPlayerPrivateGStreamerBase::dispatchDecryptionKey):
Deleted. No longer used by anything.
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h: Ditto.
* platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp:
Rename these methods to avoid "namespacing names".
(webkit_media_clear_key_decrypt_class_init):
(finalize):
(handleKeyResponse): This is a temporary fix, we need some more
reorganisation to be full driven by CDMInstance APIs for decryption.
(findAndSetKey):
(decrypt):
(webKitMediaClearKeyDecryptorFinalize): Deleted.
(webKitMediaClearKeyDecryptorHandleKeyResponse): Deleted.
(webKitMediaClearKeyDecryptorFindAndSetKey): Deleted.
(webKitMediaClearKeyDecryptorDecrypt): Deleted.
* platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: Ditto.
(webkit_media_common_encryption_decrypt_class_init):
(finalize):
(transformCaps):
(transformInPlace):
(isCDMInstanceAvailable):
(sinkEventHandler):
(queryHandler):
(changeState):
(setContext):
(webKitMediaCommonEncryptionDecryptorFinalize): Deleted.
(webkitMediaCommonEncryptionDecryptTransformCaps): Deleted.
(webkitMediaCommonEncryptionDecryptTransformInPlace): Deleted.
(webkitMediaCommonEncryptionDecryptIsCDMInstanceAvailable): Deleted.
(webkitMediaCommonEncryptionDecryptSinkEventHandler): Deleted.
(webkitMediaCommonEncryptionDecryptorQueryHandler): Deleted.
(webKitMediaCommonEncryptionDecryptorChangeState): Deleted.
(webKitMediaCommonEncryptionDecryptorSetContext): Deleted.
* platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h:
* platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::attemptToDecryptWithLocalInstance):
Deleted. No longer passing key information over bus messages.
* platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:

Tools:

* MiniBrowser/wpe/main.cpp:
(main): Enable encrypted-media by default.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (240147 => 240148)


--- trunk/Source/WebCore/ChangeLog	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/ChangeLog	2019-01-18 15:59:22 UTC (rev 240148)
@@ -1,3 +1,56 @@
+2019-01-18  Charlie Turner  <ctur...@igalia.com>
+
+        [GStreamer][EME][ClearKey] Request keys from CDMInstance rather than passing via bus messages
+        https://bugs.webkit.org/show_bug.cgi?id=192229
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Covered by existing tests.
+
+        * platform/encryptedmedia/clearkey/CDMClearKey.cpp:
+        (WebCore::parseLicenseFormat): There is a defect in some C++11
+        compiles where they will copy this return value since the type
+        doesn't exactly match. Force a move with WTFMove.
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
+        (WebCore::MediaPlayerPrivateGStreamerBase::dispatchDecryptionKey):
+        Deleted. No longer used by anything.
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h: Ditto.
+        * platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp:
+        Rename these methods to avoid "namespacing names".
+        (webkit_media_clear_key_decrypt_class_init):
+        (finalize):
+        (handleKeyResponse): This is a temporary fix, we need some more
+        reorganisation to be full driven by CDMInstance APIs for decryption.
+        (findAndSetKey):
+        (decrypt):
+        (webKitMediaClearKeyDecryptorFinalize): Deleted.
+        (webKitMediaClearKeyDecryptorHandleKeyResponse): Deleted.
+        (webKitMediaClearKeyDecryptorFindAndSetKey): Deleted.
+        (webKitMediaClearKeyDecryptorDecrypt): Deleted.
+        * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: Ditto.
+        (webkit_media_common_encryption_decrypt_class_init):
+        (finalize):
+        (transformCaps):
+        (transformInPlace):
+        (isCDMInstanceAvailable):
+        (sinkEventHandler):
+        (queryHandler):
+        (changeState):
+        (setContext):
+        (webKitMediaCommonEncryptionDecryptorFinalize): Deleted.
+        (webkitMediaCommonEncryptionDecryptTransformCaps): Deleted.
+        (webkitMediaCommonEncryptionDecryptTransformInPlace): Deleted.
+        (webkitMediaCommonEncryptionDecryptIsCDMInstanceAvailable): Deleted.
+        (webkitMediaCommonEncryptionDecryptSinkEventHandler): Deleted.
+        (webkitMediaCommonEncryptionDecryptorQueryHandler): Deleted.
+        (webKitMediaCommonEncryptionDecryptorChangeState): Deleted.
+        (webKitMediaCommonEncryptionDecryptorSetContext): Deleted.
+        * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h:
+        * platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
+        (WebCore::MediaPlayerPrivateGStreamerMSE::attemptToDecryptWithLocalInstance):
+        Deleted. No longer passing key information over bus messages.
+        * platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:
+
 2019-01-18  Zalan Bujtas  <za...@apple.com>
 
         [LFC][BFC][MarginCollapsing] Collapsing through should not ignore floats.

Modified: trunk/Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp (240147 => 240148)


--- trunk/Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -124,8 +124,7 @@
         });
     if (!validFormat)
         return WTF::nullopt;
-
-    return decodedKeys;
+    return WTFMove(decodedKeys);
 }
 
 static bool parseLicenseReleaseAcknowledgementFormat(const JSON::Object& root)

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -1254,13 +1254,6 @@
     GST_DEBUG("attempting to decrypt, event handled %s", boolForPrinting(eventHandled));
 }
 
-void MediaPlayerPrivateGStreamerBase::dispatchDecryptionKey(GstBuffer* buffer)
-{
-    bool eventHandled = gst_element_send_event(pipeline(), gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM_OOB,
-        gst_structure_new("drm-cipher", "key", GST_TYPE_BUFFER, buffer, nullptr)));
-    GST_TRACE("emitted decryption cipher key on pipeline, event handled %s", boolForPrinting(eventHandled));
-}
-
 void MediaPlayerPrivateGStreamerBase::handleProtectionEvent(GstEvent* event)
 {
     if (m_handledProtectionEvents.contains(GST_EVENT_SEQNUM(event))) {

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h	2019-01-18 15:59:22 UTC (rev 240148)
@@ -148,7 +148,6 @@
 #if ENABLE(ENCRYPTED_MEDIA)
     void cdmInstanceAttached(CDMInstance&) override;
     void cdmInstanceDetached(CDMInstance&) override;
-    void dispatchDecryptionKey(GstBuffer*);
     void handleProtectionEvent(GstEvent*);
     virtual void attemptToDecryptWithLocalInstance();
     void attemptToDecryptWithInstance(CDMInstance&) final;

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitClearKeyDecryptorGStreamer.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -24,6 +24,7 @@
 
 #if ENABLE(ENCRYPTED_MEDIA) && USE(GSTREAMER)
 
+#include "CDMClearKey.h"
 #include "GStreamerCommon.h"
 #include "GStreamerEMEUtilities.h"
 #include <gcrypt.h>
@@ -30,22 +31,19 @@
 #include <gst/base/gstbytereader.h>
 #include <wtf/RunLoop.h>
 
+using namespace WebCore;
+
 #define CLEARKEY_SIZE 16
 
-struct Key {
-    GRefPtr<GstBuffer> keyID;
-    GRefPtr<GstBuffer> keyValue;
-};
-
 #define WEBKIT_MEDIA_CK_DECRYPT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_MEDIA_CK_DECRYPT, WebKitMediaClearKeyDecryptPrivate))
 struct _WebKitMediaClearKeyDecryptPrivate {
-    Vector<Key> keys;
+    RefPtr<CDMInstanceClearKey> cdmInstance;
     gcry_cipher_hd_t handle;
 };
 
-static void webKitMediaClearKeyDecryptorFinalize(GObject*);
-static gboolean webKitMediaClearKeyDecryptorHandleKeyResponse(WebKitMediaCommonEncryptionDecrypt* self, GstEvent*);
-static gboolean webKitMediaClearKeyDecryptorDecrypt(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* iv, GstBuffer* keyid, GstBuffer* sample, unsigned subSamplesCount, GstBuffer* subSamples);
+static void finalize(GObject*);
+static bool handleKeyResponse(WebKitMediaCommonEncryptionDecrypt* self, RefPtr<CDMInstance>);
+static bool decrypt(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* iv, GstBuffer* keyid, GstBuffer* sample, unsigned subSamplesCount, GstBuffer* subSamples);
 
 GST_DEBUG_CATEGORY_STATIC(webkit_media_clear_key_decrypt_debug_category);
 #define GST_CAT_DEFAULT webkit_media_clear_key_decrypt_debug_category
@@ -69,7 +67,7 @@
 static void webkit_media_clear_key_decrypt_class_init(WebKitMediaClearKeyDecryptClass* klass)
 {
     GObjectClass* gobjectClass = G_OBJECT_CLASS(klass);
-    gobjectClass->finalize = webKitMediaClearKeyDecryptorFinalize;
+    gobjectClass->finalize = finalize;
 
     GstElementClass* elementClass = GST_ELEMENT_CLASS(klass);
     gst_element_class_add_pad_template(elementClass, gst_static_pad_template_get(&sinkTemplate));
@@ -85,9 +83,9 @@
         "webkitclearkey", 0, "ClearKey decryptor");
 
     WebKitMediaCommonEncryptionDecryptClass* cencClass = WEBKIT_MEDIA_CENC_DECRYPT_CLASS(klass);
-    cencClass->protectionSystemId = WebCore::GStreamerEMEUtilities::s_ClearKeyUUID;
-    cencClass->handleKeyResponse = GST_DEBUG_FUNCPTR(webKitMediaClearKeyDecryptorHandleKeyResponse);
-    cencClass->decrypt = GST_DEBUG_FUNCPTR(webKitMediaClearKeyDecryptorDecrypt);
+    cencClass->protectionSystemId = GStreamerEMEUtilities::s_ClearKeyUUID;
+    cencClass->handleKeyResponse = GST_DEBUG_FUNCPTR(handleKeyResponse);
+    cencClass->decrypt = GST_DEBUG_FUNCPTR(decrypt);
 
     g_type_class_add_private(klass, sizeof(WebKitMediaClearKeyDecryptPrivate));
 }
@@ -104,7 +102,7 @@
     }
 }
 
-static void webKitMediaClearKeyDecryptorFinalize(GObject* object)
+static void finalize(GObject* object)
 {
     WebKitMediaClearKeyDecrypt* self = WEBKIT_MEDIA_CK_DECRYPT(object);
     WebKitMediaClearKeyDecryptPrivate* priv = self->priv;
@@ -114,65 +112,30 @@
     GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
 }
 
-static gboolean webKitMediaClearKeyDecryptorHandleKeyResponse(WebKitMediaCommonEncryptionDecrypt* self, GstEvent* event)
+static bool handleKeyResponse(WebKitMediaCommonEncryptionDecrypt* self, RefPtr<CDMInstance> cdmInstance)
 {
     WebKitMediaClearKeyDecryptPrivate* priv = WEBKIT_MEDIA_CK_DECRYPT_GET_PRIVATE(WEBKIT_MEDIA_CK_DECRYPT(self));
-    const GstStructure* structure = gst_event_get_structure(event);
-
-    // Demand the `drm-cipher-clearkey` GstStructure.
-    if (!gst_structure_has_name(structure, "drm-cipher-clearkey"))
-        return FALSE;
-
-    // Retrieve the `key-ids` GStreamer value list.
-    const GValue* keyIDsList = gst_structure_get_value(structure, "key-ids");
-    ASSERT(keyIDsList && GST_VALUE_HOLDS_LIST(keyIDsList));
-    unsigned keyIDsListSize = gst_value_list_get_size(keyIDsList);
-
-    // Retrieve the `key-values` GStreamer value list.
-    const GValue* keyValuesList = gst_structure_get_value(structure, "key-values");
-    ASSERT(keyValuesList && GST_VALUE_HOLDS_LIST(keyValuesList));
-    unsigned keyValuesListSize = gst_value_list_get_size(keyValuesList);
-
-    // Bail if somehow the two lists don't match in size.
-    if (keyIDsListSize != keyValuesListSize)
-        return FALSE;
-
-    // Clear out the previous list of keys.
-    priv->keys.clear();
-
-    // Append the retrieved GstBuffer objects containing each key's ID and value to the list of Key objects.
-    for (unsigned i = 0; i < keyIDsListSize; ++i) {
-        GRefPtr<GstBuffer> keyIDBuffer(gst_value_get_buffer(gst_value_list_get_value(keyIDsList, i)));
-        GRefPtr<GstBuffer> keyValueBuffer(gst_value_get_buffer(gst_value_list_get_value(keyValuesList, i)));
-        priv->keys.append(Key { WTFMove(keyIDBuffer), WTFMove(keyValueBuffer) });
-    }
-
-    return TRUE;
+    priv->cdmInstance = downcast<CDMInstanceClearKey>(cdmInstance.get());
+    return priv->cdmInstance;
 }
 
-static gboolean webKitMediaClearKeyDecryptorFindAndSetKey(WebKitMediaClearKeyDecryptPrivate* priv, RefPtr<WebCore::GstMappedBuffer>&& keyIDBuffer)
+static bool findAndSetKey(WebKitMediaClearKeyDecryptPrivate* priv, const Ref<SharedBuffer>& keyID)
 {
-    GRefPtr<GstBuffer> keyBuffer;
-    for (auto& key : priv->keys) {
-        if (key.keyID.get() == *keyIDBuffer) {
-            keyBuffer = key.keyValue;
+    RefPtr<SharedBuffer> keyValue;
+    for (const auto& key : priv->cdmInstance->keys()) {
+        if (*key.keyIDData == keyID) {
+            keyValue = key.keyValueData;
             break;
         }
     }
 
-    if (!keyBuffer) {
-        GST_ERROR_OBJECT(priv, "Failed to find an appropriate key buffer");
+    if (!keyValue) {
+        GST_ERROR_OBJECT(priv, "failed to find a decryption key");
         return false;
     }
 
-    auto mappedKeyValueBuffer = WebCore::GstMappedBuffer::create(keyBuffer.get(), GST_MAP_READ);
-    if (!mappedKeyValueBuffer) {
-        GST_ERROR_OBJECT(priv, "Failed to map decryption key");
-        return false;
-    }
-
-    ASSERT(mappedKeyValueBuffer->size() == CLEARKEY_SIZE);
-    if (gcry_error_t error = gcry_cipher_setkey(priv->handle, mappedKeyValueBuffer->data(), mappedKeyValueBuffer->size())) {
+    ASSERT(keyValue->size() == CLEARKEY_SIZE);
+    if (gcry_error_t error = gcry_cipher_setkey(priv->handle, keyValue->data(), keyValue->size())) {
         GST_ERROR_OBJECT(priv, "gcry_cipher_setkey failed: %s", gpg_strerror(error));
         return false;
     }
@@ -180,17 +143,16 @@
     return true;
 }
 
-static gboolean webKitMediaClearKeyDecryptorDecrypt(WebKitMediaCommonEncryptionDecrypt* self, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subSampleCount, GstBuffer* subSamplesBuffer)
+static bool decrypt(WebKitMediaCommonEncryptionDecrypt* self, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subSampleCount, GstBuffer* subSamplesBuffer)
 {
-    // Check ivBuffer isn't null.
     if (!ivBuffer) {
-        GST_ERROR_OBJECT(self, "Error, the ivBuffer is null");
+        GST_ERROR_OBJECT(self, "no IV buffer");
         return false;
     }
 
     auto mappedIVBuffer = WebCore::GstMappedBuffer::create(ivBuffer, GST_MAP_READ);
     if (!mappedIVBuffer) {
-        GST_ERROR_OBJECT(self, "Failed to map IV");
+        GST_ERROR_OBJECT(self, "failed to map IV buffer");
         return false;
     }
 
@@ -210,7 +172,6 @@
         return false;
     }
 
-    // Check buffer isn't null.
     if (!buffer) {
         GST_ERROR_OBJECT(self, "No buffer to decrypt");
         return false;
@@ -228,7 +189,7 @@
         return false;
     }
 
-    webKitMediaClearKeyDecryptorFindAndSetKey(priv, WTFMove(mappedKeyIdBuffer));
+    findAndSetKey(priv, mappedKeyIdBuffer->createSharedBuffer());
 
     unsigned position = 0;
     unsigned sampleIndex = 0;

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -26,7 +26,7 @@
 #if ENABLE(ENCRYPTED_MEDIA) && USE(GSTREAMER)
 
 #include "GStreamerCommon.h"
-#include <CDMInstance.h>
+#include "GStreamerEMEUtilities.h"
 #include <wtf/Condition.h>
 #include <wtf/PrintStream.h>
 #include <wtf/RunLoop.h>
@@ -37,21 +37,22 @@
 struct _WebKitMediaCommonEncryptionDecryptPrivate {
     GRefPtr<GstEvent> protectionEvent;
     RefPtr<CDMInstance> cdmInstance;
-    bool keyReceived;
+    bool keyReceived { false };
     bool waitingForKey { false };
     Lock mutex;
     Condition condition;
 };
 
-static GstStateChangeReturn webKitMediaCommonEncryptionDecryptorChangeState(GstElement*, GstStateChange transition);
-static void webKitMediaCommonEncryptionDecryptorSetContext(GstElement*, GstContext*);
-static void webKitMediaCommonEncryptionDecryptorFinalize(GObject*);
-static GstCaps* webkitMediaCommonEncryptionDecryptTransformCaps(GstBaseTransform*, GstPadDirection, GstCaps*, GstCaps*);
-static GstFlowReturn webkitMediaCommonEncryptionDecryptTransformInPlace(GstBaseTransform*, GstBuffer*);
-static gboolean webkitMediaCommonEncryptionDecryptSinkEventHandler(GstBaseTransform*, GstEvent*);
-static gboolean webkitMediaCommonEncryptionDecryptorQueryHandler(GstBaseTransform*, GstPadDirection, GstQuery*);
-static bool webkitMediaCommonEncryptionDecryptIsCDMInstanceAvailable(WebKitMediaCommonEncryptionDecrypt*);
+static GstStateChangeReturn changeState(GstElement*, GstStateChange transition);
+static void finalize(GObject*);
+static GstCaps* transformCaps(GstBaseTransform*, GstPadDirection, GstCaps*, GstCaps*);
+static GstFlowReturn transformInPlace(GstBaseTransform*, GstBuffer*);
+static gboolean sinkEventHandler(GstBaseTransform*, GstEvent*);
+static gboolean queryHandler(GstBaseTransform*, GstPadDirection, GstQuery*);
+static bool isCDMInstanceAvailable(WebKitMediaCommonEncryptionDecrypt*);
+static void setContext(GstElement*, GstContext*);
 
+
 GST_DEBUG_CATEGORY_STATIC(webkit_media_common_encryption_decrypt_debug_category);
 #define GST_CAT_DEFAULT webkit_media_common_encryption_decrypt_debug_category
 
@@ -61,21 +62,21 @@
 static void webkit_media_common_encryption_decrypt_class_init(WebKitMediaCommonEncryptionDecryptClass* klass)
 {
     GObjectClass* gobjectClass = G_OBJECT_CLASS(klass);
-    gobjectClass->finalize = webKitMediaCommonEncryptionDecryptorFinalize;
+    gobjectClass->finalize = finalize;
 
     GST_DEBUG_CATEGORY_INIT(webkit_media_common_encryption_decrypt_debug_category,
         "webkitcenc", 0, "Common Encryption base class");
 
     GstElementClass* elementClass = GST_ELEMENT_CLASS(klass);
-    elementClass->change_state = GST_DEBUG_FUNCPTR(webKitMediaCommonEncryptionDecryptorChangeState);
-    elementClass->set_context = GST_DEBUG_FUNCPTR(webKitMediaCommonEncryptionDecryptorSetContext);
+    elementClass->change_state = GST_DEBUG_FUNCPTR(changeState);
+    elementClass->set_context = GST_DEBUG_FUNCPTR(setContext);
 
     GstBaseTransformClass* baseTransformClass = GST_BASE_TRANSFORM_CLASS(klass);
-    baseTransformClass->transform_ip = GST_DEBUG_FUNCPTR(webkitMediaCommonEncryptionDecryptTransformInPlace);
-    baseTransformClass->transform_caps = GST_DEBUG_FUNCPTR(webkitMediaCommonEncryptionDecryptTransformCaps);
+    baseTransformClass->transform_ip = GST_DEBUG_FUNCPTR(transformInPlace);
+    baseTransformClass->transform_caps = GST_DEBUG_FUNCPTR(transformCaps);
     baseTransformClass->transform_ip_on_passthrough = FALSE;
-    baseTransformClass->sink_event = GST_DEBUG_FUNCPTR(webkitMediaCommonEncryptionDecryptSinkEventHandler);
-    baseTransformClass->query = GST_DEBUG_FUNCPTR(webkitMediaCommonEncryptionDecryptorQueryHandler);
+    baseTransformClass->sink_event = GST_DEBUG_FUNCPTR(sinkEventHandler);
+    baseTransformClass->query = GST_DEBUG_FUNCPTR(queryHandler);
 
     g_type_class_add_private(klass, sizeof(WebKitMediaCommonEncryptionDecryptPrivate));
 }
@@ -93,7 +94,7 @@
     gst_base_transform_set_gap_aware(base, FALSE);
 }
 
-static void webKitMediaCommonEncryptionDecryptorFinalize(GObject* object)
+static void finalize(GObject* object)
 {
     WebKitMediaCommonEncryptionDecrypt* self = WEBKIT_MEDIA_CENC_DECRYPT(object);
     WebKitMediaCommonEncryptionDecryptPrivate* priv = self->priv;
@@ -102,7 +103,7 @@
     GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
 }
 
-static GstCaps* webkitMediaCommonEncryptionDecryptTransformCaps(GstBaseTransform* base, GstPadDirection direction, GstCaps* caps, GstCaps* filter)
+static GstCaps* transformCaps(GstBaseTransform* base, GstPadDirection direction, GstCaps* caps, GstCaps* filter)
 {
     if (direction == GST_PAD_UNKNOWN)
         return nullptr;
@@ -197,7 +198,7 @@
     return transformedCaps;
 }
 
-static GstFlowReturn webkitMediaCommonEncryptionDecryptTransformInPlace(GstBaseTransform* base, GstBuffer* buffer)
+static GstFlowReturn transformInPlace(GstBaseTransform* base, GstBuffer* buffer)
 {
     WebKitMediaCommonEncryptionDecrypt* self = WEBKIT_MEDIA_CENC_DECRYPT(base);
     WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(self);
@@ -302,7 +303,7 @@
     return GST_FLOW_OK;
 }
 
-static bool webkitMediaCommonEncryptionDecryptIsCDMInstanceAvailable(WebKitMediaCommonEncryptionDecrypt* self)
+static bool isCDMInstanceAvailable(WebKitMediaCommonEncryptionDecrypt* self)
 {
     WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(self);
 
@@ -317,19 +318,22 @@
         // requests are useful here.
         if (context) {
             const GValue* value = gst_structure_get_value(gst_context_get_structure(context.get()), "cdm-instance");
-            priv->cdmInstance = value ? reinterpret_cast<CDMInstance*>(g_value_get_pointer(value)) : nullptr;
+            // Capture the CDMInstance into a separate variable to avoid missing a refcount.
+            CDMInstance* instance = value ? reinterpret_cast<CDMInstance*>(g_value_get_pointer(value)) : nullptr;
+            // ... And force a refcount bump using operator=.
+            priv->cdmInstance = instance;
             if (priv->cdmInstance)
-                GST_DEBUG_OBJECT(self, "received new CDMInstance %p", priv->cdmInstance.get());
+                GST_DEBUG_OBJECT(self, "received a new CDM instance %p, refcount %u", priv->cdmInstance.get(), priv->cdmInstance->refCount());
             else
-                GST_TRACE_OBJECT(self, "former instance was detached");
+                GST_TRACE_OBJECT(self, "CDM instance was detached");
         }
     }
 
-    GST_TRACE_OBJECT(self, "CDMInstance available %s", boolForPrinting(priv->cdmInstance.get()));
+    GST_TRACE_OBJECT(self, "CDM instance available %s", boolForPrinting(priv->cdmInstance.get()));
     return priv->cdmInstance;
 }
 
-static gboolean webkitMediaCommonEncryptionDecryptSinkEventHandler(GstBaseTransform* trans, GstEvent* event)
+static gboolean sinkEventHandler(GstBaseTransform* trans, GstEvent* event)
 {
     WebKitMediaCommonEncryptionDecrypt* self = WEBKIT_MEDIA_CENC_DECRYPT(trans);
     WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(self);
@@ -345,13 +349,13 @@
         // events will not be handled by the demuxer, so the must be
         // handled in here.
         LockHolder locker(priv->mutex);
-        if (!webkitMediaCommonEncryptionDecryptIsCDMInstanceAvailable(self)) {
+        if (!isCDMInstanceAvailable(self)) {
             GST_ERROR_OBJECT(self, "No CDM instance available");
             result = FALSE;
             break;
         }
 
-        if (klass->handleKeyResponse(self, event)) {
+        if (klass->handleKeyResponse(self, priv->cdmInstance)) {
             GST_DEBUG_OBJECT(self, "key received");
             priv->keyReceived = true;
             priv->condition.notifyOne();
@@ -369,7 +373,7 @@
     return result;
 }
 
-static gboolean webkitMediaCommonEncryptionDecryptorQueryHandler(GstBaseTransform* trans, GstPadDirection direction, GstQuery* query)
+static gboolean queryHandler(GstBaseTransform* trans, GstPadDirection direction, GstQuery* query)
 {
     if (gst_structure_has_name(gst_query_get_structure(query), "any-decryptor-waiting-for-key")) {
         WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(trans);
@@ -379,7 +383,7 @@
     return GST_BASE_TRANSFORM_CLASS(parent_class)->query(trans, direction, query);
 }
 
-static GstStateChangeReturn webKitMediaCommonEncryptionDecryptorChangeState(GstElement* element, GstStateChange transition)
+static GstStateChangeReturn changeState(GstElement* element, GstStateChange transition)
 {
     WebKitMediaCommonEncryptionDecrypt* self = WEBKIT_MEDIA_CENC_DECRYPT(element);
     WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(self);
@@ -400,7 +404,7 @@
     return result;
 }
 
-static void webKitMediaCommonEncryptionDecryptorSetContext(GstElement* element, GstContext* context)
+static void setContext(GstElement* element, GstContext* context)
 {
     WebKitMediaCommonEncryptionDecrypt* self = WEBKIT_MEDIA_CENC_DECRYPT(element);
     WebKitMediaCommonEncryptionDecryptPrivate* priv = WEBKIT_MEDIA_CENC_DECRYPT_GET_PRIVATE(self);

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h	2019-01-18 15:59:22 UTC (rev 240148)
@@ -24,6 +24,7 @@
 
 #if ENABLE(ENCRYPTED_MEDIA) && USE(GSTREAMER)
 
+#include <CDMInstance.h>
 #include <gst/base/gstbasetransform.h>
 #include <gst/gst.h>
 
@@ -53,8 +54,8 @@
     GstBaseTransformClass parentClass;
 
     const char* protectionSystemId;
-    gboolean (*handleKeyResponse)(WebKitMediaCommonEncryptionDecrypt*, GstEvent* event);
-    gboolean (*decrypt)(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subSamplesCount, GstBuffer* subSamplesBuffer);
+    bool (*handleKeyResponse)(WebKitMediaCommonEncryptionDecrypt*, RefPtr<WebCore::CDMInstance>);
+    bool (*decrypt)(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subSamplesCount, GstBuffer* subSamplesBuffer);
 };
 
 G_END_DECLS

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -55,11 +55,6 @@
 #include <wtf/text/AtomicString.h>
 #include <wtf/text/AtomicStringHash.h>
 
-#if ENABLE(ENCRYPTED_MEDIA)
-#include "CDMClearKey.h"
-#include "SharedBuffer.h"
-#endif
-
 static const char* dumpReadyState(WebCore::MediaPlayer::ReadyState readyState)
 {
     switch (readyState) {
@@ -908,42 +903,6 @@
     return result;
 }
 
-#if ENABLE(ENCRYPTED_MEDIA)
-void MediaPlayerPrivateGStreamerMSE::attemptToDecryptWithLocalInstance()
-{
-    if (is<CDMInstanceClearKey>(*m_cdmInstance)) {
-        auto& clearkeyCDMInstance = downcast<CDMInstanceClearKey>(*m_cdmInstance);
-        if (clearkeyCDMInstance.keys().isEmpty())
-            return;
-
-        GValue keyIDList = G_VALUE_INIT, keyValueList = G_VALUE_INIT;
-        g_value_init(&keyIDList, GST_TYPE_LIST);
-        g_value_init(&keyValueList, GST_TYPE_LIST);
-
-        auto appendBuffer =
-            [](GValue* valueList, const SharedBuffer& buffer)
-            {
-                GValue* bufferValue = g_new0(GValue, 1);
-                g_value_init(bufferValue, GST_TYPE_BUFFER);
-                gst_value_take_buffer(bufferValue,
-                    gst_buffer_new_wrapped(g_memdup(buffer.data(), buffer.size()), buffer.size()));
-                gst_value_list_append_and_take_value(valueList, bufferValue);
-            };
-
-        for (auto& key : clearkeyCDMInstance.keys()) {
-            appendBuffer(&keyIDList, *key.keyIDData);
-            appendBuffer(&keyValueList, *key.keyValueData);
-        }
-
-        GUniquePtr<GstStructure> structure(gst_structure_new_empty("drm-cipher-clearkey"));
-        gst_structure_set_value(structure.get(), "key-ids", &keyIDList);
-        gst_structure_set_value(structure.get(), "key-values", &keyValueList);
-
-        gst_element_send_event(m_playbackPipeline->pipeline(), gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM_OOB, structure.release()));
-    }
-}
-#endif
-
 } // namespace WebCore.
 
 #endif // USE(GSTREAMER)

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h (240147 => 240148)


--- trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h	2019-01-18 15:59:22 UTC (rev 240148)
@@ -85,10 +85,6 @@
     static bool supportsCodec(String codec);
     static bool supportsAllCodecs(const Vector<String>& codecs);
 
-#if ENABLE(ENCRYPTED_MEDIA)
-    void attemptToDecryptWithLocalInstance() final;
-#endif
-
 private:
     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);

Modified: trunk/Tools/ChangeLog (240147 => 240148)


--- trunk/Tools/ChangeLog	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Tools/ChangeLog	2019-01-18 15:59:22 UTC (rev 240148)
@@ -1,3 +1,13 @@
+2019-01-18  Charlie Turner  <ctur...@igalia.com>
+
+        [GStreamer][EME][ClearKey] Request keys from CDMInstance rather than passing via bus messages
+        https://bugs.webkit.org/show_bug.cgi?id=192229
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        * MiniBrowser/wpe/main.cpp:
+        (main): Enable encrypted-media by default.
+
 2019-01-18  Philippe Normand  <pnorm...@igalia.com>
 
         [Flatpak] Missing KeyboardInterrupt exception handler

Modified: trunk/Tools/MiniBrowser/wpe/main.cpp (240147 => 240148)


--- trunk/Tools/MiniBrowser/wpe/main.cpp	2019-01-18 15:40:26 UTC (rev 240147)
+++ trunk/Tools/MiniBrowser/wpe/main.cpp	2019-01-18 15:59:22 UTC (rev 240148)
@@ -177,6 +177,7 @@
         "enable-developer-extras", TRUE,
         "enable-webgl", TRUE,
         "enable-media-stream", TRUE,
+        "enable-encrypted-media", TRUE,
         nullptr);
 
     auto* webView = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to