// 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/base/decoder_buffer.h" #include "base/logging.h" #include "media/base/buffers.h" #include "media/base/decrypt_config.h" namespace media { DecoderBuffer::DecoderBuffer(int size) : size_(size), side_data_size_(0) { Initialize(); } DecoderBuffer::DecoderBuffer(const uint8* data, int size, const uint8* side_data, int side_data_size) : size_(size), side_data_size_(side_data_size) { if (!data) { CHECK_EQ(size_, 0); CHECK(!side_data); return; } Initialize(); memcpy(data_.get(), data, size_); if (side_data) memcpy(side_data_.get(), side_data, side_data_size_); } DecoderBuffer::~DecoderBuffer() {} void DecoderBuffer::Initialize() { CHECK_GE(size_, 0); data_.reset(reinterpret_cast<uint8*>( base::AlignedAlloc(size_ + kPaddingSize, kAlignmentSize))); memset(data_.get() + size_, 0, kPaddingSize); if (side_data_size_ > 0) { side_data_.reset(reinterpret_cast<uint8*>( base::AlignedAlloc(side_data_size_ + kPaddingSize, kAlignmentSize))); memset(side_data_.get() + side_data_size_, 0, kPaddingSize); } splice_timestamp_ = kNoTimestamp(); } // static scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data, int data_size) { // If you hit this CHECK you likely have a bug in a demuxer. Go fix it. CHECK(data); return make_scoped_refptr(new DecoderBuffer(data, data_size, NULL, 0)); } // static scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data, int data_size, const uint8* side_data, int side_data_size) { // If you hit this CHECK you likely have a bug in a demuxer. Go fix it. CHECK(data); CHECK(side_data); return make_scoped_refptr(new DecoderBuffer(data, data_size, side_data, side_data_size)); } // static scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() { return make_scoped_refptr(new DecoderBuffer(NULL, 0, NULL, 0)); } std::string DecoderBuffer::AsHumanReadableString() { if (end_of_stream()) { return "end of stream"; } std::ostringstream s; s << "timestamp: " << timestamp_.InMicroseconds() << " duration: " << duration_.InMicroseconds() << " size: " << size_ << " side_data_size: " << side_data_size_ << " encrypted: " << (decrypt_config_ != NULL) << " discard_padding (ms): (" << discard_padding_.first.InMilliseconds() << ", " << discard_padding_.second.InMilliseconds() << ")"; return s.str(); } void DecoderBuffer::set_timestamp(base::TimeDelta timestamp) { DCHECK(!end_of_stream()); timestamp_ = timestamp; } } // namespace media