summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-02 20:18:07 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-02 20:18:07 +0000
commitec57586df7a60d4739426407fe3922b879c55b04 (patch)
tree87ff3edddc9d5f61ed2bb6c2f2d4fd557bd46d56
parentd20a6514672aa08c208e9d7b5708e1de33dd9cf7 (diff)
downloadchromium_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.cc31
-rw-r--r--media/base/data_buffer.h2
-rw-r--r--media/base/stream_parser.h4
-rw-r--r--media/base/stream_parser_buffer.cc25
-rw-r--r--media/base/stream_parser_buffer.h28
-rw-r--r--media/filters/chunk_demuxer.cc20
-rw-r--r--media/media.gyp2
-rw-r--r--media/webm/webm_cluster_parser.cc6
-rw-r--r--media/webm/webm_cluster_parser.h4
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,