| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <deque> | 9 #include <deque> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); | 98 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); |
| 99 | 99 |
| 100 Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind( | 100 Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind( |
| 101 &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this)); | 101 &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this)); |
| 102 | 102 |
| 103 demuxer_.reset(new FFmpegDemuxer( | 103 demuxer_.reset(new FFmpegDemuxer( |
| 104 message_loop_.task_runner(), data_source_.get(), | 104 message_loop_.task_runner(), data_source_.get(), |
| 105 encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog())); | 105 encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog())); |
| 106 } | 106 } |
| 107 | 107 |
| 108 DemuxerStream* GetStream(DemuxerStream::Type type) { |
| 109 std::vector<DemuxerStream*> streams = demuxer_->GetStreams(); |
| 110 for (const auto& s : streams) { |
| 111 if (s->type() == type) |
| 112 return s; |
| 113 } |
| 114 return nullptr; |
| 115 } |
| 116 |
| 108 MOCK_METHOD1(CheckPoint, void(int v)); | 117 MOCK_METHOD1(CheckPoint, void(int v)); |
| 109 | 118 |
| 110 void InitializeDemuxerInternal(bool enable_text, | 119 void InitializeDemuxerInternal(bool enable_text, |
| 111 media::PipelineStatus expected_pipeline_status, | 120 media::PipelineStatus expected_pipeline_status, |
| 112 base::Time timeline_offset) { | 121 base::Time timeline_offset) { |
| 113 if (expected_pipeline_status == PIPELINE_OK) | 122 if (expected_pipeline_status == PIPELINE_OK) |
| 114 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); | 123 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); |
| 115 WaitableMessageLoopEvent event; | 124 WaitableMessageLoopEvent event; |
| 116 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), enable_text); | 125 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), enable_text); |
| 117 demuxer_->timeline_offset_ = timeline_offset; | 126 demuxer_->timeline_offset_ = timeline_offset; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 media_tracks_ = std::move(tracks); | 231 media_tracks_ = std::move(tracks); |
| 223 } | 232 } |
| 224 | 233 |
| 225 // Accessor to demuxer internals. | 234 // Accessor to demuxer internals. |
| 226 void SetDurationKnown(bool duration_known) { | 235 void SetDurationKnown(bool duration_known) { |
| 227 demuxer_->duration_known_ = duration_known; | 236 demuxer_->duration_known_ = duration_known; |
| 228 if (!duration_known) | 237 if (!duration_known) |
| 229 demuxer_->duration_ = kInfiniteDuration; | 238 demuxer_->duration_ = kInfiniteDuration; |
| 230 } | 239 } |
| 231 | 240 |
| 232 bool IsStreamStopped(DemuxerStream::Type type) { | |
| 233 DemuxerStream* stream = demuxer_->GetStream(type); | |
| 234 CHECK(stream); | |
| 235 return !static_cast<FFmpegDemuxerStream*>(stream)->demuxer_; | |
| 236 } | |
| 237 | |
| 238 // Fixture members. | 241 // Fixture members. |
| 239 std::unique_ptr<FileDataSource> data_source_; | 242 std::unique_ptr<FileDataSource> data_source_; |
| 240 std::unique_ptr<FFmpegDemuxer> demuxer_; | 243 std::unique_ptr<FFmpegDemuxer> demuxer_; |
| 241 StrictMock<MockDemuxerHost> host_; | 244 StrictMock<MockDemuxerHost> host_; |
| 242 std::unique_ptr<MediaTracks> media_tracks_; | 245 std::unique_ptr<MediaTracks> media_tracks_; |
| 243 base::MessageLoop message_loop_; | 246 base::MessageLoop message_loop_; |
| 244 | 247 |
| 245 AVFormatContext* format_context() { | 248 AVFormatContext* format_context() { |
| 246 return demuxer_->glue_->format_context(); | 249 return demuxer_->glue_->format_context(); |
| 247 } | 250 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 WaitableMessageLoopEvent event; | 315 WaitableMessageLoopEvent event; |
| 313 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), true); | 316 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), true); |
| 314 event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | 317 event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
| 315 } | 318 } |
| 316 | 319 |
| 317 TEST_F(FFmpegDemuxerTest, Initialize_Successful) { | 320 TEST_F(FFmpegDemuxerTest, Initialize_Successful) { |
| 318 CreateDemuxer("bear-320x240.webm"); | 321 CreateDemuxer("bear-320x240.webm"); |
| 319 InitializeDemuxer(); | 322 InitializeDemuxer(); |
| 320 | 323 |
| 321 // Video stream should be present. | 324 // Video stream should be present. |
| 322 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 325 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 323 ASSERT_TRUE(stream); | 326 ASSERT_TRUE(stream); |
| 324 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | 327 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); |
| 325 | 328 |
| 326 const VideoDecoderConfig& video_config = stream->video_decoder_config(); | 329 const VideoDecoderConfig& video_config = stream->video_decoder_config(); |
| 327 EXPECT_EQ(kCodecVP8, video_config.codec()); | 330 EXPECT_EQ(kCodecVP8, video_config.codec()); |
| 328 EXPECT_EQ(PIXEL_FORMAT_YV12, video_config.format()); | 331 EXPECT_EQ(PIXEL_FORMAT_YV12, video_config.format()); |
| 329 EXPECT_EQ(320, video_config.coded_size().width()); | 332 EXPECT_EQ(320, video_config.coded_size().width()); |
| 330 EXPECT_EQ(240, video_config.coded_size().height()); | 333 EXPECT_EQ(240, video_config.coded_size().height()); |
| 331 EXPECT_EQ(0, video_config.visible_rect().x()); | 334 EXPECT_EQ(0, video_config.visible_rect().x()); |
| 332 EXPECT_EQ(0, video_config.visible_rect().y()); | 335 EXPECT_EQ(0, video_config.visible_rect().y()); |
| 333 EXPECT_EQ(320, video_config.visible_rect().width()); | 336 EXPECT_EQ(320, video_config.visible_rect().width()); |
| 334 EXPECT_EQ(240, video_config.visible_rect().height()); | 337 EXPECT_EQ(240, video_config.visible_rect().height()); |
| 335 EXPECT_EQ(320, video_config.natural_size().width()); | 338 EXPECT_EQ(320, video_config.natural_size().width()); |
| 336 EXPECT_EQ(240, video_config.natural_size().height()); | 339 EXPECT_EQ(240, video_config.natural_size().height()); |
| 337 EXPECT_TRUE(video_config.extra_data().empty()); | 340 EXPECT_TRUE(video_config.extra_data().empty()); |
| 338 | 341 |
| 339 // Audio stream should be present. | 342 // Audio stream should be present. |
| 340 stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 343 stream = GetStream(DemuxerStream::AUDIO); |
| 341 ASSERT_TRUE(stream); | 344 ASSERT_TRUE(stream); |
| 342 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | 345 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 343 | 346 |
| 344 const AudioDecoderConfig& audio_config = stream->audio_decoder_config(); | 347 const AudioDecoderConfig& audio_config = stream->audio_decoder_config(); |
| 345 EXPECT_EQ(kCodecVorbis, audio_config.codec()); | 348 EXPECT_EQ(kCodecVorbis, audio_config.codec()); |
| 346 EXPECT_EQ(32, audio_config.bits_per_channel()); | 349 EXPECT_EQ(32, audio_config.bits_per_channel()); |
| 347 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); | 350 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); |
| 348 EXPECT_EQ(44100, audio_config.samples_per_second()); | 351 EXPECT_EQ(44100, audio_config.samples_per_second()); |
| 349 EXPECT_EQ(kSampleFormatPlanarF32, audio_config.sample_format()); | 352 EXPECT_EQ(kSampleFormatPlanarF32, audio_config.sample_format()); |
| 350 EXPECT_FALSE(audio_config.extra_data().empty()); | 353 EXPECT_FALSE(audio_config.extra_data().empty()); |
| 351 | 354 |
| 352 // Unknown stream should never be present. | 355 // Unknown stream should never be present. |
| 353 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | 356 EXPECT_EQ(2u, demuxer_->GetStreams().size()); |
| 354 } | 357 } |
| 355 | 358 |
| 356 TEST_F(FFmpegDemuxerTest, Initialize_Multitrack) { | 359 TEST_F(FFmpegDemuxerTest, Initialize_Multitrack) { |
| 357 // Open a file containing the following streams: | 360 // Open a file containing the following streams: |
| 358 // Stream #0: Video (VP8) | 361 // Stream #0: Video (VP8) |
| 359 // Stream #1: Audio (Vorbis) | 362 // Stream #1: Audio (Vorbis) |
| 360 // Stream #2: Subtitles (SRT) | 363 // Stream #2: Subtitles (SRT) |
| 361 // Stream #3: Video (Theora) | 364 // Stream #3: Video (Theora) |
| 362 // Stream #4: Audio (16-bit signed little endian PCM) | 365 // Stream #4: Audio (16-bit signed little endian PCM) |
| 363 // | |
| 364 // We should only pick the first audio/video streams we come across. | |
| 365 CreateDemuxer("bear-320x240-multitrack.webm"); | 366 CreateDemuxer("bear-320x240-multitrack.webm"); |
| 366 InitializeDemuxer(); | 367 InitializeDemuxer(); |
| 367 | 368 |
| 368 // Video stream should be VP8. | 369 std::vector<DemuxerStream*> streams = demuxer_->GetStreams(); |
| 369 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 370 EXPECT_EQ(4u, streams.size()); |
| 371 |
| 372 // Stream #0 should be VP8 video. |
| 373 DemuxerStream* stream = streams[0]; |
| 370 ASSERT_TRUE(stream); | 374 ASSERT_TRUE(stream); |
| 371 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | 375 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); |
| 372 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); | 376 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); |
| 373 | 377 |
| 374 // Audio stream should be Vorbis. | 378 // Stream #1 should be Vorbis audio. |
| 375 stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 379 stream = streams[1]; |
| 376 ASSERT_TRUE(stream); | 380 ASSERT_TRUE(stream); |
| 377 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | 381 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 378 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); | 382 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); |
| 379 | 383 |
| 380 // Unknown stream should never be present. | 384 // The subtitles stream is skipped. |
| 381 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | 385 // Stream #2 should be Theora video. |
| 386 stream = streams[2]; |
| 387 ASSERT_TRUE(stream); |
| 388 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); |
| 389 EXPECT_EQ(kCodecTheora, stream->video_decoder_config().codec()); |
| 390 |
| 391 // Stream #3 should be PCM audio. |
| 392 stream = streams[3]; |
| 393 ASSERT_TRUE(stream); |
| 394 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 395 EXPECT_EQ(kCodecPCM, stream->audio_decoder_config().codec()); |
| 382 } | 396 } |
| 383 | 397 |
| 384 TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) { | 398 TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) { |
| 385 // Open a file containing the following streams: | 399 // Open a file containing the following streams: |
| 386 // Stream #0: Video (VP8) | 400 // Stream #0: Video (VP8) |
| 387 // Stream #1: Audio (Vorbis) | 401 // Stream #1: Audio (Vorbis) |
| 388 // Stream #2: Text (WebVTT) | 402 // Stream #2: Text (WebVTT) |
| 389 | 403 |
| 390 CreateDemuxer("bear-vp8-webvtt.webm"); | 404 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 391 DemuxerStream* text_stream = NULL; | 405 DemuxerStream* text_stream = NULL; |
| 392 EXPECT_CALL(host_, AddTextStream(_, _)) | 406 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 393 .WillOnce(SaveArg<0>(&text_stream)); | 407 .WillOnce(SaveArg<0>(&text_stream)); |
| 394 InitializeDemuxerWithText(); | 408 InitializeDemuxerWithText(); |
| 395 ASSERT_TRUE(text_stream); | 409 ASSERT_TRUE(text_stream); |
| 396 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 410 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 397 | 411 |
| 398 // Video stream should be VP8. | 412 // Video stream should be VP8. |
| 399 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 413 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 400 ASSERT_TRUE(stream); | 414 ASSERT_TRUE(stream); |
| 401 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | 415 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); |
| 402 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); | 416 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); |
| 403 | 417 |
| 404 // Audio stream should be Vorbis. | 418 // Audio stream should be Vorbis. |
| 405 stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 419 stream = GetStream(DemuxerStream::AUDIO); |
| 406 ASSERT_TRUE(stream); | 420 ASSERT_TRUE(stream); |
| 407 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | 421 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 408 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); | 422 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); |
| 409 | 423 |
| 410 // Unknown stream should never be present. | 424 EXPECT_EQ(3u, demuxer_->GetStreams().size()); |
| 411 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN)); | |
| 412 } | 425 } |
| 413 | 426 |
| 414 TEST_F(FFmpegDemuxerTest, Initialize_Encrypted) { | 427 TEST_F(FFmpegDemuxerTest, Initialize_Encrypted) { |
| 415 EXPECT_CALL(*this, | 428 EXPECT_CALL(*this, |
| 416 OnEncryptedMediaInitData( | 429 OnEncryptedMediaInitData( |
| 417 EmeInitDataType::WEBM, | 430 EmeInitDataType::WEBM, |
| 418 std::vector<uint8_t>(kEncryptedMediaInitData, | 431 std::vector<uint8_t>(kEncryptedMediaInitData, |
| 419 kEncryptedMediaInitData + | 432 kEncryptedMediaInitData + |
| 420 arraysize(kEncryptedMediaInitData)))) | 433 arraysize(kEncryptedMediaInitData)))) |
| 421 .Times(Exactly(2)); | 434 .Times(Exactly(2)); |
| 422 | 435 |
| 423 CreateDemuxer("bear-320x240-av_enc-av.webm"); | 436 CreateDemuxer("bear-320x240-av_enc-av.webm"); |
| 424 InitializeDemuxer(); | 437 InitializeDemuxer(); |
| 425 } | 438 } |
| 426 | 439 |
| 427 TEST_F(FFmpegDemuxerTest, AbortPendingReads) { | 440 TEST_F(FFmpegDemuxerTest, AbortPendingReads) { |
| 428 // We test that on a successful audio packet read. | 441 // We test that on a successful audio packet read. |
| 429 CreateDemuxer("bear-320x240.webm"); | 442 CreateDemuxer("bear-320x240.webm"); |
| 430 InitializeDemuxer(); | 443 InitializeDemuxer(); |
| 431 | 444 |
| 432 // Attempt a read from the audio stream and run the message loop until done. | 445 // Attempt a read from the audio stream and run the message loop until done. |
| 433 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 446 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 434 | 447 |
| 435 // Depending on where in the reading process ffmpeg is, an error may cause the | 448 // Depending on where in the reading process ffmpeg is, an error may cause the |
| 436 // stream to be marked as EOF. Simulate this here to ensure it is properly | 449 // stream to be marked as EOF. Simulate this here to ensure it is properly |
| 437 // cleared by the AbortPendingReads() call. | 450 // cleared by the AbortPendingReads() call. |
| 438 format_context()->pb->eof_reached = 1; | 451 format_context()->pb->eof_reached = 1; |
| 439 audio->Read(NewReadCB(FROM_HERE, 29, 0, true, DemuxerStream::kAborted)); | 452 audio->Read(NewReadCB(FROM_HERE, 29, 0, true, DemuxerStream::kAborted)); |
| 440 demuxer_->AbortPendingReads(); | 453 demuxer_->AbortPendingReads(); |
| 441 base::RunLoop().Run(); | 454 base::RunLoop().Run(); |
| 442 | 455 |
| 443 // Additional reads should also be aborted (until a Seek()). | 456 // Additional reads should also be aborted (until a Seek()). |
| 444 audio->Read(NewReadCB(FROM_HERE, 29, 0, true, DemuxerStream::kAborted)); | 457 audio->Read(NewReadCB(FROM_HERE, 29, 0, true, DemuxerStream::kAborted)); |
| 445 base::RunLoop().Run(); | 458 base::RunLoop().Run(); |
| 446 | 459 |
| 447 // Ensure blocking thread has completed outstanding work. | 460 // Ensure blocking thread has completed outstanding work. |
| 448 demuxer_->Stop(); | 461 demuxer_->Stop(); |
| 449 EXPECT_EQ(format_context()->pb->eof_reached, 0); | 462 EXPECT_EQ(format_context()->pb->eof_reached, 0); |
| 450 | 463 |
| 451 // Calling abort after stop should not crash. | 464 // Calling abort after stop should not crash. |
| 452 demuxer_->AbortPendingReads(); | 465 demuxer_->AbortPendingReads(); |
| 453 demuxer_.reset(); | 466 demuxer_.reset(); |
| 454 } | 467 } |
| 455 | 468 |
| 456 TEST_F(FFmpegDemuxerTest, Read_Audio) { | 469 TEST_F(FFmpegDemuxerTest, Read_Audio) { |
| 457 // We test that on a successful audio packet read. | 470 // We test that on a successful audio packet read. |
| 458 CreateDemuxer("bear-320x240.webm"); | 471 CreateDemuxer("bear-320x240.webm"); |
| 459 InitializeDemuxer(); | 472 InitializeDemuxer(); |
| 460 | 473 |
| 461 // Attempt a read from the audio stream and run the message loop until done. | 474 // Attempt a read from the audio stream and run the message loop until done. |
| 462 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 475 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 463 | 476 |
| 464 audio->Read(NewReadCB(FROM_HERE, 29, 0, true)); | 477 audio->Read(NewReadCB(FROM_HERE, 29, 0, true)); |
| 465 base::RunLoop().Run(); | 478 base::RunLoop().Run(); |
| 466 | 479 |
| 467 audio->Read(NewReadCB(FROM_HERE, 27, 3000, true)); | 480 audio->Read(NewReadCB(FROM_HERE, 27, 3000, true)); |
| 468 base::RunLoop().Run(); | 481 base::RunLoop().Run(); |
| 469 | 482 |
| 470 EXPECT_EQ(22084, demuxer_->GetMemoryUsage()); | 483 EXPECT_EQ(22084, demuxer_->GetMemoryUsage()); |
| 471 } | 484 } |
| 472 | 485 |
| 473 TEST_F(FFmpegDemuxerTest, Read_Video) { | 486 TEST_F(FFmpegDemuxerTest, Read_Video) { |
| 474 // We test that on a successful video packet read. | 487 // We test that on a successful video packet read. |
| 475 CreateDemuxer("bear-320x240.webm"); | 488 CreateDemuxer("bear-320x240.webm"); |
| 476 InitializeDemuxer(); | 489 InitializeDemuxer(); |
| 477 | 490 |
| 478 // Attempt a read from the video stream and run the message loop until done. | 491 // Attempt a read from the video stream and run the message loop until done. |
| 479 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 492 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 480 | 493 |
| 481 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 494 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 482 base::RunLoop().Run(); | 495 base::RunLoop().Run(); |
| 483 | 496 |
| 484 video->Read(NewReadCB(FROM_HERE, 1057, 33000, false)); | 497 video->Read(NewReadCB(FROM_HERE, 1057, 33000, false)); |
| 485 base::RunLoop().Run(); | 498 base::RunLoop().Run(); |
| 486 | 499 |
| 487 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); | 500 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); |
| 488 } | 501 } |
| 489 | 502 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 502 | 515 |
| 503 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); | 516 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); |
| 504 base::RunLoop().Run(); | 517 base::RunLoop().Run(); |
| 505 } | 518 } |
| 506 | 519 |
| 507 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { | 520 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { |
| 508 CreateDemuxer("audio-start-time-only.webm"); | 521 CreateDemuxer("audio-start-time-only.webm"); |
| 509 InitializeDemuxer(); | 522 InitializeDemuxer(); |
| 510 // Video stream should be preferred for seeking even if video start time is | 523 // Video stream should be preferred for seeking even if video start time is |
| 511 // unknown. | 524 // unknown. |
| 512 DemuxerStream* vstream = demuxer_->GetStream(DemuxerStream::VIDEO); | 525 DemuxerStream* vstream = GetStream(DemuxerStream::VIDEO); |
| 513 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); | 526 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
| 514 } | 527 } |
| 515 | 528 |
| 516 TEST_F(FFmpegDemuxerTest, Seeking_PreferredStreamSelection) { | 529 TEST_F(FFmpegDemuxerTest, Seeking_PreferredStreamSelection) { |
| 517 const int64_t kTimelineOffsetMs = 1352550896000LL; | 530 const int64_t kTimelineOffsetMs = 1352550896000LL; |
| 518 | 531 |
| 519 // Test the start time is the first timestamp of the video and audio stream. | 532 // Test the start time is the first timestamp of the video and audio stream. |
| 520 CreateDemuxer("nonzero-start-time.webm"); | 533 CreateDemuxer("nonzero-start-time.webm"); |
| 521 InitializeDemuxerWithTimelineOffset( | 534 InitializeDemuxerWithTimelineOffset( |
| 522 base::Time::FromJsTime(kTimelineOffsetMs)); | 535 base::Time::FromJsTime(kTimelineOffsetMs)); |
| 523 | 536 |
| 524 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 537 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 525 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 538 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 526 | 539 |
| 527 const base::TimeDelta video_start_time = | 540 const base::TimeDelta video_start_time = |
| 528 base::TimeDelta::FromMicroseconds(400000); | 541 base::TimeDelta::FromMicroseconds(400000); |
| 529 const base::TimeDelta audio_start_time = | 542 const base::TimeDelta audio_start_time = |
| 530 base::TimeDelta::FromMicroseconds(396000); | 543 base::TimeDelta::FromMicroseconds(396000); |
| 531 | 544 |
| 532 // Seeking to a position lower than the start time of either stream should | 545 // Seeking to a position lower than the start time of either stream should |
| 533 // prefer video stream for seeking. | 546 // prefer video stream for seeking. |
| 534 EXPECT_EQ(video, preferred_seeking_stream(base::TimeDelta())); | 547 EXPECT_EQ(video, preferred_seeking_stream(base::TimeDelta())); |
| 535 // Seeking to a position that has audio data, but not video, should prefer | 548 // Seeking to a position that has audio data, but not video, should prefer |
| (...skipping 25 matching lines...) Expand all Loading... |
| 561 | 574 |
| 562 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { | 575 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { |
| 563 const int64_t kTimelineOffsetMs = 1352550896000LL; | 576 const int64_t kTimelineOffsetMs = 1352550896000LL; |
| 564 | 577 |
| 565 // Test the start time is the first timestamp of the video and audio stream. | 578 // Test the start time is the first timestamp of the video and audio stream. |
| 566 CreateDemuxer("nonzero-start-time.webm"); | 579 CreateDemuxer("nonzero-start-time.webm"); |
| 567 InitializeDemuxerWithTimelineOffset( | 580 InitializeDemuxerWithTimelineOffset( |
| 568 base::Time::FromJsTime(kTimelineOffsetMs)); | 581 base::Time::FromJsTime(kTimelineOffsetMs)); |
| 569 | 582 |
| 570 // Attempt a read from the video stream and run the message loop until done. | 583 // Attempt a read from the video stream and run the message loop until done. |
| 571 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 584 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 572 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 585 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 573 | 586 |
| 574 const base::TimeDelta video_start_time = | 587 const base::TimeDelta video_start_time = |
| 575 base::TimeDelta::FromMicroseconds(400000); | 588 base::TimeDelta::FromMicroseconds(400000); |
| 576 const base::TimeDelta audio_start_time = | 589 const base::TimeDelta audio_start_time = |
| 577 base::TimeDelta::FromMicroseconds(396000); | 590 base::TimeDelta::FromMicroseconds(396000); |
| 578 | 591 |
| 579 // Run the test twice with a seek in between. | 592 // Run the test twice with a seek in between. |
| 580 for (int i = 0; i < 2; ++i) { | 593 for (int i = 0; i < 2; ++i) { |
| 581 video->Read(NewReadCB(FROM_HERE, 5636, video_start_time.InMicroseconds(), | 594 video->Read(NewReadCB(FROM_HERE, 5636, video_start_time.InMicroseconds(), |
| 582 true)); | 595 true)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 600 } | 613 } |
| 601 | 614 |
| 602 TEST_F(FFmpegDemuxerTest, Read_AudioNoStartTime) { | 615 TEST_F(FFmpegDemuxerTest, Read_AudioNoStartTime) { |
| 603 // FFmpeg does not set timestamps when demuxing wave files. Ensure that the | 616 // FFmpeg does not set timestamps when demuxing wave files. Ensure that the |
| 604 // demuxer sets a start time of zero in this case. | 617 // demuxer sets a start time of zero in this case. |
| 605 CreateDemuxer("sfx_s24le.wav"); | 618 CreateDemuxer("sfx_s24le.wav"); |
| 606 InitializeDemuxer(); | 619 InitializeDemuxer(); |
| 607 | 620 |
| 608 // Run the test twice with a seek in between. | 621 // Run the test twice with a seek in between. |
| 609 for (int i = 0; i < 2; ++i) { | 622 for (int i = 0; i < 2; ++i) { |
| 610 demuxer_->GetStream(DemuxerStream::AUDIO) | 623 GetStream(DemuxerStream::AUDIO)->Read(NewReadCB(FROM_HERE, 4095, 0, true)); |
| 611 ->Read(NewReadCB(FROM_HERE, 4095, 0, true)); | |
| 612 base::RunLoop().Run(); | 624 base::RunLoop().Run(); |
| 613 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); | 625 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); |
| 614 | 626 |
| 615 // Seek back to the beginning and repeat the test. | 627 // Seek back to the beginning and repeat the test. |
| 616 WaitableMessageLoopEvent event; | 628 WaitableMessageLoopEvent event; |
| 617 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 629 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 618 event.RunAndWaitForStatus(PIPELINE_OK); | 630 event.RunAndWaitForStatus(PIPELINE_OK); |
| 619 } | 631 } |
| 620 } | 632 } |
| 621 | 633 |
| 622 // TODO(dalecurtis): Test is disabled since FFmpeg does not currently guarantee | 634 // TODO(dalecurtis): Test is disabled since FFmpeg does not currently guarantee |
| 623 // the order of demuxed packets in OGG containers. Re-enable and fix key frame | 635 // the order of demuxed packets in OGG containers. Re-enable and fix key frame |
| 624 // expectations once we decide to either workaround it or attempt a fix | 636 // expectations once we decide to either workaround it or attempt a fix |
| 625 // upstream. See http://crbug.com/387996. | 637 // upstream. See http://crbug.com/387996. |
| 626 TEST_F(FFmpegDemuxerTest, | 638 TEST_F(FFmpegDemuxerTest, |
| 627 DISABLED_Read_AudioNegativeStartTimeAndOggDiscard_Bear) { | 639 DISABLED_Read_AudioNegativeStartTimeAndOggDiscard_Bear) { |
| 628 // Many ogg files have negative starting timestamps, so ensure demuxing and | 640 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 629 // seeking work correctly with a negative start time. | 641 // seeking work correctly with a negative start time. |
| 630 CreateDemuxer("bear.ogv"); | 642 CreateDemuxer("bear.ogv"); |
| 631 InitializeDemuxer(); | 643 InitializeDemuxer(); |
| 632 | 644 |
| 633 // Attempt a read from the video stream and run the message loop until done. | 645 // Attempt a read from the video stream and run the message loop until done. |
| 634 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 646 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 635 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 647 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 636 | 648 |
| 637 // Run the test twice with a seek in between. | 649 // Run the test twice with a seek in between. |
| 638 for (int i = 0; i < 2; ++i) { | 650 for (int i = 0; i < 2; ++i) { |
| 639 audio->Read( | 651 audio->Read( |
| 640 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration, true)); | 652 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration, true)); |
| 641 base::RunLoop().Run(); | 653 base::RunLoop().Run(); |
| 642 audio->Read(NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, | 654 audio->Read(NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, |
| 643 kInfiniteDuration, true)); | 655 kInfiniteDuration, true)); |
| 644 base::RunLoop().Run(); | 656 base::RunLoop().Run(); |
| 645 audio->Read(NewReadCBWithCheckedDiscard( | 657 audio->Read(NewReadCBWithCheckedDiscard( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 670 // Same test above, but using sync2.ogv which has video stream muxed before the | 682 // Same test above, but using sync2.ogv which has video stream muxed before the |
| 671 // audio stream, so seeking based only on start time will fail since ffmpeg is | 683 // audio stream, so seeking based only on start time will fail since ffmpeg is |
| 672 // essentially just seeking based on file position. | 684 // essentially just seeking based on file position. |
| 673 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) { | 685 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) { |
| 674 // Many ogg files have negative starting timestamps, so ensure demuxing and | 686 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 675 // seeking work correctly with a negative start time. | 687 // seeking work correctly with a negative start time. |
| 676 CreateDemuxer("sync2.ogv"); | 688 CreateDemuxer("sync2.ogv"); |
| 677 InitializeDemuxer(); | 689 InitializeDemuxer(); |
| 678 | 690 |
| 679 // Attempt a read from the video stream and run the message loop until done. | 691 // Attempt a read from the video stream and run the message loop until done. |
| 680 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 692 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 681 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 693 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 682 | 694 |
| 683 // Run the test twice with a seek in between. | 695 // Run the test twice with a seek in between. |
| 684 for (int i = 0; i < 2; ++i) { | 696 for (int i = 0; i < 2; ++i) { |
| 685 audio->Read(NewReadCBWithCheckedDiscard( | 697 audio->Read(NewReadCBWithCheckedDiscard( |
| 686 FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902), true)); | 698 FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902), true)); |
| 687 base::RunLoop().Run(); | 699 base::RunLoop().Run(); |
| 688 | 700 |
| 689 audio->Read(NewReadCB(FROM_HERE, 1, 2902, true)); | 701 audio->Read(NewReadCB(FROM_HERE, 1, 2902, true)); |
| 690 base::RunLoop().Run(); | 702 base::RunLoop().Run(); |
| 691 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902), | 703 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 711 } | 723 } |
| 712 } | 724 } |
| 713 | 725 |
| 714 // Similar to the test above, but using an opus clip with a large amount of | 726 // Similar to the test above, but using an opus clip with a large amount of |
| 715 // pre-skip, which ffmpeg encodes as negative timestamps. | 727 // pre-skip, which ffmpeg encodes as negative timestamps. |
| 716 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusDiscard_Sync) { | 728 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusDiscard_Sync) { |
| 717 CreateDemuxer("opus-trimming-video-test.webm"); | 729 CreateDemuxer("opus-trimming-video-test.webm"); |
| 718 InitializeDemuxer(); | 730 InitializeDemuxer(); |
| 719 | 731 |
| 720 // Attempt a read from the video stream and run the message loop until done. | 732 // Attempt a read from the video stream and run the message loop until done. |
| 721 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 733 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 722 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 734 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 723 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 65535); | 735 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 65535); |
| 724 | 736 |
| 725 // Packet size to timestamp (in microseconds) mapping for the first N packets | 737 // Packet size to timestamp (in microseconds) mapping for the first N packets |
| 726 // which should be fully discarded. | 738 // which should be fully discarded. |
| 727 static const int kTestExpectations[][2] = { | 739 static const int kTestExpectations[][2] = { |
| 728 {635, 0}, {594, 120000}, {597, 240000}, {591, 360000}, | 740 {635, 0}, {594, 120000}, {597, 240000}, {591, 360000}, |
| 729 {582, 480000}, {583, 600000}, {592, 720000}, {567, 840000}, | 741 {582, 480000}, {583, 600000}, {592, 720000}, {567, 840000}, |
| 730 {579, 960000}, {572, 1080000}, {583, 1200000}}; | 742 {579, 960000}, {572, 1080000}, {583, 1200000}}; |
| 731 | 743 |
| 732 // Run the test twice with a seek in between. | 744 // Run the test twice with a seek in between. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 757 } | 769 } |
| 758 } | 770 } |
| 759 | 771 |
| 760 // Similar to the test above, but using sfx-opus.ogg, which has a much smaller | 772 // Similar to the test above, but using sfx-opus.ogg, which has a much smaller |
| 761 // amount of discard padding and no |start_time| set on the AVStream. | 773 // amount of discard padding and no |start_time| set on the AVStream. |
| 762 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusSfxDiscard_Sync) { | 774 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusSfxDiscard_Sync) { |
| 763 CreateDemuxer("sfx-opus.ogg"); | 775 CreateDemuxer("sfx-opus.ogg"); |
| 764 InitializeDemuxer(); | 776 InitializeDemuxer(); |
| 765 | 777 |
| 766 // Attempt a read from the video stream and run the message loop until done. | 778 // Attempt a read from the video stream and run the message loop until done. |
| 767 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 779 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 768 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 312); | 780 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 312); |
| 769 | 781 |
| 770 // Run the test twice with a seek in between. | 782 // Run the test twice with a seek in between. |
| 771 for (int i = 0; i < 2; ++i) { | 783 for (int i = 0; i < 2; ++i) { |
| 772 audio->Read(NewReadCB(FROM_HERE, 314, 0, true)); | 784 audio->Read(NewReadCB(FROM_HERE, 314, 0, true)); |
| 773 base::RunLoop().Run(); | 785 base::RunLoop().Run(); |
| 774 | 786 |
| 775 audio->Read(NewReadCB(FROM_HERE, 244, 20000, true)); | 787 audio->Read(NewReadCB(FROM_HERE, 244, 20000, true)); |
| 776 base::RunLoop().Run(); | 788 base::RunLoop().Run(); |
| 777 | 789 |
| 778 // Though the internal start time may be below zero, the exposed media time | 790 // Though the internal start time may be below zero, the exposed media time |
| 779 // must always be greater than zero. | 791 // must always be greater than zero. |
| 780 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); | 792 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); |
| 781 | 793 |
| 782 // Seek back to the beginning and repeat the test. | 794 // Seek back to the beginning and repeat the test. |
| 783 WaitableMessageLoopEvent event; | 795 WaitableMessageLoopEvent event; |
| 784 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 796 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 785 event.RunAndWaitForStatus(PIPELINE_OK); | 797 event.RunAndWaitForStatus(PIPELINE_OK); |
| 786 } | 798 } |
| 787 } | 799 } |
| 788 | 800 |
| 789 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { | 801 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { |
| 790 // Verify that end of stream buffers are created. | 802 // Verify that end of stream buffers are created. |
| 791 CreateDemuxer("bear-320x240.webm"); | 803 CreateDemuxer("bear-320x240.webm"); |
| 792 InitializeDemuxer(); | 804 InitializeDemuxer(); |
| 793 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 805 ReadUntilEndOfStream(GetStream(DemuxerStream::AUDIO)); |
| 794 } | 806 } |
| 795 | 807 |
| 796 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { | 808 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { |
| 797 // Verify that end of stream buffers are created. | 809 // Verify that end of stream buffers are created. |
| 798 CreateDemuxer("bear-vp8-webvtt.webm"); | 810 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 799 DemuxerStream* text_stream = NULL; | 811 DemuxerStream* text_stream = NULL; |
| 800 EXPECT_CALL(host_, AddTextStream(_, _)) | 812 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 801 .WillOnce(SaveArg<0>(&text_stream)); | 813 .WillOnce(SaveArg<0>(&text_stream)); |
| 802 InitializeDemuxerWithText(); | 814 InitializeDemuxerWithText(); |
| 803 ASSERT_TRUE(text_stream); | 815 ASSERT_TRUE(text_stream); |
| 804 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 816 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 805 | 817 |
| 806 bool got_eos_buffer = false; | 818 bool got_eos_buffer = false; |
| 807 const int kMaxBuffers = 10; | 819 const int kMaxBuffers = 10; |
| 808 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 820 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
| 809 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 821 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
| 810 base::RunLoop().Run(); | 822 base::RunLoop().Run(); |
| 811 } | 823 } |
| 812 | 824 |
| 813 EXPECT_TRUE(got_eos_buffer); | 825 EXPECT_TRUE(got_eos_buffer); |
| 814 } | 826 } |
| 815 | 827 |
| 816 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { | 828 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { |
| 817 // Verify that end of stream buffers are created. | 829 // Verify that end of stream buffers are created. |
| 818 CreateDemuxer("bear-320x240.webm"); | 830 CreateDemuxer("bear-320x240.webm"); |
| 819 InitializeDemuxer(); | 831 InitializeDemuxer(); |
| 820 SetDurationKnown(false); | 832 SetDurationKnown(false); |
| 821 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744))); | 833 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744))); |
| 822 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 834 ReadUntilEndOfStream(GetStream(DemuxerStream::AUDIO)); |
| 823 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO)); | 835 ReadUntilEndOfStream(GetStream(DemuxerStream::VIDEO)); |
| 824 } | 836 } |
| 825 | 837 |
| 826 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_VideoOnly) { | 838 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_VideoOnly) { |
| 827 // Verify that end of stream buffers are created. | 839 // Verify that end of stream buffers are created. |
| 828 CreateDemuxer("bear-320x240-video-only.webm"); | 840 CreateDemuxer("bear-320x240-video-only.webm"); |
| 829 InitializeDemuxer(); | 841 InitializeDemuxer(); |
| 830 SetDurationKnown(false); | 842 SetDurationKnown(false); |
| 831 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2703))); | 843 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2703))); |
| 832 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO)); | 844 ReadUntilEndOfStream(GetStream(DemuxerStream::VIDEO)); |
| 833 } | 845 } |
| 834 | 846 |
| 835 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_AudioOnly) { | 847 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_AudioOnly) { |
| 836 // Verify that end of stream buffers are created. | 848 // Verify that end of stream buffers are created. |
| 837 CreateDemuxer("bear-320x240-audio-only.webm"); | 849 CreateDemuxer("bear-320x240-audio-only.webm"); |
| 838 InitializeDemuxer(); | 850 InitializeDemuxer(); |
| 839 SetDurationKnown(false); | 851 SetDurationKnown(false); |
| 840 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744))); | 852 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744))); |
| 841 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 853 ReadUntilEndOfStream(GetStream(DemuxerStream::AUDIO)); |
| 842 } | 854 } |
| 843 | 855 |
| 844 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_UnsupportedStream) { | 856 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_UnsupportedStream) { |
| 845 // Verify that end of stream buffers are created and we don't crash | 857 // Verify that end of stream buffers are created and we don't crash |
| 846 // if there are streams in the file that we don't support. | 858 // if there are streams in the file that we don't support. |
| 847 CreateDemuxer("vorbis_audio_wmv_video.mkv"); | 859 CreateDemuxer("vorbis_audio_wmv_video.mkv"); |
| 848 InitializeDemuxer(); | 860 InitializeDemuxer(); |
| 849 SetDurationKnown(false); | 861 SetDurationKnown(false); |
| 850 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(991))); | 862 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(991))); |
| 851 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 863 ReadUntilEndOfStream(GetStream(DemuxerStream::AUDIO)); |
| 852 } | 864 } |
| 853 | 865 |
| 854 TEST_F(FFmpegDemuxerTest, Seek) { | 866 TEST_F(FFmpegDemuxerTest, Seek) { |
| 855 // We're testing that the demuxer frees all queued packets when it receives | 867 // We're testing that the demuxer frees all queued packets when it receives |
| 856 // a Seek(). | 868 // a Seek(). |
| 857 CreateDemuxer("bear-320x240.webm"); | 869 CreateDemuxer("bear-320x240.webm"); |
| 858 InitializeDemuxer(); | 870 InitializeDemuxer(); |
| 859 | 871 |
| 860 // Get our streams. | 872 // Get our streams. |
| 861 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 873 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 862 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 874 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 863 ASSERT_TRUE(video); | 875 ASSERT_TRUE(video); |
| 864 ASSERT_TRUE(audio); | 876 ASSERT_TRUE(audio); |
| 865 | 877 |
| 866 // Read a video packet and release it. | 878 // Read a video packet and release it. |
| 867 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 879 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 868 base::RunLoop().Run(); | 880 base::RunLoop().Run(); |
| 869 | 881 |
| 870 // Issue a simple forward seek, which should discard queued packets. | 882 // Issue a simple forward seek, which should discard queued packets. |
| 871 WaitableMessageLoopEvent event; | 883 WaitableMessageLoopEvent event; |
| 872 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), | 884 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 888 // Video read #2. | 900 // Video read #2. |
| 889 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); | 901 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); |
| 890 base::RunLoop().Run(); | 902 base::RunLoop().Run(); |
| 891 } | 903 } |
| 892 | 904 |
| 893 TEST_F(FFmpegDemuxerTest, CancelledSeek) { | 905 TEST_F(FFmpegDemuxerTest, CancelledSeek) { |
| 894 CreateDemuxer("bear-320x240.webm"); | 906 CreateDemuxer("bear-320x240.webm"); |
| 895 InitializeDemuxer(); | 907 InitializeDemuxer(); |
| 896 | 908 |
| 897 // Get our streams. | 909 // Get our streams. |
| 898 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 910 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 899 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 911 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 900 ASSERT_TRUE(video); | 912 ASSERT_TRUE(video); |
| 901 ASSERT_TRUE(audio); | 913 ASSERT_TRUE(audio); |
| 902 | 914 |
| 903 // Read a video packet and release it. | 915 // Read a video packet and release it. |
| 904 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 916 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 905 base::RunLoop().Run(); | 917 base::RunLoop().Run(); |
| 906 | 918 |
| 907 // Issue a simple forward seek, which should discard queued packets. | 919 // Issue a simple forward seek, which should discard queued packets. |
| 908 WaitableMessageLoopEvent event; | 920 WaitableMessageLoopEvent event; |
| 909 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), | 921 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), |
| 910 event.GetPipelineStatusCB()); | 922 event.GetPipelineStatusCB()); |
| 911 // FFmpegDemuxer does not care what the previous seek time was when canceling. | 923 // FFmpegDemuxer does not care what the previous seek time was when canceling. |
| 912 demuxer_->CancelPendingSeek(base::TimeDelta::FromSeconds(12345)); | 924 demuxer_->CancelPendingSeek(base::TimeDelta::FromSeconds(12345)); |
| 913 event.RunAndWaitForStatus(PIPELINE_OK); | 925 event.RunAndWaitForStatus(PIPELINE_OK); |
| 914 } | 926 } |
| 915 | 927 |
| 916 TEST_F(FFmpegDemuxerTest, SeekText) { | 928 TEST_F(FFmpegDemuxerTest, SeekText) { |
| 917 // We're testing that the demuxer frees all queued packets when it receives | 929 // We're testing that the demuxer frees all queued packets when it receives |
| 918 // a Seek(). | 930 // a Seek(). |
| 919 CreateDemuxer("bear-vp8-webvtt.webm"); | 931 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 920 DemuxerStream* text_stream = NULL; | 932 DemuxerStream* text_stream = NULL; |
| 921 EXPECT_CALL(host_, AddTextStream(_, _)) | 933 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 922 .WillOnce(SaveArg<0>(&text_stream)); | 934 .WillOnce(SaveArg<0>(&text_stream)); |
| 923 InitializeDemuxerWithText(); | 935 InitializeDemuxerWithText(); |
| 924 ASSERT_TRUE(text_stream); | 936 ASSERT_TRUE(text_stream); |
| 925 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 937 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 926 | 938 |
| 927 // Get our streams. | 939 // Get our streams. |
| 928 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 940 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 929 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 941 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 930 ASSERT_TRUE(video); | 942 ASSERT_TRUE(video); |
| 931 ASSERT_TRUE(audio); | 943 ASSERT_TRUE(audio); |
| 932 | 944 |
| 933 // Read a text packet and release it. | 945 // Read a text packet and release it. |
| 934 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); | 946 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); |
| 935 base::RunLoop().Run(); | 947 base::RunLoop().Run(); |
| 936 | 948 |
| 937 // Issue a simple forward seek, which should discard queued packets. | 949 // Issue a simple forward seek, which should discard queued packets. |
| 938 WaitableMessageLoopEvent event; | 950 WaitableMessageLoopEvent event; |
| 939 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), | 951 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 965 base::RunLoop().Run(); | 977 base::RunLoop().Run(); |
| 966 } | 978 } |
| 967 | 979 |
| 968 TEST_F(FFmpegDemuxerTest, Stop) { | 980 TEST_F(FFmpegDemuxerTest, Stop) { |
| 969 // Tests that calling Read() on a stopped demuxer stream immediately deletes | 981 // Tests that calling Read() on a stopped demuxer stream immediately deletes |
| 970 // the callback. | 982 // the callback. |
| 971 CreateDemuxer("bear-320x240.webm"); | 983 CreateDemuxer("bear-320x240.webm"); |
| 972 InitializeDemuxer(); | 984 InitializeDemuxer(); |
| 973 | 985 |
| 974 // Get our stream. | 986 // Get our stream. |
| 975 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 987 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 976 ASSERT_TRUE(audio); | 988 ASSERT_TRUE(audio); |
| 977 | 989 |
| 978 demuxer_->Stop(); | 990 demuxer_->Stop(); |
| 979 | 991 |
| 980 // Reads after being stopped are all EOS buffers. | 992 // Reads after being stopped are all EOS buffers. |
| 981 StrictMock<base::MockCallback<DemuxerStream::ReadCB>> callback; | 993 StrictMock<base::MockCallback<DemuxerStream::ReadCB>> callback; |
| 982 EXPECT_CALL(callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); | 994 EXPECT_CALL(callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); |
| 983 | 995 |
| 984 // Attempt the read... | 996 // Attempt the read... |
| 985 audio->Read(callback.Get()); | 997 audio->Read(callback.Get()); |
| 986 base::RunLoop().RunUntilIdle(); | 998 base::RunLoop().RunUntilIdle(); |
| 987 | 999 |
| 988 // Don't let the test call Stop() again. | 1000 // Don't let the test call Stop() again. |
| 989 demuxer_.reset(); | 1001 demuxer_.reset(); |
| 990 } | 1002 } |
| 991 | 1003 |
| 992 // Verify that seek works properly when the WebM cues data is at the start of | 1004 // Verify that seek works properly when the WebM cues data is at the start of |
| 993 // the file instead of at the end. | 1005 // the file instead of at the end. |
| 994 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { | 1006 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { |
| 995 CreateDemuxer("bear-320x240-cues-in-front.webm"); | 1007 CreateDemuxer("bear-320x240-cues-in-front.webm"); |
| 996 InitializeDemuxer(); | 1008 InitializeDemuxer(); |
| 997 | 1009 |
| 998 // Get our streams. | 1010 // Get our streams. |
| 999 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 1011 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 1000 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 1012 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 1001 ASSERT_TRUE(video); | 1013 ASSERT_TRUE(video); |
| 1002 ASSERT_TRUE(audio); | 1014 ASSERT_TRUE(audio); |
| 1003 | 1015 |
| 1004 // Read a video packet and release it. | 1016 // Read a video packet and release it. |
| 1005 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 1017 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 1006 base::RunLoop().Run(); | 1018 base::RunLoop().Run(); |
| 1007 | 1019 |
| 1008 // Issue a simple forward seek, which should discard queued packets. | 1020 // Issue a simple forward seek, which should discard queued packets. |
| 1009 WaitableMessageLoopEvent event; | 1021 WaitableMessageLoopEvent event; |
| 1010 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000), | 1022 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000), |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1040 | 1052 |
| 1041 #if BUILDFLAG(USE_PROPRIETARY_CODECS) | 1053 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 1042 // Ensure MP3 files with large image/video based ID3 tags demux okay. FFmpeg | 1054 // Ensure MP3 files with large image/video based ID3 tags demux okay. FFmpeg |
| 1043 // will hand us a video stream to the data which will likely be in a format we | 1055 // will hand us a video stream to the data which will likely be in a format we |
| 1044 // don't accept as video; e.g. PNG. | 1056 // don't accept as video; e.g. PNG. |
| 1045 TEST_F(FFmpegDemuxerTest, Mp3WithVideoStreamID3TagData) { | 1057 TEST_F(FFmpegDemuxerTest, Mp3WithVideoStreamID3TagData) { |
| 1046 CreateDemuxer("id3_png_test.mp3"); | 1058 CreateDemuxer("id3_png_test.mp3"); |
| 1047 InitializeDemuxer(); | 1059 InitializeDemuxer(); |
| 1048 | 1060 |
| 1049 // Ensure the expected streams are present. | 1061 // Ensure the expected streams are present. |
| 1050 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::VIDEO)); | 1062 EXPECT_FALSE(GetStream(DemuxerStream::VIDEO)); |
| 1051 EXPECT_TRUE(demuxer_->GetStream(DemuxerStream::AUDIO)); | 1063 EXPECT_TRUE(GetStream(DemuxerStream::AUDIO)); |
| 1052 } | 1064 } |
| 1053 #endif | 1065 #endif |
| 1054 | 1066 |
| 1055 // Ensure a video with an unsupported audio track still results in the video | 1067 // Ensure a video with an unsupported audio track still results in the video |
| 1056 // stream being demuxed. | 1068 // stream being demuxed. |
| 1057 TEST_F(FFmpegDemuxerTest, UnsupportedAudioSupportedVideoDemux) { | 1069 TEST_F(FFmpegDemuxerTest, UnsupportedAudioSupportedVideoDemux) { |
| 1058 CreateDemuxer("speex_audio_vorbis_video.ogv"); | 1070 CreateDemuxer("speex_audio_vorbis_video.ogv"); |
| 1059 InitializeDemuxer(); | 1071 InitializeDemuxer(); |
| 1060 | 1072 |
| 1061 // Ensure the expected streams are present. | 1073 // Ensure the expected streams are present. |
| 1062 EXPECT_TRUE(demuxer_->GetStream(DemuxerStream::VIDEO)); | 1074 EXPECT_TRUE(GetStream(DemuxerStream::VIDEO)); |
| 1063 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::AUDIO)); | 1075 EXPECT_FALSE(GetStream(DemuxerStream::AUDIO)); |
| 1064 } | 1076 } |
| 1065 | 1077 |
| 1066 // Ensure a video with an unsupported video track still results in the audio | 1078 // Ensure a video with an unsupported video track still results in the audio |
| 1067 // stream being demuxed. | 1079 // stream being demuxed. |
| 1068 TEST_F(FFmpegDemuxerTest, UnsupportedVideoSupportedAudioDemux) { | 1080 TEST_F(FFmpegDemuxerTest, UnsupportedVideoSupportedAudioDemux) { |
| 1069 CreateDemuxer("vorbis_audio_wmv_video.mkv"); | 1081 CreateDemuxer("vorbis_audio_wmv_video.mkv"); |
| 1070 InitializeDemuxer(); | 1082 InitializeDemuxer(); |
| 1071 | 1083 |
| 1072 // Ensure the expected streams are present. | 1084 // Ensure the expected streams are present. |
| 1073 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::VIDEO)); | 1085 EXPECT_FALSE(GetStream(DemuxerStream::VIDEO)); |
| 1074 EXPECT_TRUE(demuxer_->GetStream(DemuxerStream::AUDIO)); | 1086 EXPECT_TRUE(GetStream(DemuxerStream::AUDIO)); |
| 1075 } | 1087 } |
| 1076 | 1088 |
| 1077 #if BUILDFLAG(USE_PROPRIETARY_CODECS) | 1089 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 1078 // FFmpeg returns null data pointers when samples have zero size, leading to | 1090 // FFmpeg returns null data pointers when samples have zero size, leading to |
| 1079 // mistakenly creating end of stream buffers http://crbug.com/169133 | 1091 // mistakenly creating end of stream buffers http://crbug.com/169133 |
| 1080 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { | 1092 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { |
| 1081 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); | 1093 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); |
| 1082 InitializeDemuxer(); | 1094 InitializeDemuxer(); |
| 1083 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 1095 ReadUntilEndOfStream(GetStream(DemuxerStream::AUDIO)); |
| 1084 } | 1096 } |
| 1085 | 1097 |
| 1086 class Mp3SeekFFmpegDemuxerTest | 1098 class Mp3SeekFFmpegDemuxerTest |
| 1087 : public FFmpegDemuxerTest, | 1099 : public FFmpegDemuxerTest, |
| 1088 public testing::WithParamInterface<const char*> { | 1100 public testing::WithParamInterface<const char*> { |
| 1089 }; | 1101 }; |
| 1090 TEST_P(Mp3SeekFFmpegDemuxerTest, TestFastSeek) { | 1102 TEST_P(Mp3SeekFFmpegDemuxerTest, TestFastSeek) { |
| 1091 // Init demxuer with given MP3 file parameter. | 1103 // Init demxuer with given MP3 file parameter. |
| 1092 CreateDemuxer(GetParam()); | 1104 CreateDemuxer(GetParam()); |
| 1093 InitializeDemuxer(); | 1105 InitializeDemuxer(); |
| 1094 | 1106 |
| 1095 // We read a bunch of bytes when we first open the file. Reset the count | 1107 // We read a bunch of bytes when we first open the file. Reset the count |
| 1096 // here to just track the bytes read for the upcoming seek. This allows us | 1108 // here to just track the bytes read for the upcoming seek. This allows us |
| 1097 // to use a more narrow threshold for passing the test. | 1109 // to use a more narrow threshold for passing the test. |
| 1098 data_source_->reset_bytes_read_for_testing(); | 1110 data_source_->reset_bytes_read_for_testing(); |
| 1099 | 1111 |
| 1100 FFmpegDemuxerStream* audio = static_cast<FFmpegDemuxerStream*>( | 1112 FFmpegDemuxerStream* audio = |
| 1101 demuxer_->GetStream(DemuxerStream::AUDIO)); | 1113 static_cast<FFmpegDemuxerStream*>(GetStream(DemuxerStream::AUDIO)); |
| 1102 ASSERT_TRUE(audio); | 1114 ASSERT_TRUE(audio); |
| 1103 | 1115 |
| 1104 // Seek to near the end of the file | 1116 // Seek to near the end of the file |
| 1105 WaitableMessageLoopEvent event; | 1117 WaitableMessageLoopEvent event; |
| 1106 demuxer_->Seek(.9 * audio->duration(), event.GetPipelineStatusCB()); | 1118 demuxer_->Seek(.9 * audio->duration(), event.GetPipelineStatusCB()); |
| 1107 event.RunAndWaitForStatus(PIPELINE_OK); | 1119 event.RunAndWaitForStatus(PIPELINE_OK); |
| 1108 | 1120 |
| 1109 // Verify that seeking to the end read only a small portion of the file. | 1121 // Verify that seeking to the end read only a small portion of the file. |
| 1110 // Slow seeks that read sequentially up to the seek point will read too many | 1122 // Slow seeks that read sequentially up to the seek point will read too many |
| 1111 // bytes and fail this check. | 1123 // bytes and fail this check. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 "bear-1280x720-av_frag.mp4", | 1171 "bear-1280x720-av_frag.mp4", |
| 1160 "bear-1280x720-av_with-aud-nalus_frag.mp4" | 1172 "bear-1280x720-av_with-aud-nalus_frag.mp4" |
| 1161 }; | 1173 }; |
| 1162 | 1174 |
| 1163 for (size_t i = 0; i < arraysize(files); ++i) { | 1175 for (size_t i = 0; i < arraysize(files); ++i) { |
| 1164 DVLOG(1) << "Testing " << files[i]; | 1176 DVLOG(1) << "Testing " << files[i]; |
| 1165 CreateDemuxer(files[i]); | 1177 CreateDemuxer(files[i]); |
| 1166 InitializeDemuxer(); | 1178 InitializeDemuxer(); |
| 1167 | 1179 |
| 1168 // Ensure the expected streams are present. | 1180 // Ensure the expected streams are present. |
| 1169 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1181 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1170 ASSERT_TRUE(stream); | 1182 ASSERT_TRUE(stream); |
| 1171 stream->EnableBitstreamConverter(); | 1183 stream->EnableBitstreamConverter(); |
| 1172 | 1184 |
| 1173 stream->Read(base::Bind(&ValidateAnnexB, stream)); | 1185 stream->Read(base::Bind(&ValidateAnnexB, stream)); |
| 1174 base::RunLoop().Run(); | 1186 base::RunLoop().Run(); |
| 1175 | 1187 |
| 1176 demuxer_->Stop(); | 1188 demuxer_->Stop(); |
| 1177 demuxer_.reset(); | 1189 demuxer_.reset(); |
| 1178 data_source_.reset(); | 1190 data_source_.reset(); |
| 1179 } | 1191 } |
| 1180 } | 1192 } |
| 1181 | 1193 |
| 1182 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_0) { | 1194 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_0) { |
| 1183 CreateDemuxer("bear_rotate_0.mp4"); | 1195 CreateDemuxer("bear_rotate_0.mp4"); |
| 1184 InitializeDemuxer(); | 1196 InitializeDemuxer(); |
| 1185 | 1197 |
| 1186 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1198 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1187 ASSERT_TRUE(stream); | 1199 ASSERT_TRUE(stream); |
| 1188 ASSERT_EQ(VIDEO_ROTATION_0, stream->video_rotation()); | 1200 ASSERT_EQ(VIDEO_ROTATION_0, stream->video_rotation()); |
| 1189 } | 1201 } |
| 1190 | 1202 |
| 1191 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_90) { | 1203 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_90) { |
| 1192 CreateDemuxer("bear_rotate_90.mp4"); | 1204 CreateDemuxer("bear_rotate_90.mp4"); |
| 1193 InitializeDemuxer(); | 1205 InitializeDemuxer(); |
| 1194 | 1206 |
| 1195 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1207 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1196 ASSERT_TRUE(stream); | 1208 ASSERT_TRUE(stream); |
| 1197 ASSERT_EQ(VIDEO_ROTATION_90, stream->video_rotation()); | 1209 ASSERT_EQ(VIDEO_ROTATION_90, stream->video_rotation()); |
| 1198 } | 1210 } |
| 1199 | 1211 |
| 1200 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_180) { | 1212 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_180) { |
| 1201 CreateDemuxer("bear_rotate_180.mp4"); | 1213 CreateDemuxer("bear_rotate_180.mp4"); |
| 1202 InitializeDemuxer(); | 1214 InitializeDemuxer(); |
| 1203 | 1215 |
| 1204 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1216 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1205 ASSERT_TRUE(stream); | 1217 ASSERT_TRUE(stream); |
| 1206 ASSERT_EQ(VIDEO_ROTATION_180, stream->video_rotation()); | 1218 ASSERT_EQ(VIDEO_ROTATION_180, stream->video_rotation()); |
| 1207 } | 1219 } |
| 1208 | 1220 |
| 1209 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_270) { | 1221 TEST_F(FFmpegDemuxerTest, Rotate_Metadata_270) { |
| 1210 CreateDemuxer("bear_rotate_270.mp4"); | 1222 CreateDemuxer("bear_rotate_270.mp4"); |
| 1211 InitializeDemuxer(); | 1223 InitializeDemuxer(); |
| 1212 | 1224 |
| 1213 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1225 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1214 ASSERT_TRUE(stream); | 1226 ASSERT_TRUE(stream); |
| 1215 ASSERT_EQ(VIDEO_ROTATION_270, stream->video_rotation()); | 1227 ASSERT_EQ(VIDEO_ROTATION_270, stream->video_rotation()); |
| 1216 } | 1228 } |
| 1217 | 1229 |
| 1218 TEST_F(FFmpegDemuxerTest, NaturalSizeWithoutPASP) { | 1230 TEST_F(FFmpegDemuxerTest, NaturalSizeWithoutPASP) { |
| 1219 CreateDemuxer("bear-640x360-non_square_pixel-without_pasp.mp4"); | 1231 CreateDemuxer("bear-640x360-non_square_pixel-without_pasp.mp4"); |
| 1220 InitializeDemuxer(); | 1232 InitializeDemuxer(); |
| 1221 | 1233 |
| 1222 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1234 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1223 ASSERT_TRUE(stream); | 1235 ASSERT_TRUE(stream); |
| 1224 | 1236 |
| 1225 const VideoDecoderConfig& video_config = stream->video_decoder_config(); | 1237 const VideoDecoderConfig& video_config = stream->video_decoder_config(); |
| 1226 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); | 1238 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); |
| 1227 } | 1239 } |
| 1228 | 1240 |
| 1229 TEST_F(FFmpegDemuxerTest, NaturalSizeWithPASP) { | 1241 TEST_F(FFmpegDemuxerTest, NaturalSizeWithPASP) { |
| 1230 CreateDemuxer("bear-640x360-non_square_pixel-with_pasp.mp4"); | 1242 CreateDemuxer("bear-640x360-non_square_pixel-with_pasp.mp4"); |
| 1231 InitializeDemuxer(); | 1243 InitializeDemuxer(); |
| 1232 | 1244 |
| 1233 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1245 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO); |
| 1234 ASSERT_TRUE(stream); | 1246 ASSERT_TRUE(stream); |
| 1235 | 1247 |
| 1236 const VideoDecoderConfig& video_config = stream->video_decoder_config(); | 1248 const VideoDecoderConfig& video_config = stream->video_decoder_config(); |
| 1237 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); | 1249 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); |
| 1238 } | 1250 } |
| 1239 | 1251 |
| 1240 TEST_F(FFmpegDemuxerTest, HEVC_in_MP4_container) { | 1252 TEST_F(FFmpegDemuxerTest, HEVC_in_MP4_container) { |
| 1241 CreateDemuxer("bear-hevc-frag.mp4"); | 1253 CreateDemuxer("bear-hevc-frag.mp4"); |
| 1242 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 1254 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
| 1243 InitializeDemuxer(); | 1255 InitializeDemuxer(); |
| 1244 | 1256 |
| 1245 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 1257 DemuxerStream* video = GetStream(DemuxerStream::VIDEO); |
| 1246 ASSERT_TRUE(video); | 1258 ASSERT_TRUE(video); |
| 1247 | 1259 |
| 1248 video->Read(NewReadCB(FROM_HERE, 3569, 66733, true)); | 1260 video->Read(NewReadCB(FROM_HERE, 3569, 66733, true)); |
| 1249 base::RunLoop().Run(); | 1261 base::RunLoop().Run(); |
| 1250 | 1262 |
| 1251 video->Read(NewReadCB(FROM_HERE, 1042, 200200, false)); | 1263 video->Read(NewReadCB(FROM_HERE, 1042, 200200, false)); |
| 1252 base::RunLoop().Run(); | 1264 base::RunLoop().Run(); |
| 1253 #else | 1265 #else |
| 1254 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | 1266 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
| 1255 #endif | 1267 #endif |
| 1256 } | 1268 } |
| 1257 | 1269 |
| 1258 TEST_F(FFmpegDemuxerTest, Read_AC3_Audio) { | 1270 TEST_F(FFmpegDemuxerTest, Read_AC3_Audio) { |
| 1259 CreateDemuxer("bear-ac3-only-frag.mp4"); | 1271 CreateDemuxer("bear-ac3-only-frag.mp4"); |
| 1260 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) | 1272 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) |
| 1261 InitializeDemuxer(); | 1273 InitializeDemuxer(); |
| 1262 | 1274 |
| 1263 // Attempt a read from the audio stream and run the message loop until done. | 1275 // Attempt a read from the audio stream and run the message loop until done. |
| 1264 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 1276 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 1265 | 1277 |
| 1266 // Read the first two frames and check that we are getting expected data | 1278 // Read the first two frames and check that we are getting expected data |
| 1267 audio->Read(NewReadCB(FROM_HERE, 834, 0, true)); | 1279 audio->Read(NewReadCB(FROM_HERE, 834, 0, true)); |
| 1268 base::RunLoop().Run(); | 1280 base::RunLoop().Run(); |
| 1269 | 1281 |
| 1270 audio->Read(NewReadCB(FROM_HERE, 836, 34830, true)); | 1282 audio->Read(NewReadCB(FROM_HERE, 836, 34830, true)); |
| 1271 base::RunLoop().Run(); | 1283 base::RunLoop().Run(); |
| 1272 #else | 1284 #else |
| 1273 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | 1285 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
| 1274 #endif | 1286 #endif |
| 1275 } | 1287 } |
| 1276 | 1288 |
| 1277 TEST_F(FFmpegDemuxerTest, Read_EAC3_Audio) { | 1289 TEST_F(FFmpegDemuxerTest, Read_EAC3_Audio) { |
| 1278 CreateDemuxer("bear-eac3-only-frag.mp4"); | 1290 CreateDemuxer("bear-eac3-only-frag.mp4"); |
| 1279 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) | 1291 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) |
| 1280 InitializeDemuxer(); | 1292 InitializeDemuxer(); |
| 1281 | 1293 |
| 1282 // Attempt a read from the audio stream and run the message loop until done. | 1294 // Attempt a read from the audio stream and run the message loop until done. |
| 1283 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 1295 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO); |
| 1284 | 1296 |
| 1285 // Read the first two frames and check that we are getting expected data | 1297 // Read the first two frames and check that we are getting expected data |
| 1286 audio->Read(NewReadCB(FROM_HERE, 870, 0, true)); | 1298 audio->Read(NewReadCB(FROM_HERE, 870, 0, true)); |
| 1287 base::RunLoop().Run(); | 1299 base::RunLoop().Run(); |
| 1288 | 1300 |
| 1289 audio->Read(NewReadCB(FROM_HERE, 872, 34830, true)); | 1301 audio->Read(NewReadCB(FROM_HERE, 872, 34830, true)); |
| 1290 base::RunLoop().Run(); | 1302 base::RunLoop().Run(); |
| 1291 #else | 1303 #else |
| 1292 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | 1304 InitializeDemuxerAndExpectPipelineStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
| 1293 #endif | 1305 #endif |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 EXPECT_FALSE(base::Time::FromUTCString(date_string, &result)) | 1464 EXPECT_FALSE(base::Time::FromUTCString(date_string, &result)) |
| 1453 << "date_string '" << date_string << "'"; | 1465 << "date_string '" << date_string << "'"; |
| 1454 } | 1466 } |
| 1455 } | 1467 } |
| 1456 | 1468 |
| 1457 TEST_F(FFmpegDemuxerTest, Read_Flac) { | 1469 TEST_F(FFmpegDemuxerTest, Read_Flac) { |
| 1458 CreateDemuxer("sfx.flac"); | 1470 CreateDemuxer("sfx.flac"); |
| 1459 InitializeDemuxer(); | 1471 InitializeDemuxer(); |
| 1460 | 1472 |
| 1461 // Video stream should not be present. | 1473 // Video stream should not be present. |
| 1462 EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); | 1474 EXPECT_EQ(nullptr, GetStream(DemuxerStream::VIDEO)); |
| 1463 | 1475 |
| 1464 // Audio stream should be present. | 1476 // Audio stream should be present. |
| 1465 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 1477 DemuxerStream* stream = GetStream(DemuxerStream::AUDIO); |
| 1466 ASSERT_TRUE(stream); | 1478 ASSERT_TRUE(stream); |
| 1467 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); | 1479 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); |
| 1468 | 1480 |
| 1469 const AudioDecoderConfig& audio_config = stream->audio_decoder_config(); | 1481 const AudioDecoderConfig& audio_config = stream->audio_decoder_config(); |
| 1470 EXPECT_EQ(kCodecFLAC, audio_config.codec()); | 1482 EXPECT_EQ(kCodecFLAC, audio_config.codec()); |
| 1471 EXPECT_EQ(32, audio_config.bits_per_channel()); | 1483 EXPECT_EQ(32, audio_config.bits_per_channel()); |
| 1472 EXPECT_EQ(CHANNEL_LAYOUT_MONO, audio_config.channel_layout()); | 1484 EXPECT_EQ(CHANNEL_LAYOUT_MONO, audio_config.channel_layout()); |
| 1473 EXPECT_EQ(44100, audio_config.samples_per_second()); | 1485 EXPECT_EQ(44100, audio_config.samples_per_second()); |
| 1474 EXPECT_EQ(kSampleFormatS32, audio_config.sample_format()); | 1486 EXPECT_EQ(kSampleFormatS32, audio_config.sample_format()); |
| 1475 } | 1487 } |
| 1476 | 1488 |
| 1477 // Verify that FFmpeg demuxer falls back to choosing disabled streams for | 1489 // Verify that FFmpeg demuxer falls back to choosing disabled streams for |
| 1478 // seeking if there's no suitable enabled stream found. | 1490 // seeking if there's no suitable enabled stream found. |
| 1479 TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledVideoStream) { | 1491 TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledVideoStream) { |
| 1480 // Input has only video stream, no audio. | 1492 // Input has only video stream, no audio. |
| 1481 CreateDemuxer("bear-320x240-video-only.webm"); | 1493 CreateDemuxer("bear-320x240-video-only.webm"); |
| 1482 InitializeDemuxer(); | 1494 InitializeDemuxer(); |
| 1483 EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); | 1495 EXPECT_EQ(nullptr, GetStream(DemuxerStream::AUDIO)); |
| 1484 DemuxerStream* vstream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1496 DemuxerStream* vstream = GetStream(DemuxerStream::VIDEO); |
| 1485 EXPECT_NE(nullptr, vstream); | 1497 EXPECT_NE(nullptr, vstream); |
| 1486 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); | 1498 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
| 1487 | 1499 |
| 1488 // Now pretend that video stream got disabled, e.g. due to current tab going | 1500 // Now pretend that video stream got disabled, e.g. due to current tab going |
| 1489 // into background. | 1501 // into background. |
| 1490 vstream->set_enabled(false, base::TimeDelta()); | 1502 vstream->set_enabled(false, base::TimeDelta()); |
| 1491 // Since there's no other enabled streams, the preferred seeking stream should | 1503 // Since there's no other enabled streams, the preferred seeking stream should |
| 1492 // still be the video stream. | 1504 // still be the video stream. |
| 1493 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); | 1505 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
| 1494 } | 1506 } |
| 1495 | 1507 |
| 1496 TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledAudioStream) { | 1508 TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledAudioStream) { |
| 1497 CreateDemuxer("bear-320x240-audio-only.webm"); | 1509 CreateDemuxer("bear-320x240-audio-only.webm"); |
| 1498 InitializeDemuxer(); | 1510 InitializeDemuxer(); |
| 1499 DemuxerStream* astream = demuxer_->GetStream(DemuxerStream::AUDIO); | 1511 DemuxerStream* astream = GetStream(DemuxerStream::AUDIO); |
| 1500 EXPECT_NE(nullptr, astream); | 1512 EXPECT_NE(nullptr, astream); |
| 1501 EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); | 1513 EXPECT_EQ(nullptr, GetStream(DemuxerStream::VIDEO)); |
| 1502 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); | 1514 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
| 1503 | 1515 |
| 1504 // Now pretend that audio stream got disabled. | 1516 // Now pretend that audio stream got disabled. |
| 1505 astream->set_enabled(false, base::TimeDelta()); | 1517 astream->set_enabled(false, base::TimeDelta()); |
| 1506 // Since there's no other enabled streams, the preferred seeking stream should | 1518 // Since there's no other enabled streams, the preferred seeking stream should |
| 1507 // still be the audio stream. | 1519 // still be the audio stream. |
| 1508 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); | 1520 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
| 1509 } | 1521 } |
| 1510 | 1522 |
| 1511 } // namespace media | 1523 } // namespace media |
| OLD | NEW |