diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-23 23:46:36 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-23 23:46:36 +0000 |
commit | 35c83a09965168db7670efb4803554c0bdc8187f (patch) | |
tree | 47cd6abc50b5ff74c1dfd267f94c8f3def09fc49 /media | |
parent | a9a0b71dc445677a21bf2ff3e7658b1c878de9a2 (diff) | |
download | chromium_src-35c83a09965168db7670efb4803554c0bdc8187f.zip chromium_src-35c83a09965168db7670efb4803554c0bdc8187f.tar.gz chromium_src-35c83a09965168db7670efb4803554c0bdc8187f.tar.bz2 |
Implement sourceAddId() & sourceRemoveId()
BUG=122897
TEST=Covered by LayoutTests
Review URL: http://codereview.chromium.org/10164017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133568 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/chunk_demuxer.cc | 40 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.h | 29 | ||||
-rw-r--r-- | media/filters/chunk_demuxer_unittest.cc | 35 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test.cc | 8 |
4 files changed, 97 insertions, 15 deletions
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index d3f532c..25bc0bc 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -15,6 +15,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); @@ -455,11 +458,40 @@ void ChunkDemuxer::FlushData() { ChangeState_Locked(INITIALIZED); } -bool ChunkDemuxer::AppendData(const uint8* data, size_t length) { - DVLOG(1) << "AppendData(" << length << ")"; +ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id, + const std::string& type) { + // TODO(acolwell): Proper mimetype decoding and support for more than one ID + // will be added as part of http://crbug.com/122909 + if (type != kDefaultSourceType) + return kNotSupported; - if (!data || length == 0u) - return false; + if (!source_id_.empty()) + return kReachedIdLimit; + + source_id_ = id; + return kOk; +} + +void ChunkDemuxer::RemoveId(const std::string& id) { + CHECK(!source_id_.empty()); + CHECK_EQ(source_id_, id); + source_id_ = ""; +} + +bool ChunkDemuxer::AppendData(const std::string& id, + const uint8* data, + size_t length) { + DVLOG(1) << "AppendData(" << id << ", " << length << ")"; + + // TODO(acolwell): Remove when http://webk.it/83788 fix lands. + if (source_id_.empty()) + AddId(id, kDefaultSourceType); + + DCHECK(!source_id_.empty()); + DCHECK_EQ(source_id_, id); + DCHECK(!id.empty()); + DCHECK(data); + DCHECK_GT(length, 0u); int64 buffered_bytes = 0; base::TimeDelta buffered_ts = base::TimeDelta::FromSeconds(-1); diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index ae690b9..3942b23 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -6,6 +6,7 @@ #define MEDIA_FILTERS_CHUNK_DEMUXER_H_ #include <list> +#include <string> #include "base/synchronization/lock.h" #include "media/base/byte_queue.h" @@ -22,6 +23,12 @@ class FFmpegURLProtocol; // from JavaScript to the media stack. class MEDIA_EXPORT ChunkDemuxer : public Demuxer, public StreamParserHost { public: + enum Status { + kOk, // ID added w/o error. + kNotSupported, // Type specified is not supported. + kReachedIdLimit, // Reached ID limit. We can't handle any more IDs. + }; + explicit ChunkDemuxer(ChunkDemuxerClient* client); virtual ~ChunkDemuxer(); @@ -41,9 +48,22 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer, public StreamParserHost { // Methods used by an external object to control this demuxer. void FlushData(); - // Appends media data to the stream. Returns false if this method - // is called in an invalid state. - bool AppendData(const uint8* data, size_t length); + // Registers a new |id| to use for AppendData() calls. |type| indicates + // the MIME type for the data that we intend to append for this ID. + // kOk is returned if the demuxer has enough resources to support another ID + // and supports the format indicated by |type|. + // kNotSupported is returned if |type| is not a supported format. + // kReachedIdLimit is returned if the demuxer cannot handle another ID right + // now. + Status AddId(const std::string& id, const std::string& type); + + // Removed an ID & associated resources that were previously added with + // AddId(). + void RemoveId(const std::string& id); + + // Appends media data to the source buffer associated with |id|. Returns + // false if this method is called in an invalid state. + bool AppendData(const std::string& id, const uint8* data, size_t length); void EndOfStream(PipelineStatus status); bool HasEnded(); void Shutdown(); @@ -95,6 +115,9 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer, public StreamParserHost { ByteQueue byte_queue_; + // TODO(acolwell): Remove this when fixing http://crbug.com/122909 + std::string source_id_; + DISALLOW_COPY_AND_ASSIGN(ChunkDemuxer); }; diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index 5bbc817..00669f2 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -38,6 +38,9 @@ static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset + static const int kVideoTrackNum = 1; static const int kAudioTrackNum = 2; +static const char* kSourceId = "SourceId"; +static const char* kDefaultSourceType = "video/webm; codecs=\"vp8, vorbis\""; + base::TimeDelta kDefaultDuration() { return base::TimeDelta::FromMilliseconds(201224); } @@ -164,7 +167,7 @@ class ChunkDemuxerTest : public testing::Test { EXPECT_CALL(host_, SetBufferedTime(_)).Times(AnyNumber()); EXPECT_CALL(host_, SetNetworkActivity(true)) .Times(AnyNumber()); - return demuxer_->AppendData(data, length); + return demuxer_->AppendData(kSourceId, data, length); } bool AppendDataInPieces(const uint8* data, size_t length) { @@ -219,6 +222,9 @@ class ChunkDemuxerTest : public testing::Test { demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), expected_status)); + if (demuxer_->AddId(kSourceId, kDefaultSourceType) != ChunkDemuxer::kOk) + return false; + return AppendInfoTracks(has_audio, has_video, video_content_encoded); } @@ -272,6 +278,9 @@ class ChunkDemuxerTest : public testing::Test { demuxer_->Initialize( &host_, CreateInitDoneCB(duration, PIPELINE_OK)); + if (demuxer_->AddId(kSourceId, kDefaultSourceType) != ChunkDemuxer::kOk) + return false; + // Read a WebM file into memory and send the data to the demuxer. ReadTestDataFile(filename, &buffer, &buffer_size); if (!AppendDataInPieces(buffer.get(), buffer_size, 512)) @@ -460,7 +469,8 @@ TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { int info_tracks_size = 0; CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); - EXPECT_FALSE(demuxer_->AppendData(info_tracks.get(), info_tracks_size)); + EXPECT_FALSE(demuxer_->AppendData(kSourceId, info_tracks.get(), + info_tracks_size)); } // Make sure Read() callbacks are dispatched with the proper data. @@ -527,7 +537,8 @@ TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) { AddSimpleBlock(&cb, kAudioTrackNum, 45); AddSimpleBlock(&cb, kVideoTrackNum, 45); scoped_ptr<Cluster> cluster_c(cb.Finish()); - EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); + EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(), + cluster_c->size())); } TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { @@ -552,7 +563,8 @@ TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { AddSimpleBlock(&cb, kAudioTrackNum, 20); AddSimpleBlock(&cb, kVideoTrackNum, 20); scoped_ptr<Cluster> cluster_b(cb.Finish()); - EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); + EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), + cluster_b->size())); } TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { @@ -577,7 +589,8 @@ TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { AddSimpleBlock(&cb, kAudioTrackNum, 6); AddSimpleBlock(&cb, kVideoTrackNum, 6); scoped_ptr<Cluster> cluster_b(cb.Finish()); - EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); + EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), + cluster_b->size())); } @@ -626,7 +639,8 @@ TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) { AddSimpleBlock(&cb, kAudioTrackNum, 10); AddSimpleBlock(&cb, kVideoTrackNum, 10); scoped_ptr<Cluster> cluster_c(cb.Finish()); - EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); + EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(), + cluster_c->size())); } // Test the case where a cluster is passed to AppendData() before @@ -636,6 +650,8 @@ TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { demuxer_->Initialize( &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); + ASSERT_EQ(demuxer_->AddId(kSourceId, kDefaultSourceType), ChunkDemuxer::kOk); + ClusterBuilder cb; cb.SetClusterTimecode(0); AddSimpleBlock(&cb, kVideoTrackNum, 0); @@ -835,6 +851,8 @@ TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); + ASSERT_EQ(demuxer_->AddId(kSourceId, kDefaultSourceType), ChunkDemuxer::kOk); + scoped_array<uint8> info_tracks; int info_tracks_size = 0; CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); @@ -1033,10 +1051,13 @@ TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { EXPECT_CALL(*client_, DemuxerOpened(_)); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); + + ASSERT_EQ(demuxer_->AddId(kSourceId, kDefaultSourceType), ChunkDemuxer::kOk); + ASSERT_TRUE(AppendInfoTracks(true, true, false)); uint8 tmp = 0; - ASSERT_TRUE(demuxer_->AppendData(&tmp, 1)); + ASSERT_TRUE(demuxer_->AppendData(kSourceId, &tmp, 1)); } } // namespace media diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc index cfcbf87..8be0aff 100644 --- a/media/filters/pipeline_integration_test.cc +++ b/media/filters/pipeline_integration_test.cc @@ -14,6 +14,9 @@ namespace media { static const unsigned char kKeyId[] = "\x11\xa5\x18\x37\xc4\x73\x84\x03\xe5\xe6\x57\xed\x8e\x06\xd9\x7c"; +static const char* kSourceId = "SourceId"; +static const char* kDefaultSourceType = "video/webm; codecs=\"vp8, vorbis\""; + // Helper class that emulates calls made on the ChunkDemuxer by the // Media Source API. class MockMediaSource : public ChunkDemuxerClient { @@ -46,7 +49,9 @@ class MockMediaSource : public ChunkDemuxerClient { DCHECK(chunk_demuxer_.get()); DCHECK_LT(current_position_, file_data_size_); DCHECK_LE(current_position_ + size, file_data_size_); - chunk_demuxer_->AppendData(file_data_.get() + current_position_, size); + CHECK(chunk_demuxer_->AppendData(kSourceId, + file_data_.get() + current_position_, + size)); current_position_ += size; } @@ -63,6 +68,7 @@ class MockMediaSource : public ChunkDemuxerClient { // ChunkDemuxerClient methods. virtual void DemuxerOpened(ChunkDemuxer* demuxer) { chunk_demuxer_ = demuxer; + chunk_demuxer_->AddId(kSourceId, kDefaultSourceType); AppendData(initial_append_size_); } |