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

@@ -20,6 +20,7 @@ const char kDoubleQuote = '\"';
const char kLeftBracket = '[';
const char kRightBracket = ']';
const std::string kBase64String = "base64,";
const uint32_t kFourCcCbc1 = 0x63626331;
const uint32_t kFourCcCbcs = 0x63626373;
// json init data key values
@@ -63,7 +64,7 @@ InitializationData::InitializationData(const std::string& type,
} else if (is_hls()) {
std::string uri;
if (ExtractHlsAttributes(data, &hls_method_, &hls_iv_, &uri)) {
ConstructWidevineInitData(uri, &data_);
ConstructWidevineInitData(hls_method_, uri, &data_);
}
}
}
@@ -332,11 +333,16 @@ bool InitializationData::ExtractHlsAttributes(const std::string& attribute_list,
// ]
// }
bool InitializationData::ConstructWidevineInitData(
const std::string& uri, CdmInitData* init_data_proto) {
CdmHlsMethod method, const std::string& uri, CdmInitData* init_data_proto) {
if (!init_data_proto) {
LOGV("InitializationData::ConstructWidevineInitData: Invalid parameter");
return false;
}
if (method != kHlsMethodAes128 && method != kHlsMethodSampleAes) {
LOGV("InitializationData::ConstructWidevineInitData: Invalid method"
" parameter");
return false;
}
size_t pos = uri.find(kBase64String);
if (pos == std::string::npos) {
@@ -419,8 +425,12 @@ bool InitializationData::ConstructWidevineInitData(
break;
case kContentIdState:
if (tokens[i].type == JSMN_STRING) {
content_id.assign(json_string, tokens[i].start,
tokens[i].end - tokens[i].start);
std::string base64_content_id(json_string, tokens[i].start,
tokens[i].end - tokens[i].start);
std::vector<uint8_t> content_id_data =
Base64Decode(base64_content_id);
content_id.assign(reinterpret_cast<const char*>(&content_id_data[0]),
content_id_data.size());
}
state = kParseState;
break;
@@ -465,7 +475,10 @@ bool InitializationData::ConstructWidevineInitData(
}
cenc_header.set_provider(provider);
cenc_header.set_content_id(content_id);
cenc_header.set_protection_scheme(htonl(kFourCcCbcs));
if (method == kHlsMethodAes128)
cenc_header.set_protection_scheme(htonl(kFourCcCbc1));
else
cenc_header.set_protection_scheme(htonl(kFourCcCbcs));
cenc_header.SerializeToString(init_data_proto);
return true;
}