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,