• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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