Home | History | Annotate | Download | only in base
      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/buffers.h"
      9 #include "media/base/decrypt_config.h"
     10 
     11 namespace media {
     12 
     13 DecoderBuffer::DecoderBuffer(int size)
     14     : size_(size),
     15       side_data_size_(0) {
     16   Initialize();
     17 }
     18 
     19 DecoderBuffer::DecoderBuffer(const uint8* data, int size,
     20                              const uint8* side_data, int side_data_size)
     21     : size_(size),
     22       side_data_size_(side_data_size) {
     23   if (!data) {
     24     CHECK_EQ(size_, 0);
     25     CHECK(!side_data);
     26     return;
     27   }
     28 
     29   Initialize();
     30   memcpy(data_.get(), data, size_);
     31   if (side_data)
     32     memcpy(side_data_.get(), side_data, side_data_size_);
     33 }
     34 
     35 DecoderBuffer::~DecoderBuffer() {}
     36 
     37 void DecoderBuffer::Initialize() {
     38   CHECK_GE(size_, 0);
     39   data_.reset(reinterpret_cast<uint8*>(
     40       base::AlignedAlloc(size_ + kPaddingSize, kAlignmentSize)));
     41   memset(data_.get() + size_, 0, kPaddingSize);
     42   if (side_data_size_ > 0) {
     43     side_data_.reset(reinterpret_cast<uint8*>(
     44         base::AlignedAlloc(side_data_size_ + kPaddingSize, kAlignmentSize)));
     45     memset(side_data_.get() + side_data_size_, 0, kPaddingSize);
     46   }
     47   splice_timestamp_ = kNoTimestamp();
     48 }
     49 
     50 // static
     51 scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
     52                                                      int data_size) {
     53   // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
     54   CHECK(data);
     55   return make_scoped_refptr(new DecoderBuffer(data, data_size, NULL, 0));
     56 }
     57 
     58 // static
     59 scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
     60                                                      int data_size,
     61                                                      const uint8* side_data,
     62                                                      int side_data_size) {
     63   // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
     64   CHECK(data);
     65   CHECK(side_data);
     66   return make_scoped_refptr(new DecoderBuffer(data, data_size,
     67                                               side_data, side_data_size));
     68 }
     69 
     70 // static
     71 scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
     72   return make_scoped_refptr(new DecoderBuffer(NULL, 0, NULL, 0));
     73 }
     74 
     75 std::string DecoderBuffer::AsHumanReadableString() {
     76   if (end_of_stream()) {
     77     return "end of stream";
     78   }
     79 
     80   std::ostringstream s;
     81   s << "timestamp: " << timestamp_.InMicroseconds()
     82     << " duration: " << duration_.InMicroseconds()
     83     << " size: " << size_
     84     << " side_data_size: " << side_data_size_
     85     << " encrypted: " << (decrypt_config_ != NULL)
     86     << " discard_padding (ms): (" << discard_padding_.first.InMilliseconds()
     87     << ", " << discard_padding_.second.InMilliseconds() << ")";
     88   return s.str();
     89 }
     90 
     91 void DecoderBuffer::set_timestamp(base::TimeDelta timestamp) {
     92   DCHECK(!end_of_stream());
     93   timestamp_ = timestamp;
     94 }
     95 
     96 }  // namespace media
     97