diff options
author | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-02 20:18:07 +0000 |
---|---|---|
committer | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-02 20:18:07 +0000 |
commit | ec57586df7a60d4739426407fe3922b879c55b04 (patch) | |
tree | 87ff3edddc9d5f61ed2bb6c2f2d4fd557bd46d56 | |
parent | d20a6514672aa08c208e9d7b5708e1de33dd9cf7 (diff) | |
download | chromium_src-ec57586df7a60d4739426407fe3922b879c55b04.zip chromium_src-ec57586df7a60d4739426407fe3922b879c55b04.tar.gz chromium_src-ec57586df7a60d4739426407fe3922b879c55b04.tar.bz2 |
Add StreamParserBuffer to ChunkDemuxer
This will allow SourceBufferStreams to identify keyframes.
BUG=125680
TEST=NONE
Review URL: https://chromiumcodereview.appspot.com/10269022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@134978 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/base/data_buffer.cc | 31 | ||||
-rw-r--r-- | media/base/data_buffer.h | 2 | ||||
-rw-r--r-- | media/base/stream_parser.h | 4 | ||||
-rw-r--r-- | media/base/stream_parser_buffer.cc | 25 | ||||
-rw-r--r-- | media/base/stream_parser_buffer.h | 28 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.cc | 20 | ||||
-rw-r--r-- | media/media.gyp | 2 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.cc | 6 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.h | 4 |
9 files changed, 93 insertions, 29 deletions
diff --git a/media/base/data_buffer.cc b/media/base/data_buffer.cc index b082a18..9a491e3 100644 --- a/media/base/data_buffer.cc +++ b/media/base/data_buffer.cc @@ -30,23 +30,31 @@ DataBuffer::DataBuffer(int buffer_size) data_.reset(NULL); } -DataBuffer::~DataBuffer() {} +DataBuffer::DataBuffer(const uint8* data, int data_size) + : Buffer(base::TimeDelta(), base::TimeDelta()), + buffer_size_(0), + data_size_(0) { + if (data_size == 0) + return; -scoped_refptr<DataBuffer> DataBuffer::CopyFrom(const uint8* data, - int data_size) { int padding_size = 0; #if !defined(OS_ANDROID) - // Why FF_INPUT_BUFFER_PADDING_SIZE? FFmpeg assumes all input buffers are - // padded with this value. + // FFmpeg assumes all input buffers are padded with this value. padding_size = FF_INPUT_BUFFER_PADDING_SIZE; #endif - scoped_refptr<DataBuffer> data_buffer( - new DataBuffer(data_size + padding_size)); - memcpy(data_buffer->data_.get(), data, data_size); - memset(data_buffer->data_.get() + data_size, 0, padding_size); - data_buffer->SetDataSize(data_size); - return data_buffer; + buffer_size_ = data_size + padding_size; + data_.reset(new uint8[buffer_size_]); + memcpy(data_.get(), data, data_size); + memset(data_.get() + data_size, 0, padding_size); + SetDataSize(data_size); +} + +DataBuffer::~DataBuffer() {} + +scoped_refptr<DataBuffer> DataBuffer::CopyFrom(const uint8* data, + int data_size) { + return make_scoped_refptr(new DataBuffer(data, data_size)); } const uint8* DataBuffer::GetData() const { @@ -65,7 +73,6 @@ uint8* DataBuffer::GetWritableData() { return data_.get(); } - void DataBuffer::SetDataSize(int data_size) { DCHECK_LE(data_size, buffer_size_); data_size_ = data_size; diff --git a/media/base/data_buffer.h b/media/base/data_buffer.h index 15ef32d..8ba6956 100644 --- a/media/base/data_buffer.h +++ b/media/base/data_buffer.h @@ -45,6 +45,8 @@ class MEDIA_EXPORT DataBuffer : public Buffer { virtual void SetDecryptConfig(scoped_ptr<DecryptConfig> decrypt_config); protected: + // Copies from [data,data+size) to owned array. + DataBuffer(const uint8* data, int size); virtual ~DataBuffer(); private: diff --git a/media/base/stream_parser.h b/media/base/stream_parser.h index ef859dc..22fc0c2 100644 --- a/media/base/stream_parser.h +++ b/media/base/stream_parser.h @@ -16,13 +16,13 @@ namespace media { class AudioDecoderConfig; -class Buffer; +class StreamParserBuffer; class VideoDecoderConfig; // Abstract interface for parsing media byte streams. class MEDIA_EXPORT StreamParser { public: - typedef std::deque<scoped_refptr<Buffer> > BufferQueue; + typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; StreamParser(); virtual ~StreamParser(); diff --git a/media/base/stream_parser_buffer.cc b/media/base/stream_parser_buffer.cc new file mode 100644 index 0000000..77aeb40 --- /dev/null +++ b/media/base/stream_parser_buffer.cc @@ -0,0 +1,25 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/base/stream_parser_buffer.h" + +namespace media { + +StreamParserBuffer::StreamParserBuffer(const uint8* data, int data_size, + bool is_keyframe) + : DataBuffer(data, data_size), + is_keyframe_(is_keyframe) { +} + +scoped_refptr<StreamParserBuffer> StreamParserBuffer::CreateEOSBuffer() { + return make_scoped_refptr(new StreamParserBuffer(NULL, 0, false)); +} + +scoped_refptr<StreamParserBuffer> StreamParserBuffer::CopyFrom( + const uint8* data, int data_size, bool is_keyframe) { + return make_scoped_refptr( + new StreamParserBuffer(data, data_size, is_keyframe)); +} + +} // namespace media diff --git a/media/base/stream_parser_buffer.h b/media/base/stream_parser_buffer.h new file mode 100644 index 0000000..a952a83 --- /dev/null +++ b/media/base/stream_parser_buffer.h @@ -0,0 +1,28 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_STREAM_PARSER_BUFFER_H_ +#define MEDIA_BASE_STREAM_PARSER_BUFFER_H_ + +#include "media/base/data_buffer.h" +#include "media/base/media_export.h" + +namespace media { + +class MEDIA_EXPORT StreamParserBuffer : public DataBuffer { + public: + static scoped_refptr<StreamParserBuffer> CreateEOSBuffer(); + static scoped_refptr<StreamParserBuffer> CopyFrom( + const uint8* data, int data_size, bool is_keyframe); + bool IsKeyframe() const { return is_keyframe_; } + + private: + StreamParserBuffer(const uint8* data, int data_size, bool is_keyframe); + bool is_keyframe_; + DISALLOW_COPY_AND_ASSIGN(StreamParserBuffer); +}; + +} // namespace media + +#endif // MEDIA_BASE_STREAM_PARSER_BUFFER_H_ diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 35d88e2..b3bdb81 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -8,7 +8,7 @@ #include "base/logging.h" #include "base/message_loop.h" #include "media/base/audio_decoder_config.h" -#include "media/base/data_buffer.h" +#include "media/base/stream_parser_buffer.h" #include "media/base/video_decoder_config.h" #include "media/filters/chunk_demuxer_client.h" #include "media/webm/webm_stream_parser.h" @@ -18,14 +18,9 @@ namespace media { // TODO(acolwell): Remove this when fixing http://crbug.com/122909 . const char* kDefaultSourceType = "video/webm; codecs=\"vp8, vorbis\""; -// Create an "end of stream" buffer. -static Buffer* CreateEOSBuffer() { - return new DataBuffer(0); -} - class ChunkDemuxerStream : public DemuxerStream { public: - typedef std::deque<scoped_refptr<Buffer> > BufferQueue; + typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; typedef std::deque<ReadCB> ReadCBQueue; typedef std::deque<base::Closure> ClosureQueue; @@ -205,7 +200,7 @@ void ChunkDemuxerStream::Shutdown() { // Pass end of stream buffers to all callbacks to signal that no more data // will be sent. for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it) - it->Run(CreateEOSBuffer()); + it->Run(StreamParserBuffer::CreateEOSBuffer()); } bool ChunkDemuxerStream::GetLastBufferTimestamp( @@ -264,7 +259,7 @@ void ChunkDemuxerStream::Read(const ReadCB& read_cb) { if (buffers_.empty()) { ChangeState_Locked(RETURNING_EOS_FOR_READS); - buffer = CreateEOSBuffer(); + buffer = StreamParserBuffer::CreateEOSBuffer(); } else { buffer = buffers_.front(); buffers_.pop_front(); @@ -275,7 +270,7 @@ void ChunkDemuxerStream::Read(const ReadCB& read_cb) { case SHUTDOWN: DCHECK(buffers_.empty()); DCHECK(read_cbs_.empty()); - buffer = CreateEOSBuffer(); + buffer = StreamParserBuffer::CreateEOSBuffer(); } } @@ -325,7 +320,8 @@ void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) { return; // Push enough EOS buffers to satisfy outstanding Read() requests. - scoped_refptr<Buffer> end_of_stream_buffer = CreateEOSBuffer(); + scoped_refptr<Buffer> end_of_stream_buffer = + StreamParserBuffer::CreateEOSBuffer(); while (!read_cbs_.empty()) { closures->push_back(base::Bind(read_cbs_.front(), end_of_stream_buffer)); read_cbs_.pop_front(); @@ -591,7 +587,7 @@ void ChunkDemuxer::EndOfStream(PipelineStatus status) { // Create an end of stream buffer. ChunkDemuxerStream::BufferQueue buffers; - buffers.push_back(CreateEOSBuffer()); + buffers.push_back(StreamParserBuffer::CreateEOSBuffer()); if (audio_.get()) audio_->AddBuffers(buffers); diff --git a/media/media.gyp b/media/media.gyp index 6622295..d762c50 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -178,6 +178,8 @@ 'base/state_matrix.h', 'base/stream_parser.cc', 'base/stream_parser.h', + 'base/stream_parser_buffer.cc', + 'base/stream_parser_buffer.h', 'base/video_decoder_config.cc', 'base/video_decoder_config.h', 'base/video_frame.cc', diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc index c34cd8d..68abec7 100644 --- a/media/webm/webm_cluster_parser.cc +++ b/media/webm/webm_cluster_parser.cc @@ -115,7 +115,11 @@ bool WebMClusterParser::OnSimpleBlock(int track_num, int timecode, base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( (cluster_timecode_ + timecode) * timecode_multiplier_); - scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data, size); + // The first bit of the flags is set when the block contains only keyframes. + // http://www.matroska.org/technical/specs/index.html + bool is_keyframe = (flags & 0x80) != 0; + scoped_refptr<StreamParserBuffer> buffer = + StreamParserBuffer::CopyFrom(data, size, is_keyframe); if (track_num == video_track_num_ && video_encryption_key_id_.get()) { buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig( diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h index 8646289..1d103ff 100644 --- a/media/webm/webm_cluster_parser.h +++ b/media/webm/webm_cluster_parser.h @@ -9,14 +9,14 @@ #include <string> #include "base/memory/scoped_ptr.h" -#include "media/base/buffers.h" +#include "media/base/stream_parser_buffer.h" #include "media/webm/webm_parser.h" namespace media { class WebMClusterParser : public WebMParserClient { public: - typedef std::deque<scoped_refptr<Buffer> > BufferQueue; + typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; WebMClusterParser(int64 timecode_scale, int audio_track_num, |