| // 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/decrypt_config.h" | |
| #if defined(__LB_SHELL__) || defined(COBALT) | |
| #include "base/debug/trace_event.h" | |
| #include "media/base/shell_buffer_factory.h" | |
| #endif // defined(__LB_SHELL__) || defined(COBALT) | |
| #if !defined(OS_ANDROID) | |
| #include "base/memory/aligned_memory.h" | |
| #endif | |
| namespace media { | |
| #if defined(__LB_SHELL__) || defined(COBALT) | |
| // static | |
| scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer( | |
| base::TimeDelta timestamp) { | |
| scoped_refptr<DecoderBuffer> eos = | |
| scoped_refptr<DecoderBuffer>(new DecoderBuffer(NULL, 0, true)); | |
| eos->SetTimestamp(timestamp); | |
| return eos; | |
| } | |
| void DecoderBuffer::ShrinkTo(int size) { | |
| CHECK_LE(size, GetAllocatedSize()); | |
| size_ = size; | |
| } | |
| DecoderBuffer::DecoderBuffer(uint8* reusable_buffer, | |
| size_t size, | |
| bool is_keyframe) | |
| : Buffer(kNoTimestamp(), kInfiniteDuration()), | |
| buffer_(reusable_buffer), | |
| size_(size), | |
| allocated_size_(size), | |
| is_decrypted_(false), | |
| is_keyframe_(is_keyframe) { | |
| if (buffer_) { | |
| // Retain a reference to the buffer factory, to ensure that we do not | |
| // outlive it. | |
| buffer_factory_ = ShellBufferFactory::Instance(); | |
| } | |
| } | |
| DecoderBuffer::~DecoderBuffer() { | |
| // recycle our buffer | |
| if (buffer_) { | |
| TRACE_EVENT1("media_stack", "DecoderBuffer::~DecoderBuffer()", | |
| "timestamp", GetTimestamp().InMicroseconds()); | |
| DCHECK_NE(buffer_factory_, (ShellBufferFactory*)NULL); | |
| buffer_factory_->Reclaim(buffer_); | |
| } | |
| } | |
| const DecryptConfig* DecoderBuffer::GetDecryptConfig() const { | |
| DCHECK(!IsEndOfStream()); | |
| return decrypt_config_.get(); | |
| } | |
| void DecoderBuffer::SetDecryptConfig(scoped_ptr<DecryptConfig> decrypt_config) { | |
| DCHECK(!IsEndOfStream()); | |
| decrypt_config_ = decrypt_config.Pass(); | |
| } | |
| void DecoderBuffer::SetBuffer(uint8* reusable_buffer) { | |
| buffer_ = reusable_buffer; | |
| if (buffer_) { | |
| // Retain a reference to the buffer factory, to ensure that we do not | |
| // outlive it. | |
| buffer_factory_ = ShellBufferFactory::Instance(); | |
| } | |
| } | |
| #else // defined(__LB_SHELL__) || defined(COBALT) | |
| DecoderBuffer::DecoderBuffer(int buffer_size) | |
| : Buffer(base::TimeDelta(), base::TimeDelta()), | |
| buffer_size_(buffer_size) { | |
| Initialize(); | |
| } | |
| DecoderBuffer::DecoderBuffer(const uint8* data, int buffer_size) | |
| : Buffer(base::TimeDelta(), base::TimeDelta()), | |
| buffer_size_(buffer_size) { | |
| // Prevent invalid allocations. Also used to create end of stream buffers. | |
| if (!data) { | |
| buffer_size_ = 0; | |
| data_ = NULL; | |
| return; | |
| } | |
| Initialize(); | |
| memcpy(data_, data, buffer_size_); | |
| } | |
| DecoderBuffer::~DecoderBuffer() { | |
| #if !defined(OS_ANDROID) | |
| base::AlignedFree(data_); | |
| #else | |
| delete[] data_; | |
| #endif | |
| } | |
| void DecoderBuffer::Initialize() { | |
| DCHECK_GE(buffer_size_, 0); | |
| #if !defined(OS_ANDROID) | |
| data_ = reinterpret_cast<uint8*>( | |
| base::AlignedAlloc(buffer_size_ + kPaddingSize, kAlignmentSize)); | |
| memset(data_ + buffer_size_, 0, kPaddingSize); | |
| #else | |
| data_ = new uint8[buffer_size_]; | |
| #endif | |
| } | |
| scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data, | |
| int data_size) { | |
| DCHECK(data); | |
| return make_scoped_refptr(new DecoderBuffer(data, data_size)); | |
| } | |
| scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() { | |
| return make_scoped_refptr(new DecoderBuffer(NULL, 0)); | |
| } | |
| const uint8* DecoderBuffer::GetData() const { | |
| return data_; | |
| } | |
| int DecoderBuffer::GetDataSize() const { | |
| return buffer_size_; | |
| } | |
| uint8* DecoderBuffer::GetWritableData() { | |
| return data_; | |
| } | |
| const DecryptConfig* DecoderBuffer::GetDecryptConfig() const { | |
| return decrypt_config_.get(); | |
| } | |
| void DecoderBuffer::SetDecryptConfig(scoped_ptr<DecryptConfig> decrypt_config) { | |
| decrypt_config_ = decrypt_config.Pass(); | |
| } | |
| #endif // defined(__LB_SHELL__) || defined(COBALT) | |
| } // namespace media |