Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "media/base/audio_decoder_config.h" | 6 #include "media/base/audio_decoder_config.h" |
| 7 #include "media/base/decoder_buffer.h" | |
| 7 #include "media/base/mock_callback.h" | 8 #include "media/base/mock_callback.h" |
| 8 #include "media/base/mock_demuxer_host.h" | 9 #include "media/base/mock_demuxer_host.h" |
| 9 #include "media/base/test_data_util.h" | 10 #include "media/base/test_data_util.h" |
| 10 #include "media/filters/chunk_demuxer.h" | 11 #include "media/filters/chunk_demuxer.h" |
| 11 #include "media/filters/chunk_demuxer_client.h" | 12 #include "media/filters/chunk_demuxer_client.h" |
| 12 #include "media/webm/cluster_builder.h" | 13 #include "media/webm/cluster_builder.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 15 |
| 15 using ::testing::AnyNumber; | 16 using ::testing::AnyNumber; |
| 16 using ::testing::InSequence; | 17 using ::testing::InSequence; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 } | 63 } |
| 63 } | 64 } |
| 64 | 65 |
| 65 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { | 66 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
| 66 return arg && !arg->IsEndOfStream() && | 67 return arg && !arg->IsEndOfStream() && |
| 67 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; | 68 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; |
| 68 } | 69 } |
| 69 | 70 |
| 70 static void OnReadDone(const base::TimeDelta& expected_time, | 71 static void OnReadDone(const base::TimeDelta& expected_time, |
| 71 bool* called, | 72 bool* called, |
| 72 const scoped_refptr<Buffer>& buffer) { | 73 const scoped_refptr<DecoderBuffer>& buffer) { |
| 73 EXPECT_EQ(expected_time, buffer->GetTimestamp()); | 74 EXPECT_EQ(expected_time, buffer->GetTimestamp()); |
| 74 *called = true; | 75 *called = true; |
| 75 } | 76 } |
| 76 | 77 |
| 77 class MockChunkDemuxerClient : public ChunkDemuxerClient { | 78 class MockChunkDemuxerClient : public ChunkDemuxerClient { |
| 78 public: | 79 public: |
| 79 MockChunkDemuxerClient() {} | 80 MockChunkDemuxerClient() {} |
| 80 virtual ~MockChunkDemuxerClient() {} | 81 virtual ~MockChunkDemuxerClient() {} |
| 81 | 82 |
| 82 MOCK_METHOD1(DemuxerOpened, void(ChunkDemuxer* demuxer)); | 83 MOCK_METHOD1(DemuxerOpened, void(ChunkDemuxer* demuxer)); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 107 demuxer_(new ChunkDemuxer(client_.get())) { | 108 demuxer_(new ChunkDemuxer(client_.get())) { |
| 108 } | 109 } |
| 109 | 110 |
| 110 virtual ~ChunkDemuxerTest() { | 111 virtual ~ChunkDemuxerTest() { |
| 111 ShutdownDemuxer(); | 112 ShutdownDemuxer(); |
| 112 } | 113 } |
| 113 | 114 |
| 114 void CreateInfoTracks(bool has_audio, bool has_video, | 115 void CreateInfoTracks(bool has_audio, bool has_video, |
| 115 bool video_content_encoded, scoped_array<uint8>* buffer, | 116 bool video_content_encoded, scoped_array<uint8>* buffer, |
| 116 int* size) { | 117 int* size) { |
| 117 scoped_array<uint8> info; | 118 scoped_refptr<DecoderBuffer> info; |
|
scherkus (not reviewing)
2012/05/26 01:36:32
nice cleanup!
| |
| 118 int info_size = 0; | 119 scoped_refptr<DecoderBuffer> audio_track_entry; |
| 119 scoped_array<uint8> audio_track_entry; | 120 scoped_refptr<DecoderBuffer> video_track_entry; |
| 120 int audio_track_entry_size = 0; | 121 scoped_refptr<DecoderBuffer> video_content_encodings; |
| 121 scoped_array<uint8> video_track_entry; | |
| 122 int video_track_entry_size = 0; | |
| 123 scoped_array<uint8> video_content_encodings; | |
| 124 int video_content_encodings_size = 0; | |
| 125 | 122 |
| 126 ReadTestDataFile("webm_info_element", &info, &info_size); | 123 info = ReadTestDataFile("webm_info_element"); |
| 127 | 124 |
| 128 int tracks_element_size = 0; | 125 int tracks_element_size = 0; |
| 129 | 126 |
| 130 if (has_audio) { | 127 if (has_audio) { |
| 131 ReadTestDataFile("webm_vorbis_track_entry", &audio_track_entry, | 128 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); |
| 132 &audio_track_entry_size); | 129 tracks_element_size += audio_track_entry->GetDataSize(); |
| 133 tracks_element_size += audio_track_entry_size; | |
| 134 } | 130 } |
| 135 | 131 |
| 136 if (has_video) { | 132 if (has_video) { |
| 137 ReadTestDataFile("webm_vp8_track_entry", &video_track_entry, | 133 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); |
| 138 &video_track_entry_size); | 134 tracks_element_size += video_track_entry->GetDataSize(); |
| 139 tracks_element_size += video_track_entry_size; | |
| 140 if (video_content_encoded) { | 135 if (video_content_encoded) { |
| 141 ReadTestDataFile("webm_content_encodings", &video_content_encodings, | 136 video_content_encodings = ReadTestDataFile("webm_content_encodings"); |
| 142 &video_content_encodings_size); | 137 tracks_element_size += video_content_encodings->GetDataSize(); |
| 143 tracks_element_size += video_content_encodings_size; | |
| 144 } | 138 } |
| 145 } | 139 } |
| 146 | 140 |
| 147 *size = info_size + kTracksHeaderSize + tracks_element_size; | 141 *size = info->GetDataSize() + kTracksHeaderSize + tracks_element_size; |
| 148 | 142 |
| 149 buffer->reset(new uint8[*size]); | 143 buffer->reset(new uint8[*size]); |
| 150 | 144 |
| 151 uint8* buf = buffer->get(); | 145 uint8* buf = buffer->get(); |
| 152 memcpy(buf, info.get(), info_size); | 146 memcpy(buf, info->GetData(), info->GetDataSize()); |
| 153 buf += info_size; | 147 buf += info->GetDataSize(); |
| 154 | 148 |
| 155 memcpy(buf, kTracksHeader, kTracksHeaderSize); | 149 memcpy(buf, kTracksHeader, kTracksHeaderSize); |
| 156 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); | 150 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); |
| 157 buf += kTracksHeaderSize; | 151 buf += kTracksHeaderSize; |
| 158 | 152 |
| 159 if (has_audio) { | 153 if (has_audio) { |
| 160 memcpy(buf, audio_track_entry.get(), audio_track_entry_size); | 154 memcpy(buf, audio_track_entry->GetData(), |
| 161 buf += audio_track_entry_size; | 155 audio_track_entry->GetDataSize()); |
| 156 buf += audio_track_entry->GetDataSize(); | |
| 162 } | 157 } |
| 163 | 158 |
| 164 if (has_video) { | 159 if (has_video) { |
| 165 memcpy(buf, video_track_entry.get(), video_track_entry_size); | 160 memcpy(buf, video_track_entry->GetData(), |
| 161 video_track_entry->GetDataSize()); | |
| 166 if (video_content_encoded) { | 162 if (video_content_encoded) { |
| 167 memcpy(buf + video_track_entry_size, video_content_encodings.get(), | 163 memcpy(buf + video_track_entry->GetDataSize(), |
| 168 video_content_encodings_size); | 164 video_content_encodings->GetData(), |
| 169 video_track_entry_size += video_content_encodings_size; | 165 video_content_encodings->GetDataSize()); |
| 170 WriteInt64(buf + kVideoTrackSizeOffset, | 166 WriteInt64(buf + kVideoTrackSizeOffset, video_track_entry->GetDataSize() |
| 171 video_track_entry_size - kVideoTrackEntryHeaderSize); | 167 + video_content_encodings->GetDataSize() |
|
scherkus (not reviewing)
2012/05/26 01:36:32
indenting here is funny
maybe drop video_track_en
DaleCurtis
2012/05/29 21:17:01
Done.
| |
| 168 - kVideoTrackEntryHeaderSize); | |
|
scherkus (not reviewing)
2012/05/26 01:36:32
also binary operators go @ the end of the previous
DaleCurtis
2012/05/29 21:17:01
Done.
| |
| 169 buf += video_content_encodings->GetDataSize(); | |
| 172 } | 170 } |
| 173 buf += video_track_entry_size; | 171 buf += video_track_entry->GetDataSize(); |
| 174 } | 172 } |
| 175 } | 173 } |
| 176 | 174 |
| 177 ChunkDemuxer::Status AddId() { | 175 ChunkDemuxer::Status AddId() { |
| 178 std::vector<std::string> codecs(2); | 176 std::vector<std::string> codecs(2); |
| 179 codecs[0] = "vp8"; | 177 codecs[0] = "vp8"; |
| 180 codecs[1] = "vorbis"; | 178 codecs[1] = "vorbis"; |
| 181 return demuxer_->AddId(kSourceId, "video/webm", codecs); | 179 return demuxer_->AddId(kSourceId, "video/webm", codecs); |
| 182 } | 180 } |
| 183 | 181 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 327 ExpectRead(audio, audio_timecode); | 325 ExpectRead(audio, audio_timecode); |
| 328 audio_timecode += kAudioBlockDuration; | 326 audio_timecode += kAudioBlockDuration; |
| 329 continue; | 327 continue; |
| 330 } | 328 } |
| 331 | 329 |
| 332 ExpectRead(video, video_timecode); | 330 ExpectRead(video, video_timecode); |
| 333 video_timecode += kVideoBlockDuration; | 331 video_timecode += kVideoBlockDuration; |
| 334 } | 332 } |
| 335 } | 333 } |
| 336 | 334 |
| 337 MOCK_METHOD1(ReadDone, void(const scoped_refptr<Buffer>&)); | 335 MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&)); |
| 338 | 336 |
| 339 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { | 337 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { |
| 340 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); | 338 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); |
| 341 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 339 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
| 342 base::Unretained(this))); | 340 base::Unretained(this))); |
| 343 } | 341 } |
| 344 | 342 |
| 345 MOCK_METHOD1(Checkpoint, void(int id)); | 343 MOCK_METHOD1(Checkpoint, void(int id)); |
| 346 | 344 |
| 347 struct BufferTimestamps { | 345 struct BufferTimestamps { |
| 348 int video_time_ms; | 346 int video_time_ms; |
| 349 int audio_time_ms; | 347 int audio_time_ms; |
| 350 }; | 348 }; |
| 351 static const int kSkip = -1; | 349 static const int kSkip = -1; |
| 352 | 350 |
| 353 // Test parsing a WebM file. | 351 // Test parsing a WebM file. |
| 354 // |filename| - The name of the file in media/test/data to parse. | 352 // |filename| - The name of the file in media/test/data to parse. |
| 355 // |timestamps| - The expected timestamps on the parsed buffers. | 353 // |timestamps| - The expected timestamps on the parsed buffers. |
| 356 // a timestamp of kSkip indicates that a Read() call for that stream | 354 // a timestamp of kSkip indicates that a Read() call for that stream |
| 357 // shouldn't be made on that iteration of the loop. If both streams have | 355 // shouldn't be made on that iteration of the loop. If both streams have |
| 358 // a kSkip then the loop will terminate. | 356 // a kSkip then the loop will terminate. |
| 359 bool ParseWebMFile(const std::string& filename, | 357 bool ParseWebMFile(const std::string& filename, |
| 360 const BufferTimestamps* timestamps, | 358 const BufferTimestamps* timestamps, |
| 361 const base::TimeDelta& duration) { | 359 const base::TimeDelta& duration) { |
| 362 scoped_array<uint8> buffer; | |
| 363 int buffer_size = 0; | |
| 364 | |
| 365 EXPECT_CALL(*client_, DemuxerOpened(_)); | 360 EXPECT_CALL(*client_, DemuxerOpened(_)); |
| 366 demuxer_->Initialize( | 361 demuxer_->Initialize( |
| 367 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); | 362 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); |
| 368 | 363 |
| 369 if (AddId() != ChunkDemuxer::kOk) | 364 if (AddId() != ChunkDemuxer::kOk) |
| 370 return false; | 365 return false; |
| 371 | 366 |
| 372 // Read a WebM file into memory and send the data to the demuxer. | 367 // Read a WebM file into memory and send the data to the demuxer. |
| 373 ReadTestDataFile(filename, &buffer, &buffer_size); | 368 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); |
| 374 if (!AppendDataInPieces(buffer.get(), buffer_size, 512)) | 369 if (!AppendDataInPieces(buffer->GetData(), buffer->GetDataSize(), 512)) |
| 375 return false; | 370 return false; |
| 376 | 371 |
| 377 scoped_refptr<DemuxerStream> audio = | 372 scoped_refptr<DemuxerStream> audio = |
| 378 demuxer_->GetStream(DemuxerStream::AUDIO); | 373 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 379 scoped_refptr<DemuxerStream> video = | 374 scoped_refptr<DemuxerStream> video = |
| 380 demuxer_->GetStream(DemuxerStream::VIDEO); | 375 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 381 | 376 |
| 382 // Verify that the timestamps on the first few packets match what we | 377 // Verify that the timestamps on the first few packets match what we |
| 383 // expect. | 378 // expect. |
| 384 for (size_t i = 0; | 379 for (size_t i = 0; |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 } | 758 } |
| 764 | 759 |
| 765 // Check to see if |audio_read_done_| and |video_read_done_| variables | 760 // Check to see if |audio_read_done_| and |video_read_done_| variables |
| 766 // match |expected|. | 761 // match |expected|. |
| 767 void CheckIfReadDonesWereCalled(bool expected) { | 762 void CheckIfReadDonesWereCalled(bool expected) { |
| 768 EXPECT_EQ(expected, audio_read_done_); | 763 EXPECT_EQ(expected, audio_read_done_); |
| 769 EXPECT_EQ(expected, video_read_done_); | 764 EXPECT_EQ(expected, video_read_done_); |
| 770 } | 765 } |
| 771 | 766 |
| 772 private: | 767 private: |
| 773 static void OnEndOfStreamReadDone(bool* called, | 768 static void OnEndOfStreamReadDone( |
| 774 const scoped_refptr<Buffer>& buffer) { | 769 bool* called, const scoped_refptr<DecoderBuffer>& buffer) { |
| 775 EXPECT_TRUE(buffer->IsEndOfStream()); | 770 EXPECT_TRUE(buffer->IsEndOfStream()); |
| 776 *called = true; | 771 *called = true; |
| 777 } | 772 } |
| 778 | 773 |
| 779 scoped_refptr<Demuxer> demuxer_; | 774 scoped_refptr<Demuxer> demuxer_; |
| 780 bool audio_read_done_; | 775 bool audio_read_done_; |
| 781 bool video_read_done_; | 776 bool video_read_done_; |
| 782 | 777 |
| 783 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); | 778 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
| 784 }; | 779 }; |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1072 | 1067 |
| 1073 std::vector<std::string> codecs(1); | 1068 std::vector<std::string> codecs(1); |
| 1074 codecs[0] = "vp8"; | 1069 codecs[0] = "vp8"; |
| 1075 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), | 1070 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
| 1076 ChunkDemuxer::kOk); | 1071 ChunkDemuxer::kOk); |
| 1077 | 1072 |
| 1078 ASSERT_TRUE(AppendInfoTracks(true, true, false)); | 1073 ASSERT_TRUE(AppendInfoTracks(true, true, false)); |
| 1079 } | 1074 } |
| 1080 | 1075 |
| 1081 } // namespace media | 1076 } // namespace media |
| OLD | NEW |