15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "media/base/buffers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decrypt_config.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DecoderBuffer::DecoderBuffer(int size)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : size_(size),
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      side_data_size_(0) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DecoderBuffer::DecoderBuffer(const uint8* data, int size,
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const uint8* side_data, int side_data_size)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : size_(size),
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      side_data_size_(side_data_size) {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!data) {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CHECK_EQ(size_, 0);
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CHECK(!side_data);
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Initialize();
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  memcpy(data_.get(), data, size_);
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (side_data)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    memcpy(side_data_.get(), side_data, side_data_size_);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DecoderBuffer::~DecoderBuffer() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DecoderBuffer::Initialize() {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_GE(size_, 0);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_.reset(reinterpret_cast<uint8*>(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::AlignedAlloc(size_ + kPaddingSize, kAlignmentSize)));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(data_.get() + size_, 0, kPaddingSize);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (side_data_size_ > 0) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    side_data_.reset(reinterpret_cast<uint8*>(
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::AlignedAlloc(side_data_size_ + kPaddingSize, kAlignmentSize)));
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(side_data_.get() + side_data_size_, 0, kPaddingSize);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  splice_timestamp_ = kNoTimestamp();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     int data_size) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(data);
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return make_scoped_refptr(new DecoderBuffer(data, data_size, NULL, 0));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(const uint8* data,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                     int data_size,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                     const uint8* side_data,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                     int side_data_size) {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(data);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(side_data);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return make_scoped_refptr(new DecoderBuffer(data, data_size,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              side_data, side_data_size));
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return make_scoped_refptr(new DecoderBuffer(NULL, 0, NULL, 0));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string DecoderBuffer::AsHumanReadableString() {
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (end_of_stream()) {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "end of stream";
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::ostringstream s;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  s << "timestamp: " << timestamp_.InMicroseconds()
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    << " duration: " << duration_.InMicroseconds()
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    << " size: " << size_
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    << " side_data_size: " << side_data_size_
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    << " encrypted: " << (decrypt_config_ != NULL)
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    << " discard_padding (ms): (" << discard_padding_.first.InMilliseconds()
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    << ", " << discard_padding_.second.InMilliseconds() << ")";
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return s.str();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DecoderBuffer::set_timestamp(base::TimeDelta timestamp) {
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!end_of_stream());
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  timestamp_ = timestamp;
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
97