1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/base/decoder_buffer.h"
6
7 #include "base/logging.h"
8 #include "media/base/decrypt_config.h"
9
10 namespace media {
11
DecoderBuffer(int size)12 DecoderBuffer::DecoderBuffer(int size)
13 : size_(size),
14 side_data_size_(0) {
15 Initialize();
16 }
17
DecoderBuffer(const uint8 * data,int size,const uint8 * side_data,int side_data_size)18 DecoderBuffer::DecoderBuffer(const uint8* data, int size,
19 const uint8* side_data, int side_data_size)
20 : size_(size),
21 side_data_size_(side_data_size) {
22 if (!data) {
23 CHECK_EQ(size_, 0);
24 CHECK(!side_data);
25 return;
26 }
27
28 Initialize();
29 memcpy(data_.get(), data, size_);
30 if (side_data)
31 memcpy(side_data_.get(), side_data, side_data_size_);
32 }
33
~DecoderBuffer()34 DecoderBuffer::~DecoderBuffer() {}
35
Initialize()36 void DecoderBuffer::Initialize() {
37 CHECK_GE(size_, 0);
38 data_.reset(reinterpret_cast<uint8*>(
39 base::AlignedAlloc(size_ + kPaddingSize, kAlignmentSize)));
40 memset(data_.get() + size_, 0, kPaddingSize);
41 if (side_data_size_ > 0) {
42 side_data_.reset(reinterpret_cast<uint8*>(
43 base::AlignedAlloc(side_data_size_ + kPaddingSize, kAlignmentSize)));
44 memset(side_data_.get() + side_data_size_, 0, kPaddingSize);
45 }
46 }
47
48 // static
CopyFrom(const uint8 * data,int data_size)49 scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
50 int data_size) {
51 // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
52 CHECK(data);
53 return make_scoped_refptr(new DecoderBuffer(data, data_size, NULL, 0));
54 }
55
56 // static
CopyFrom(const uint8 * data,int data_size,const uint8 * side_data,int side_data_size)57 scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
58 int data_size,
59 const uint8* side_data,
60 int side_data_size) {
61 // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
62 CHECK(data);
63 CHECK(side_data);
64 return make_scoped_refptr(new DecoderBuffer(data, data_size,
65 side_data, side_data_size));
66 }
67
68 // static
CreateEOSBuffer()69 scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
70 return make_scoped_refptr(new DecoderBuffer(NULL, 0, NULL, 0));
71 }
72
AsHumanReadableString()73 std::string DecoderBuffer::AsHumanReadableString() {
74 if (end_of_stream()) {
75 return "end of stream";
76 }
77
78 std::ostringstream s;
79 s << "timestamp: " << timestamp_.InMicroseconds()
80 << " duration: " << duration_.InMicroseconds()
81 << " size: " << size_
82 << " side_data_size: " << side_data_size_
83 << " encrypted: " << (decrypt_config_ != NULL)
84 << " discard_padding (ms): " << discard_padding_.InMilliseconds();
85 return s.str();
86 }
87
88 } // namespace media
89