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