Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/mock_callback.h" | 7 #include "media/base/mock_callback.h" |
| 8 #include "media/base/mock_demuxer_host.h" | 8 #include "media/base/mock_demuxer_host.h" |
| 9 #include "media/base/test_data_util.h" | 9 #include "media/base/test_data_util.h" |
| 10 #include "media/filters/chunk_demuxer.h" | 10 #include "media/filters/chunk_demuxer.h" |
| 11 #include "media/filters/chunk_demuxer_client.h" | 11 #include "media/filters/chunk_demuxer_client.h" |
| 12 #include "media/webm/cluster_builder.h" | 12 #include "media/webm/cluster_builder.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 using ::testing::AnyNumber; | 15 using ::testing::AnyNumber; |
| 16 using ::testing::InSequence; | 16 using ::testing::InSequence; |
| 17 using ::testing::Return; | 17 using ::testing::Return; |
| 18 using ::testing::SetArgumentPointee; | 18 using ::testing::SetArgumentPointee; |
| 19 using ::testing::NiceMock; | |
| 20 using ::testing::_; | 19 using ::testing::_; |
| 21 | 20 |
| 22 namespace media { | 21 namespace media { |
| 23 | 22 |
| 24 static const uint8 kTracksHeader[] = { | 23 static const uint8 kTracksHeader[] = { |
| 25 0x16, 0x54, 0xAE, 0x6B, // Tracks ID | 24 0x16, 0x54, 0xAE, 0x6B, // Tracks ID |
| 26 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0) | 25 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0) |
| 27 }; | 26 }; |
| 28 | 27 |
| 29 static const int kTracksHeaderSize = sizeof(kTracksHeader); | 28 static const int kTracksHeaderSize = sizeof(kTracksHeader); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 uint8 data[] = { 0x00 }; | 184 uint8 data[] = { 0x00 }; |
| 186 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); | 185 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); |
| 187 } | 186 } |
| 188 | 187 |
| 189 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode, | 188 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode, |
| 190 int size) { | 189 int size) { |
| 191 scoped_array<uint8> data(new uint8[size]); | 190 scoped_array<uint8> data(new uint8[size]); |
| 192 cb->AddSimpleBlock(track_num, timecode, 0, data.get(), size); | 191 cb->AddSimpleBlock(track_num, timecode, 0, data.get(), size); |
| 193 } | 192 } |
| 194 | 193 |
| 194 MOCK_METHOD1(OnRead, void(int64 timestamp_in_ms)); | |
| 195 | |
| 196 void ReadDone(const scoped_refptr<Buffer>& buffer) { | |
| 197 int64 ts = buffer->GetTimestamp().InMilliseconds(); | |
| 198 EXPECT_FALSE(buffer->IsEndOfStream()); | |
| 199 OnRead(ts); | |
| 200 } | |
| 201 | |
| 202 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { | |
| 203 EXPECT_CALL(*this, OnRead(timestamp_in_ms)); | |
|
scherkus (not reviewing)
2011/12/20 18:26:17
alternatively I *think* you can declare a gmock ma
acolwell GONE FROM CHROMIUM
2011/12/20 19:11:53
Nice! Done.
| |
| 204 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | |
| 205 base::Unretained(this))); | |
| 206 } | |
| 207 | |
| 195 MOCK_METHOD1(Checkpoint, void(int id)); | 208 MOCK_METHOD1(Checkpoint, void(int id)); |
| 196 | 209 |
| 197 MockDemuxerHost mock_demuxer_host_; | 210 MockDemuxerHost mock_demuxer_host_; |
| 198 | 211 |
| 199 scoped_ptr<MockChunkDemuxerClient> client_; | 212 scoped_ptr<MockChunkDemuxerClient> client_; |
| 200 scoped_refptr<ChunkDemuxer> demuxer_; | 213 scoped_refptr<ChunkDemuxer> demuxer_; |
| 201 | 214 |
| 202 private: | 215 private: |
| 203 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 216 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
| 204 }; | 217 }; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 AddSimpleBlock(&cb, kVideoTrackNum, 0); | 283 AddSimpleBlock(&cb, kVideoTrackNum, 0); |
| 271 scoped_ptr<Cluster> cluster(cb.Finish()); | 284 scoped_ptr<Cluster> cluster(cb.Finish()); |
| 272 | 285 |
| 273 Checkpoint(1); | 286 Checkpoint(1); |
| 274 | 287 |
| 275 AppendData(cluster->data(), cluster->size()); | 288 AppendData(cluster->data(), cluster->size()); |
| 276 | 289 |
| 277 Checkpoint(2); | 290 Checkpoint(2); |
| 278 } | 291 } |
| 279 | 292 |
| 293 // Test the case where a Seek() is requested while the parser | |
| 294 // is in the middle of cluster. This is to verify that the parser | |
| 295 // resets itself on seek and is in the right state when data from | |
| 296 // the new seek point arrives. | |
| 297 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) { | |
| 298 InitDemuxer(true, true); | |
| 299 | |
| 300 scoped_refptr<DemuxerStream> audio = | |
| 301 demuxer_->GetStream(DemuxerStream::AUDIO); | |
| 302 scoped_refptr<DemuxerStream> video = | |
| 303 demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 304 | |
| 305 InSequence s; | |
| 306 | |
| 307 ClusterBuilder cb; | |
| 308 cb.SetClusterTimecode(0); | |
| 309 AddSimpleBlock(&cb, kAudioTrackNum, 1); | |
| 310 AddSimpleBlock(&cb, kVideoTrackNum, 2); | |
| 311 AddSimpleBlock(&cb, kAudioTrackNum, 10); | |
| 312 AddSimpleBlock(&cb, kVideoTrackNum, 20); | |
| 313 scoped_ptr<Cluster> clusterA(cb.Finish()); | |
|
scherkus (not reviewing)
2011/12/20 18:26:17
clusterA -> cluster_a
acolwell GONE FROM CHROMIUM
2011/12/20 19:11:53
Done & fixed all other instances in this file.
| |
| 314 | |
| 315 cb.SetClusterTimecode(5000); | |
| 316 AddSimpleBlock(&cb, kAudioTrackNum, 5000); | |
| 317 AddSimpleBlock(&cb, kVideoTrackNum, 5005); | |
| 318 AddSimpleBlock(&cb, kAudioTrackNum, 5007); | |
| 319 AddSimpleBlock(&cb, kVideoTrackNum, 5035); | |
| 320 scoped_ptr<Cluster> clusterB(cb.Finish()); | |
|
scherkus (not reviewing)
2011/12/20 18:26:17
ditto
acolwell GONE FROM CHROMIUM
2011/12/20 19:11:53
Done.
| |
| 321 | |
| 322 // Append all but the last byte so that everything but | |
| 323 // the last block can be parsed. | |
| 324 AppendData(clusterA->data(), clusterA->size() - 1); | |
| 325 | |
| 326 ExpectRead(audio, 1); | |
| 327 ExpectRead(video, 2); | |
| 328 ExpectRead(audio, 10); | |
| 329 | |
| 330 demuxer_->FlushData(); | |
| 331 demuxer_->Seek(base::TimeDelta::FromSeconds(5), | |
| 332 NewExpectedStatusCB(PIPELINE_OK)); | |
| 333 | |
| 334 | |
| 335 // Append the new cluster and verify that only the blocks | |
| 336 // in the new cluster are returned. | |
| 337 AppendData(clusterB->data(), clusterB->size()); | |
| 338 ExpectRead(audio, 5000); | |
| 339 ExpectRead(video, 5005); | |
| 340 ExpectRead(audio, 5007); | |
| 341 ExpectRead(video, 5035); | |
| 342 } | |
| 343 | |
| 280 // Test the case where AppendData() is called before Init(). | 344 // Test the case where AppendData() is called before Init(). |
| 281 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { | 345 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { |
| 282 scoped_array<uint8> info_tracks; | 346 scoped_array<uint8> info_tracks; |
| 283 int info_tracks_size = 0; | 347 int info_tracks_size = 0; |
| 284 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size); | 348 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size); |
| 285 | 349 |
| 286 EXPECT_FALSE(demuxer_->AppendData(info_tracks.get(), info_tracks_size)); | 350 EXPECT_FALSE(demuxer_->AppendData(info_tracks.get(), info_tracks_size)); |
| 287 } | 351 } |
| 288 | 352 |
| 289 static void OnReadDone(const base::TimeDelta& expected_time, | 353 static void OnReadDone(const base::TimeDelta& expected_time, |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 772 base::TimeDelta::FromMilliseconds( | 836 base::TimeDelta::FromMilliseconds( |
| 773 buffer_timestamps[i].video_time), | 837 buffer_timestamps[i].video_time), |
| 774 &video_read_done)); | 838 &video_read_done)); |
| 775 | 839 |
| 776 EXPECT_TRUE(audio_read_done); | 840 EXPECT_TRUE(audio_read_done); |
| 777 EXPECT_TRUE(video_read_done); | 841 EXPECT_TRUE(video_read_done); |
| 778 } | 842 } |
| 779 } | 843 } |
| 780 | 844 |
| 781 } // namespace media | 845 } // namespace media |
| OLD | NEW |