// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chromecast/media/cdm/chromecast_init_data.h" #include "base/logging.h" #include "media/base/bit_reader.h" #include "media/cdm/cenc_utils.h" namespace chromecast { namespace media { #define RCHECK(x) \ do { \ if (!(x)) \ return false; \ } while (0) namespace { const uint8_t kChromecastPlayreadyUuid[] = { 0x2b, 0xf8, 0x66, 0x80, 0xc6, 0xe5, 0x4e, 0x24, 0xbe, 0x23, 0x0f, 0x81, 0x5a, 0x60, 0x6e, 0xb2}; } // namespace ChromecastInitData::ChromecastInitData() { } ChromecastInitData::~ChromecastInitData() { } bool FindChromecastInitData(const std::vector& init_data, InitDataMessageType type, ChromecastInitData* chromecast_init_data_out) { // Chromecast initData assumes a CENC data format and searches for PSSH boxes // with SystemID |kChromecastPlayreadyUuid|. The PSSH box content is as // follows: // * |type| (2 bytes, InitDataMessageType) // * |data| (all remaining bytes) // Data may or may not be present and is specific to the given |type|. std::vector pssh_data; if (!::media::GetPsshData( init_data, std::vector(kChromecastPlayreadyUuid, kChromecastPlayreadyUuid + sizeof(kChromecastPlayreadyUuid)), &pssh_data)) { return false; } ::media::BitReader reader(pssh_data.data(), pssh_data.size()); uint16_t msg_type; RCHECK(reader.ReadBits(2 * 8, &msg_type)); RCHECK(msg_type < static_cast(InitDataMessageType::END)); RCHECK(msg_type == static_cast(type)); chromecast_init_data_out->type = static_cast(msg_type); chromecast_init_data_out->data.assign( pssh_data.begin() + reader.bits_read() / 8, pssh_data.end()); return true; } } // namespace media } // namespace chromecast