| // 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<uint8_t>& 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<uint8_t> pssh_data; |
| if (!::media::GetPsshData( |
| init_data, std::vector<uint8_t>(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<uint16_t>(InitDataMessageType::END)); |
| RCHECK(msg_type == static_cast<uint16_t>(type)); |
| |
| chromecast_init_data_out->type = static_cast<InitDataMessageType>(msg_type); |
| chromecast_init_data_out->data.assign( |
| pssh_data.begin() + reader.bits_read() / 8, pssh_data.end()); |
| return true; |
| } |
| |
| } // namespace media |
| } // namespace chromecast |