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 <algorithm> | 5 #include <algorithm> |
| 6 #include <deque> | 6 #include <deque> |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 FFmpegDemuxerTest() {} | 65 FFmpegDemuxerTest() {} |
| 66 | 66 |
| 67 virtual ~FFmpegDemuxerTest() { | 67 virtual ~FFmpegDemuxerTest() { |
| 68 if (demuxer_) { | 68 if (demuxer_) { |
| 69 WaitableMessageLoopEvent event; | 69 WaitableMessageLoopEvent event; |
| 70 demuxer_->Stop(event.GetClosure()); | 70 demuxer_->Stop(event.GetClosure()); |
| 71 event.RunAndWait(); | 71 event.RunAndWait(); |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 void CreateDemuxer(const std::string& name) { | 75 void CreateDemuxerText(const std::string& name, bool enable_text) { |
| 76 CHECK(!demuxer_); | 76 CHECK(!demuxer_); |
| 77 | 77 |
| 78 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); | 78 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); |
| 79 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); | 79 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); |
| 80 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); | 80 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); |
| 81 | 81 |
| 82 CreateDataSource(name); | 82 CreateDataSource(name); |
| 83 | 83 |
| 84 Demuxer::NeedKeyCB need_key_cb = | 84 Demuxer::NeedKeyCB need_key_cb = |
| 85 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this)); | 85 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this)); |
| 86 | |
| 87 media::FFmpegAddTextTrackCB add_text_track_cb; | |
| 88 if (enable_text) { | |
| 89 add_text_track_cb = | |
| 90 base::Bind(&FFmpegDemuxerTest::AddTextTrackCB, | |
| 91 base::Unretained(this)); | |
| 92 } | |
| 93 | |
| 86 demuxer_.reset(new FFmpegDemuxer(message_loop_.message_loop_proxy(), | 94 demuxer_.reset(new FFmpegDemuxer(message_loop_.message_loop_proxy(), |
| 87 data_source_.get(), | 95 data_source_.get(), |
| 88 need_key_cb, | 96 need_key_cb, |
| 97 add_text_track_cb, | |
| 89 new MediaLog())); | 98 new MediaLog())); |
| 90 } | 99 } |
| 91 | 100 |
| 101 void CreateDemuxer(const std::string& name) { | |
| 102 CreateDemuxerText(name, false); | |
| 103 } | |
| 104 | |
| 92 MOCK_METHOD1(CheckPoint, void(int v)); | 105 MOCK_METHOD1(CheckPoint, void(int v)); |
| 93 | 106 |
| 94 void InitializeDemuxer() { | 107 void InitializeDemuxer() { |
| 95 EXPECT_CALL(host_, SetDuration(_)); | 108 EXPECT_CALL(host_, SetDuration(_)); |
| 96 WaitableMessageLoopEvent event; | 109 WaitableMessageLoopEvent event; |
| 97 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); | 110 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); |
| 98 event.RunAndWaitForStatus(PIPELINE_OK); | 111 event.RunAndWaitForStatus(PIPELINE_OK); |
| 99 } | 112 } |
| 100 | 113 |
| 101 MOCK_METHOD2(OnReadDoneCalled, void(int, int64)); | 114 MOCK_METHOD2(OnReadDoneCalled, void(int, int64)); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use | 147 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use |
| 135 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). | 148 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). |
| 136 MOCK_METHOD3(NeedKeyCBMock, void(const std::string& type, | 149 MOCK_METHOD3(NeedKeyCBMock, void(const std::string& type, |
| 137 const uint8* init_data, int init_data_size)); | 150 const uint8* init_data, int init_data_size)); |
| 138 void NeedKeyCB(const std::string& type, | 151 void NeedKeyCB(const std::string& type, |
| 139 const std::vector<uint8>& init_data) { | 152 const std::vector<uint8>& init_data) { |
| 140 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 153 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
| 141 NeedKeyCBMock(type, init_data_ptr, init_data.size()); | 154 NeedKeyCBMock(type, init_data_ptr, init_data.size()); |
| 142 } | 155 } |
| 143 | 156 |
| 157 void AddTextTrackCB(media::TextKind kind, | |
| 158 const std::string& label, | |
| 159 const std::string& language, | |
| 160 int index) { | |
| 161 } | |
| 162 | |
| 144 // Accessor to demuxer internals. | 163 // Accessor to demuxer internals. |
| 145 void set_duration_known(bool duration_known) { | 164 void set_duration_known(bool duration_known) { |
| 146 demuxer_->duration_known_ = duration_known; | 165 demuxer_->duration_known_ = duration_known; |
| 147 } | 166 } |
| 148 | 167 |
| 149 bool IsStreamStopped(DemuxerStream::Type type) { | 168 bool IsStreamStopped(DemuxerStream::Type type) { |
| 150 DemuxerStream* stream = demuxer_->GetStream(type); | 169 DemuxerStream* stream = demuxer_->GetStream(type); |
| 151 CHECK(stream); | 170 CHECK(stream); |
| 152 return !static_cast<FFmpegDemuxerStream*>(stream)->demuxer_; | 171 return !static_cast<FFmpegDemuxerStream*>(stream)->demuxer_; |
| 153 } | 172 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 291 // Audio stream should be Vorbis. | 310 // Audio stream should be Vorbis. |
| 292 stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 311 stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 293 ASSERT_TRUE(stream); | 312 ASSERT_TRUE(stream); |
| 294 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | 313 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 295 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); | 314 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); |
| 296 | 315 |
| 297 // Unknown stream should never be present. | 316 // Unknown stream should never be present. |
| 298 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | 317 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); |
| 299 } | 318 } |
| 300 | 319 |
| 320 TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) { | |
| 321 // Open a file containing the following streams: | |
| 322 // Stream #0: Video (VP8) | |
| 323 // Stream #1: Audio (Vorbis) | |
| 324 // Stream #2: Text (WebVTT) | |
| 325 | |
| 326 CreateDemuxerText("bear-vp8-webvtt.webm", true); | |
| 327 InitializeDemuxer(); | |
| 328 | |
| 329 // Video stream should be VP8. | |
| 330 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 331 ASSERT_TRUE(stream); | |
| 332 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | |
| 333 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); | |
| 334 | |
| 335 // Audio stream should be Vorbis. | |
| 336 stream = demuxer_->GetStream(DemuxerStream::AUDIO); | |
| 337 ASSERT_TRUE(stream); | |
| 338 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | |
| 339 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); | |
| 340 | |
| 341 // Text stream should also be present. | |
| 342 stream = demuxer_->GetStream(DemuxerStream::TEXT); | |
| 343 ASSERT_TRUE(stream); | |
| 344 EXPECT_EQ(DemuxerStream::TEXT, stream->type()); | |
| 345 | |
| 346 // Unknown stream should never be present. | |
| 347 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | |
| 348 } | |
| 349 | |
| 350 // TODO(matthewjheaney): Enable this test when the binary file lands. | |
| 351 TEST_F(FFmpegDemuxerTest, DISABLED_Initialize_MultitrackTwoTextStreams) { | |
| 352 // Open a file containing the following streams: | |
| 353 // Stream #0: Video (VP8) | |
| 354 // Stream #1: Audio (Vorbis) | |
| 355 // Stream #2: Text (WebVTT) | |
| 356 // Stream #3: Text (WebVTT) | |
| 357 | |
| 358 CreateDemuxerText("bear-vp8-webvtt2.webm", true); | |
| 359 InitializeDemuxer(); | |
| 360 | |
| 361 int stream_count = demuxer_->GetStreamCount(); | |
| 362 EXPECT_EQ(4, stream_count); | |
|
acolwell GONE FROM CHROMIUM
2013/09/12 00:15:15
nit: inline here since the count isn't used anywhe
Matthew Heaney (Chromium)
2013/09/13 19:51:54
Done.
Matthew Heaney (Chromium)
2013/09/20 23:53:54
This is OBE anyway, since GetStreamCount and frien
| |
| 363 | |
| 364 // Video stream should be VP8. | |
| 365 DemuxerStream* stream = demuxer_->GetStreamByIndex(0); | |
| 366 ASSERT_TRUE(stream); | |
| 367 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | |
| 368 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); | |
| 369 | |
| 370 // Audio stream should be Vorbis. | |
| 371 stream = demuxer_->GetStreamByIndex(1); | |
| 372 ASSERT_TRUE(stream); | |
| 373 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | |
| 374 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); | |
| 375 | |
| 376 // First text stream should be present. | |
| 377 stream = demuxer_->GetStreamByIndex(2); | |
| 378 ASSERT_TRUE(stream); | |
| 379 EXPECT_EQ(DemuxerStream::TEXT, stream->type()); | |
| 380 | |
| 381 // Second text stream should be present. | |
| 382 stream = demuxer_->GetStreamByIndex(3); | |
| 383 ASSERT_TRUE(stream); | |
| 384 EXPECT_EQ(DemuxerStream::TEXT, stream->type()); | |
| 385 | |
| 386 // Unknown stream should never be present. | |
| 387 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | |
| 388 } | |
| 389 | |
| 301 TEST_F(FFmpegDemuxerTest, Initialize_Encrypted) { | 390 TEST_F(FFmpegDemuxerTest, Initialize_Encrypted) { |
| 302 EXPECT_CALL(*this, NeedKeyCBMock(kWebMEncryptInitDataType, NotNull(), | 391 EXPECT_CALL(*this, NeedKeyCBMock(kWebMEncryptInitDataType, NotNull(), |
| 303 DecryptConfig::kDecryptionKeySize)) | 392 DecryptConfig::kDecryptionKeySize)) |
| 304 .Times(Exactly(2)); | 393 .Times(Exactly(2)); |
| 305 | 394 |
| 306 CreateDemuxer("bear-320x240-av_enc-av.webm"); | 395 CreateDemuxer("bear-320x240-av_enc-av.webm"); |
| 307 InitializeDemuxer(); | 396 InitializeDemuxer(); |
| 308 } | 397 } |
| 309 | 398 |
| 310 TEST_F(FFmpegDemuxerTest, Read_Audio) { | 399 TEST_F(FFmpegDemuxerTest, Read_Audio) { |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { | 665 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { |
| 577 #if !defined(USE_PROPRIETARY_CODECS) | 666 #if !defined(USE_PROPRIETARY_CODECS) |
| 578 return; | 667 return; |
| 579 #endif | 668 #endif |
| 580 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); | 669 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); |
| 581 InitializeDemuxer(); | 670 InitializeDemuxer(); |
| 582 ReadUntilEndOfStream(); | 671 ReadUntilEndOfStream(); |
| 583 } | 672 } |
| 584 | 673 |
| 585 } // namespace media | 674 } // namespace media |
| OLD | NEW |