summaryrefslogtreecommitdiffstats
path: root/media/gmp-clearkey/0.1/ClearKeySession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/gmp-clearkey/0.1/ClearKeySession.cpp')
-rw-r--r--media/gmp-clearkey/0.1/ClearKeySession.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/media/gmp-clearkey/0.1/ClearKeySession.cpp b/media/gmp-clearkey/0.1/ClearKeySession.cpp
new file mode 100644
index 000000000..fb45dd2eb
--- /dev/null
+++ b/media/gmp-clearkey/0.1/ClearKeySession.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2015, Mozilla Foundation and contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "BigEndian.h"
+#include "ClearKeyDecryptionManager.h"
+#include "ClearKeySession.h"
+#include "ClearKeyUtils.h"
+#include "ClearKeyStorage.h"
+#include "psshparser/PsshParser.h"
+#include "gmp-task-utils.h"
+#include "gmp-api/gmp-decryption.h"
+#include <assert.h>
+#include <string.h>
+
+using namespace mozilla;
+
+ClearKeySession::ClearKeySession(const std::string& aSessionId,
+ GMPDecryptorCallback* aCallback,
+ GMPSessionType aSessionType)
+ : mSessionId(aSessionId)
+ , mCallback(aCallback)
+ , mSessionType(aSessionType)
+{
+ CK_LOGD("ClearKeySession ctor %p", this);
+}
+
+ClearKeySession::~ClearKeySession()
+{
+ CK_LOGD("ClearKeySession dtor %p", this);
+
+ std::vector<GMPMediaKeyInfo> key_infos;
+ for (const KeyId& keyId : mKeyIds) {
+ assert(ClearKeyDecryptionManager::Get()->HasSeenKeyId(keyId));
+ ClearKeyDecryptionManager::Get()->ReleaseKeyId(keyId);
+ key_infos.push_back(GMPMediaKeyInfo(&keyId[0], keyId.size(), kGMPUnknown));
+ }
+ mCallback->BatchedKeyStatusChanged(&mSessionId[0], mSessionId.size(),
+ key_infos.data(), key_infos.size());
+}
+
+void
+ClearKeySession::Init(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const std::string& aInitDataType,
+ const uint8_t* aInitData, uint32_t aInitDataSize)
+{
+ CK_LOGD("ClearKeySession::Init");
+
+ if (aInitDataType == "cenc") {
+ ParseCENCInitData(aInitData, aInitDataSize, mKeyIds);
+ } else if (aInitDataType == "keyids") {
+ ClearKeyUtils::ParseKeyIdsInitData(aInitData, aInitDataSize, mKeyIds);
+ } else if (aInitDataType == "webm" && aInitDataSize <= kMaxWebmInitDataSize) {
+ // "webm" initData format is simply the raw bytes of the keyId.
+ vector<uint8_t> keyId;
+ keyId.assign(aInitData, aInitData+aInitDataSize);
+ mKeyIds.push_back(keyId);
+ }
+
+ if (!mKeyIds.size()) {
+ const char message[] = "Couldn't parse init data";
+ mCallback->RejectPromise(aPromiseId, kGMPTypeError, message, strlen(message));
+ return;
+ }
+
+ mCallback->SetSessionId(aCreateSessionToken, &mSessionId[0], mSessionId.length());
+
+ mCallback->ResolvePromise(aPromiseId);
+}
+
+GMPSessionType
+ClearKeySession::Type() const
+{
+ return mSessionType;
+}
+
+void
+ClearKeySession::AddKeyId(const KeyId& aKeyId)
+{
+ mKeyIds.push_back(aKeyId);
+}