// Copyright (c) 2012 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 "media/mp4/cenc.h" #include <cstring> #include "media/mp4/box_reader.h" #include "media/mp4/rcheck.h" namespace media { namespace mp4 { FrameCENCInfo::FrameCENCInfo() {} FrameCENCInfo::~FrameCENCInfo() {} bool FrameCENCInfo::Parse(int iv_size, BufferReader* reader) { const int kEntrySize = 6; // Mandated by CENC spec RCHECK(iv_size == 8 || iv_size == 16); memset(iv, 0, sizeof(iv)); for (int i = 0; i < iv_size; i++) RCHECK(reader->Read1(&iv[i])); if (!reader->HasBytes(1)) return true; uint16 subsample_count; RCHECK(reader->Read2(&subsample_count) && reader->HasBytes(subsample_count * kEntrySize)); subsamples.resize(subsample_count); for (int i = 0; i < subsample_count; i++) { uint16 clear_bytes; uint32 cypher_bytes; RCHECK(reader->Read2(&clear_bytes) && reader->Read4(&cypher_bytes)); subsamples[i].clear_bytes = clear_bytes; subsamples[i].cypher_bytes = cypher_bytes; } return true; } bool FrameCENCInfo::GetTotalSizeOfSubsamples(size_t* total_size) const { size_t size = 0; for (size_t i = 0; i < subsamples.size(); i++) { size += subsamples[i].clear_bytes; RCHECK(size >= subsamples[i].clear_bytes); // overflow size += subsamples[i].cypher_bytes; RCHECK(size >= subsamples[i].cypher_bytes); // overflow } *total_size = size; return true; } } // namespace mp4 } // namespace media