Corrections to support HLS

[ Merge of https://go/wvgerrit/17055 ]

There are a few bugs that need to be addressed to get HLS to work.

* Content ID in json init data is base64 encoded and needs to be decoded
  before being added to the WidevineCencHeader proto.
* Protection scheme was not set in the WidevineCencHeader proto.
* HLS initialization data should be sent as a CENC content identification
  in a license request.

b/20630275

Change-Id: Ie0ac33ac061931df6f26c0afbf3e62e5d01e5041
This commit is contained in:
Rahul Frias
2016-03-09 01:10:01 -08:00
parent ca1bd5cefc
commit cbde9109b6
4 changed files with 73 additions and 30 deletions

View File

@@ -1,5 +1,6 @@
// Copyright 2015 Google Inc. All Rights Reserved.
#include <arpa/inet.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
@@ -35,6 +36,9 @@ const std::string kJsonProvider = "provider";
const std::string kJsonContentId = "content_id";
const std::string kJsonKeyIds = "key_ids";
const uint32_t kFourCcCbc1 = 0x63626331;
const uint32_t kFourCcCbcs = 0x63626373;
const std::string kWidevinePssh = a2bs_hex(
// Widevine PSSH box
"00000042" // atom size
@@ -346,15 +350,18 @@ std::string InsertHlsAttributeInList(const std::string key,
}
struct HlsInitDataVariant {
HlsInitDataVariant(const std::string& provider, const std::string& content_id,
const std::string& key_id, bool success)
: provider_(provider), content_id_(content_id), success_(success) {
HlsInitDataVariant(CdmHlsMethod method, const std::string& provider,
const std::string& content_id, const std::string& key_id,
bool success)
: method_(method), provider_(provider), content_id_(content_id),
success_(success) {
if (key_id.size() > 0) key_ids_.push_back(key_id);
}
HlsInitDataVariant& AddKeyId(const std::string& key_id) {
key_ids_.push_back(key_id);
return *this;
}
const CdmHlsMethod method_;
const std::string provider_;
const std::string content_id_;
std::vector<std::string> key_ids_;
@@ -588,8 +595,9 @@ TEST_P(HlsConstructionTest, InitData) {
std::string uri =
GenerateHlsUriData(param.provider_, param.content_id_, param.key_ids_);
std::string value;
EXPECT_EQ(param.success_, InitializationData::ConstructWidevineInitData(
param.method_, uri, &value));
if (param.success_) {
EXPECT_TRUE(InitializationData::ConstructWidevineInitData(uri, &value));
WidevineCencHeader cenc_header;
EXPECT_TRUE(cenc_header.ParseFromString(value));
EXPECT_EQ(video_widevine_server::sdk::WidevineCencHeader_Algorithm_AESCTR,
@@ -606,28 +614,50 @@ TEST_P(HlsConstructionTest, InitData) {
EXPECT_TRUE(key_id_found);
}
EXPECT_EQ(param.provider_, cenc_header.provider());
EXPECT_EQ(param.content_id_, cenc_header.content_id());
} else {
EXPECT_FALSE(InitializationData::ConstructWidevineInitData(uri, &value));
std::vector<uint8_t> param_content_id_vec(Base64Decode(param.content_id_));
EXPECT_EQ(
std::string(param_content_id_vec.begin(), param_content_id_vec.end()),
cenc_header.content_id());
uint32_t protection_scheme = 0;
switch (param.method_) {
case kHlsMethodAes128: protection_scheme = kFourCcCbc1; break;
case kHlsMethodSampleAes: protection_scheme = kFourCcCbcs; break;
default: break;
}
EXPECT_EQ(protection_scheme, ntohl(cenc_header.protection_scheme()));
}
}
INSTANTIATE_TEST_CASE_P(
HlsTest, HlsConstructionTest,
::testing::Values(
HlsInitDataVariant("", kHlsTestContentId, kHlsTestKeyId1, false),
HlsInitDataVariant(kHlsTestProvider, "", kHlsTestKeyId1, false),
HlsInitDataVariant(kHlsTestProvider, kHlsTestContentId, "", false),
HlsInitDataVariant(kHlsTestProvider, kHlsTestContentId,
kHlsTestInvalidKeyId, false),
HlsInitDataVariant(kHlsTestProvider, kHlsTestContentId, kHlsTestKeyId1,
true),
HlsInitDataVariant(kHlsTestProvider, kHlsTestContentId, kHlsTestKeyId1,
true)
HlsInitDataVariant(kHlsMethodAes128, "", kHlsTestContentId,
kHlsTestKeyId1, false),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
"", kHlsTestKeyId1, false),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
kHlsTestContentId, "", false),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
kHlsTestContentId, kHlsTestInvalidKeyId, false),
HlsInitDataVariant(kHlsMethodNone, kHlsTestProvider, kHlsTestContentId,
kHlsTestKeyId1, false),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
kHlsTestContentId, kHlsTestKeyId1, true),
HlsInitDataVariant(kHlsMethodSampleAes, kHlsTestProvider,
kHlsTestContentId, kHlsTestKeyId1, true),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
kHlsTestContentId, kHlsTestKeyId1, true)
.AddKeyId(kHlsTestKeyId2)
.AddKeyId(kHlsTestKeyId3),
HlsInitDataVariant(kHlsTestProvider, kHlsTestContentId,
kHlsTestInvalidKeyId, true)
HlsInitDataVariant(kHlsMethodSampleAes, kHlsTestProvider,
kHlsTestContentId, kHlsTestKeyId1, true)
.AddKeyId(kHlsTestKeyId2)
.AddKeyId(kHlsTestKeyId3),
HlsInitDataVariant(kHlsMethodAes128, kHlsTestProvider,
kHlsTestContentId, kHlsTestInvalidKeyId, true)
.AddKeyId(kHlsTestKeyId1),
HlsInitDataVariant(kHlsMethodSampleAes, kHlsTestProvider,
kHlsTestContentId, kHlsTestInvalidKeyId, true)
.AddKeyId(kHlsTestKeyId1)));
TEST_F(HlsInitDataConstructionTest, InvalidUriDataFormat) {
@@ -639,7 +669,7 @@ TEST_F(HlsInitDataConstructionTest, InvalidUriDataFormat) {
reinterpret_cast<const uint8_t*>(json.data() + json.size()));
std::string value;
EXPECT_FALSE(InitializationData::ConstructWidevineInitData(
Base64Encode(json_init_data), &value));
kHlsMethodAes128, Base64Encode(json_init_data), &value));
}
TEST_F(HlsInitDataConstructionTest, InvalidUriBase64Encode) {
@@ -648,7 +678,7 @@ TEST_F(HlsInitDataConstructionTest, InvalidUriBase64Encode) {
VectorOfStrings(kHlsTestKeyId1).Generate());
std::string value;
EXPECT_FALSE(InitializationData::ConstructWidevineInitData(
kHlsTestUriDataFormat + json, &value));
kHlsMethodSampleAes, kHlsTestUriDataFormat + json, &value));
}
TEST_P(HlsParseTest, Parse) {
@@ -700,7 +730,7 @@ INSTANTIATE_TEST_CASE_P(
HlsAttributeVariant(kHlsAttributeListMethodAes128, HLS_METHOD_ATTRIBUTE,
HLS_METHOD_AES_128, true),
HlsAttributeVariant(kHlsAttributeListMethodNone, HLS_METHOD_ATTRIBUTE,
HLS_METHOD_NONE, true),
HLS_METHOD_NONE, false),
HlsAttributeVariant(kHlsAttributeListKeyFormatVersionMultiple,
HLS_KEYFORMAT_VERSIONS_ATTRIBUTE,
HLS_KEYFORMAT_VERSION_VALUE_1, true),