Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: media/filters/ffmpeg_demuxer_unittest.cc

Issue 13813016: Remove reference counting from media::Demuxer and friends. (Closed) Base URL: http://git.chromium.org/chromium/src.git@vd_scoped
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/file_util.h" 10 #include "base/file_util.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 60
61 // Fixture class to facilitate writing tests. Takes care of setting up the 61 // Fixture class to facilitate writing tests. Takes care of setting up the
62 // FFmpeg, pipeline and filter host mocks. 62 // FFmpeg, pipeline and filter host mocks.
63 class FFmpegDemuxerTest : public testing::Test { 63 class FFmpegDemuxerTest : public testing::Test {
64 protected: 64 protected:
65 FFmpegDemuxerTest() {} 65 FFmpegDemuxerTest() {}
66 66
67 virtual ~FFmpegDemuxerTest() { 67 virtual ~FFmpegDemuxerTest() {
68 if (demuxer_) { 68 if (demuxer_) {
69 demuxer_->Stop(MessageLoop::QuitWhenIdleClosure()); 69 WaitableMessageLoopEvent event;
70 message_loop_.Run(); 70 demuxer_->Stop(event.GetClosure());
71 event.RunAndWait();
71 } 72 }
72 73
73 demuxer_ = NULL; 74 demuxer_.reset();
74 } 75 }
75 76
76 void CreateDemuxer(const std::string& name) { 77 void CreateDemuxer(const std::string& name) {
77 CHECK(!demuxer_); 78 CHECK(!demuxer_);
78 79
79 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); 80 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber());
80 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); 81 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber());
81 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); 82 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber());
82 83
83 CreateDataSource(name); 84 CreateDataSource(name);
84 85
85 media::FFmpegNeedKeyCB need_key_cb = 86 media::FFmpegNeedKeyCB need_key_cb =
86 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this)); 87 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this));
87 demuxer_ = new FFmpegDemuxer(message_loop_.message_loop_proxy(), 88 demuxer_.reset(new FFmpegDemuxer(message_loop_.message_loop_proxy(),
88 data_source_, 89 data_source_,
89 need_key_cb); 90 need_key_cb));
90 } 91 }
91 92
92 MOCK_METHOD1(CheckPoint, void(int v)); 93 MOCK_METHOD1(CheckPoint, void(int v));
93 94
94 void InitializeDemuxer() { 95 void InitializeDemuxer() {
95 EXPECT_CALL(host_, SetDuration(_)); 96 EXPECT_CALL(host_, SetDuration(_));
96 WaitableMessageLoopEvent event; 97 WaitableMessageLoopEvent event;
97 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); 98 demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
98 event.RunAndWaitForStatus(PIPELINE_OK); 99 event.RunAndWaitForStatus(PIPELINE_OK);
99 } 100 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 } 147 }
147 148
148 bool IsStreamStopped(DemuxerStream::Type type) { 149 bool IsStreamStopped(DemuxerStream::Type type) {
149 DemuxerStream* stream = demuxer_->GetStream(type); 150 DemuxerStream* stream = demuxer_->GetStream(type);
150 CHECK(stream); 151 CHECK(stream);
151 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_; 152 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_;
152 } 153 }
153 154
154 // Fixture members. 155 // Fixture members.
155 scoped_refptr<FileDataSource> data_source_; 156 scoped_refptr<FileDataSource> data_source_;
156 scoped_refptr<FFmpegDemuxer> demuxer_; 157 scoped_ptr<FFmpegDemuxer> demuxer_;
157 StrictMock<MockDemuxerHost> host_; 158 StrictMock<MockDemuxerHost> host_;
158 MessageLoop message_loop_; 159 MessageLoop message_loop_;
159 160
160 AVFormatContext* format_context() { 161 AVFormatContext* format_context() {
161 return demuxer_->glue_->format_context(); 162 return demuxer_->glue_->format_context();
162 } 163 }
163 164
164 void ReadUntilEndOfStream() { 165 void ReadUntilEndOfStream() {
165 // We should expect an end of stream buffer. 166 // We should expect an end of stream buffer.
166 scoped_refptr<DemuxerStream> audio = 167 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
167 demuxer_->GetStream(DemuxerStream::AUDIO);
168 168
169 bool got_eos_buffer = false; 169 bool got_eos_buffer = false;
170 const int kMaxBuffers = 170; 170 const int kMaxBuffers = 170;
171 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { 171 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) {
172 audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); 172 audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer));
173 message_loop_.Run(); 173 message_loop_.Run();
174 } 174 }
175 175
176 EXPECT_TRUE(got_eos_buffer); 176 EXPECT_TRUE(got_eos_buffer);
177 } 177 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 WaitableMessageLoopEvent event; 227 WaitableMessageLoopEvent event;
228 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); 228 demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
229 event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); 229 event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
230 } 230 }
231 231
232 TEST_F(FFmpegDemuxerTest, Initialize_Successful) { 232 TEST_F(FFmpegDemuxerTest, Initialize_Successful) {
233 CreateDemuxer("bear-320x240.webm"); 233 CreateDemuxer("bear-320x240.webm");
234 InitializeDemuxer(); 234 InitializeDemuxer();
235 235
236 // Video stream should be present. 236 // Video stream should be present.
237 scoped_refptr<DemuxerStream> stream = 237 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
238 demuxer_->GetStream(DemuxerStream::VIDEO);
239 ASSERT_TRUE(stream); 238 ASSERT_TRUE(stream);
240 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); 239 EXPECT_EQ(DemuxerStream::VIDEO, stream->type());
241 240
242 const VideoDecoderConfig& video_config = stream->video_decoder_config(); 241 const VideoDecoderConfig& video_config = stream->video_decoder_config();
243 EXPECT_EQ(kCodecVP8, video_config.codec()); 242 EXPECT_EQ(kCodecVP8, video_config.codec());
244 EXPECT_EQ(VideoFrame::YV12, video_config.format()); 243 EXPECT_EQ(VideoFrame::YV12, video_config.format());
245 EXPECT_EQ(320, video_config.coded_size().width()); 244 EXPECT_EQ(320, video_config.coded_size().width());
246 EXPECT_EQ(240, video_config.coded_size().height()); 245 EXPECT_EQ(240, video_config.coded_size().height());
247 EXPECT_EQ(0, video_config.visible_rect().x()); 246 EXPECT_EQ(0, video_config.visible_rect().x());
248 EXPECT_EQ(0, video_config.visible_rect().y()); 247 EXPECT_EQ(0, video_config.visible_rect().y());
(...skipping 28 matching lines...) Expand all
277 // Stream #1: Audio (Vorbis) 276 // Stream #1: Audio (Vorbis)
278 // Stream #2: Subtitles (SRT) 277 // Stream #2: Subtitles (SRT)
279 // Stream #3: Video (Theora) 278 // Stream #3: Video (Theora)
280 // Stream #4: Audio (16-bit signed little endian PCM) 279 // Stream #4: Audio (16-bit signed little endian PCM)
281 // 280 //
282 // We should only pick the first audio/video streams we come across. 281 // We should only pick the first audio/video streams we come across.
283 CreateDemuxer("bear-320x240-multitrack.webm"); 282 CreateDemuxer("bear-320x240-multitrack.webm");
284 InitializeDemuxer(); 283 InitializeDemuxer();
285 284
286 // Video stream should be VP8. 285 // Video stream should be VP8.
287 scoped_refptr<DemuxerStream> stream = 286 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
288 demuxer_->GetStream(DemuxerStream::VIDEO);
289 ASSERT_TRUE(stream); 287 ASSERT_TRUE(stream);
290 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); 288 EXPECT_EQ(DemuxerStream::VIDEO, stream->type());
291 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); 289 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec());
292 290
293 // Audio stream should be Vorbis. 291 // Audio stream should be Vorbis.
294 stream = demuxer_->GetStream(DemuxerStream::AUDIO); 292 stream = demuxer_->GetStream(DemuxerStream::AUDIO);
295 ASSERT_TRUE(stream); 293 ASSERT_TRUE(stream);
296 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); 294 EXPECT_EQ(DemuxerStream::AUDIO, stream->type());
297 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec()); 295 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec());
298 296
(...skipping 11 matching lines...) Expand all
310 CreateDemuxer("bear-320x240-av_enc-av.webm"); 308 CreateDemuxer("bear-320x240-av_enc-av.webm");
311 InitializeDemuxer(); 309 InitializeDemuxer();
312 } 310 }
313 311
314 TEST_F(FFmpegDemuxerTest, Read_Audio) { 312 TEST_F(FFmpegDemuxerTest, Read_Audio) {
315 // We test that on a successful audio packet read. 313 // We test that on a successful audio packet read.
316 CreateDemuxer("bear-320x240.webm"); 314 CreateDemuxer("bear-320x240.webm");
317 InitializeDemuxer(); 315 InitializeDemuxer();
318 316
319 // Attempt a read from the audio stream and run the message loop until done. 317 // Attempt a read from the audio stream and run the message loop until done.
320 scoped_refptr<DemuxerStream> audio = 318 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
321 demuxer_->GetStream(DemuxerStream::AUDIO);
322 319
323 audio->Read(NewReadCB(FROM_HERE, 29, 0)); 320 audio->Read(NewReadCB(FROM_HERE, 29, 0));
324 message_loop_.Run(); 321 message_loop_.Run();
325 322
326 audio->Read(NewReadCB(FROM_HERE, 27, 3000)); 323 audio->Read(NewReadCB(FROM_HERE, 27, 3000));
327 message_loop_.Run(); 324 message_loop_.Run();
328 } 325 }
329 326
330 TEST_F(FFmpegDemuxerTest, Read_Video) { 327 TEST_F(FFmpegDemuxerTest, Read_Video) {
331 // We test that on a successful video packet read. 328 // We test that on a successful video packet read.
332 CreateDemuxer("bear-320x240.webm"); 329 CreateDemuxer("bear-320x240.webm");
333 InitializeDemuxer(); 330 InitializeDemuxer();
334 331
335 // Attempt a read from the video stream and run the message loop until done. 332 // Attempt a read from the video stream and run the message loop until done.
336 scoped_refptr<DemuxerStream> video = 333 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
337 demuxer_->GetStream(DemuxerStream::VIDEO);
338 334
339 video->Read(NewReadCB(FROM_HERE, 22084, 0)); 335 video->Read(NewReadCB(FROM_HERE, 22084, 0));
340 message_loop_.Run(); 336 message_loop_.Run();
341 337
342 video->Read(NewReadCB(FROM_HERE, 1057, 33000)); 338 video->Read(NewReadCB(FROM_HERE, 1057, 33000));
343 message_loop_.Run(); 339 message_loop_.Run();
344 } 340 }
345 341
346 TEST_F(FFmpegDemuxerTest, Read_VideoNonZeroStart) { 342 TEST_F(FFmpegDemuxerTest, Read_VideoNonZeroStart) {
347 // Test the start time is the first timestamp of the video and audio stream. 343 // Test the start time is the first timestamp of the video and audio stream.
348 CreateDemuxer("nonzero-start-time.webm"); 344 CreateDemuxer("nonzero-start-time.webm");
349 InitializeDemuxer(); 345 InitializeDemuxer();
350 346
351 // Attempt a read from the video stream and run the message loop until done. 347 // Attempt a read from the video stream and run the message loop until done.
352 scoped_refptr<DemuxerStream> video = 348 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
353 demuxer_->GetStream(DemuxerStream::VIDEO); 349 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
354 scoped_refptr<DemuxerStream> audio =
355 demuxer_->GetStream(DemuxerStream::AUDIO);
356 350
357 // Check first buffer in video stream. 351 // Check first buffer in video stream.
358 video->Read(NewReadCB(FROM_HERE, 5636, 400000)); 352 video->Read(NewReadCB(FROM_HERE, 5636, 400000));
359 message_loop_.Run(); 353 message_loop_.Run();
360 354
361 // Check first buffer in audio stream. 355 // Check first buffer in audio stream.
362 audio->Read(NewReadCB(FROM_HERE, 165, 396000)); 356 audio->Read(NewReadCB(FROM_HERE, 165, 396000));
363 message_loop_.Run(); 357 message_loop_.Run();
364 358
365 // Verify that the start time is equal to the lowest timestamp (ie the audio). 359 // Verify that the start time is equal to the lowest timestamp (ie the audio).
(...skipping 16 matching lines...) Expand all
382 ReadUntilEndOfStream(); 376 ReadUntilEndOfStream();
383 } 377 }
384 378
385 TEST_F(FFmpegDemuxerTest, Seek) { 379 TEST_F(FFmpegDemuxerTest, Seek) {
386 // We're testing that the demuxer frees all queued packets when it receives 380 // We're testing that the demuxer frees all queued packets when it receives
387 // a Seek(). 381 // a Seek().
388 CreateDemuxer("bear-320x240.webm"); 382 CreateDemuxer("bear-320x240.webm");
389 InitializeDemuxer(); 383 InitializeDemuxer();
390 384
391 // Get our streams. 385 // Get our streams.
392 scoped_refptr<DemuxerStream> video = 386 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
393 demuxer_->GetStream(DemuxerStream::VIDEO); 387 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
394 scoped_refptr<DemuxerStream> audio =
395 demuxer_->GetStream(DemuxerStream::AUDIO);
396 ASSERT_TRUE(video); 388 ASSERT_TRUE(video);
397 ASSERT_TRUE(audio); 389 ASSERT_TRUE(audio);
398 390
399 // Read a video packet and release it. 391 // Read a video packet and release it.
400 video->Read(NewReadCB(FROM_HERE, 22084, 0)); 392 video->Read(NewReadCB(FROM_HERE, 22084, 0));
401 message_loop_.Run(); 393 message_loop_.Run();
402 394
403 // Issue a simple forward seek, which should discard queued packets. 395 // Issue a simple forward seek, which should discard queued packets.
404 WaitableMessageLoopEvent event; 396 WaitableMessageLoopEvent event;
405 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), 397 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 DISALLOW_COPY_AND_ASSIGN(MockReadCB); 436 DISALLOW_COPY_AND_ASSIGN(MockReadCB);
445 }; 437 };
446 438
447 TEST_F(FFmpegDemuxerTest, Stop) { 439 TEST_F(FFmpegDemuxerTest, Stop) {
448 // Tests that calling Read() on a stopped demuxer stream immediately deletes 440 // Tests that calling Read() on a stopped demuxer stream immediately deletes
449 // the callback. 441 // the callback.
450 CreateDemuxer("bear-320x240.webm"); 442 CreateDemuxer("bear-320x240.webm");
451 InitializeDemuxer(); 443 InitializeDemuxer();
452 444
453 // Get our stream. 445 // Get our stream.
454 scoped_refptr<DemuxerStream> audio = 446 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
455 demuxer_->GetStream(DemuxerStream::AUDIO);
456 ASSERT_TRUE(audio); 447 ASSERT_TRUE(audio);
457 448
458 demuxer_->Stop(NewExpectedClosure()); 449 demuxer_->Stop(NewExpectedClosure());
459 450
460 // Expect all calls in sequence. 451 // Expect all calls in sequence.
461 InSequence s; 452 InSequence s;
462 453
463 // Create our mocked callback. The Callback created by base::Bind() will take 454 // Create our mocked callback. The Callback created by base::Bind() will take
464 // ownership of this pointer. 455 // ownership of this pointer.
465 StrictMock<MockReadCB>* callback = new StrictMock<MockReadCB>(); 456 StrictMock<MockReadCB>* callback = new StrictMock<MockReadCB>();
466 457
467 // The callback should be immediately deleted. We'll use a checkpoint to 458 // The callback should be immediately deleted. We'll use a checkpoint to
468 // verify that it has indeed been deleted. 459 // verify that it has indeed been deleted.
469 EXPECT_CALL(*callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); 460 EXPECT_CALL(*callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer()));
470 EXPECT_CALL(*callback, OnDelete()); 461 EXPECT_CALL(*callback, OnDelete());
471 EXPECT_CALL(*this, CheckPoint(1)); 462 EXPECT_CALL(*this, CheckPoint(1));
472 463
473 // Attempt the read... 464 // Attempt the read...
474 audio->Read(base::Bind(&MockReadCB::Run, callback)); 465 audio->Read(base::Bind(&MockReadCB::Run, callback));
475 466
476 message_loop_.RunUntilIdle(); 467 message_loop_.RunUntilIdle();
477 468
478 // ...and verify that |callback| was deleted. 469 // ...and verify that |callback| was deleted.
479 CheckPoint(1); 470 CheckPoint(1);
480 } 471 }
481 472
482 // The streams can outlive the demuxer because the streams may still be in use
scherkus (not reviewing) 2013/04/17 17:21:59 this is no longer possible as it would be a UAF to
acolwell GONE FROM CHROMIUM 2013/04/17 20:24:53 What about just removing the demuxer_ = NULL line?
scherkus (not reviewing) 2013/04/19 01:07:22 test added back (it's even more critical now that
483 // by the decoder when the demuxer is destroyed.
484 // This test verifies that DemuxerStream::Read() does not use an invalid demuxer
485 // pointer (no crash occurs) and calls the callback with an EndOfStream buffer.
486 TEST_F(FFmpegDemuxerTest, StreamReadAfterStopAndDemuxerDestruction) {
487 CreateDemuxer("bear-320x240.webm");
488 InitializeDemuxer();
489
490 // Get our stream.
491 scoped_refptr<DemuxerStream> audio =
492 demuxer_->GetStream(DemuxerStream::AUDIO);
493 ASSERT_TRUE(audio);
494
495 demuxer_->Stop(MessageLoop::QuitWhenIdleClosure());
496 message_loop_.Run();
497
498 // Expect all calls in sequence.
499 InSequence s;
500
501 // Create our mocked callback. The Callback created by base::Bind() will take
502 // ownership of this pointer.
503 StrictMock<MockReadCB>* callback = new StrictMock<MockReadCB>();
504
505 // The callback should be immediately deleted. We'll use a checkpoint to
506 // verify that it has indeed been deleted.
507 EXPECT_CALL(*callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer()));
508 EXPECT_CALL(*callback, OnDelete());
509 EXPECT_CALL(*this, CheckPoint(1));
510
511 // Release the reference to the demuxer. This should also destroy it.
512 demuxer_ = NULL;
513 // |audio| now has a demuxer_ pointer to invalid memory.
514
515 // Attempt the read...
516 audio->Read(base::Bind(&MockReadCB::Run, callback));
517
518 message_loop_.RunUntilIdle();
519
520 // ...and verify that |callback| was deleted.
521 CheckPoint(1);
522 }
523
524 TEST_F(FFmpegDemuxerTest, DisableAudioStream) { 473 TEST_F(FFmpegDemuxerTest, DisableAudioStream) {
525 // We are doing the following things here: 474 // We are doing the following things here:
526 // 1. Initialize the demuxer with audio and video stream. 475 // 1. Initialize the demuxer with audio and video stream.
527 // 2. Send a "disable audio stream" message to the demuxer. 476 // 2. Send a "disable audio stream" message to the demuxer.
528 // 3. Demuxer will free audio packets even if audio stream was initialized. 477 // 3. Demuxer will free audio packets even if audio stream was initialized.
529 CreateDemuxer("bear-320x240.webm"); 478 CreateDemuxer("bear-320x240.webm");
530 InitializeDemuxer(); 479 InitializeDemuxer();
531 480
532 // Submit a "disable audio stream" message to the demuxer. 481 // Submit a "disable audio stream" message to the demuxer.
533 demuxer_->OnAudioRendererDisabled(); 482 demuxer_->OnAudioRendererDisabled();
534 message_loop_.RunUntilIdle(); 483 message_loop_.RunUntilIdle();
535 484
536 // Get our streams. 485 // Get our streams.
537 scoped_refptr<DemuxerStream> video = 486 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
538 demuxer_->GetStream(DemuxerStream::VIDEO); 487 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
539 scoped_refptr<DemuxerStream> audio =
540 demuxer_->GetStream(DemuxerStream::AUDIO);
541 ASSERT_TRUE(video); 488 ASSERT_TRUE(video);
542 ASSERT_TRUE(audio); 489 ASSERT_TRUE(audio);
543 490
544 // The audio stream should have been prematurely stopped. 491 // The audio stream should have been prematurely stopped.
545 EXPECT_FALSE(IsStreamStopped(DemuxerStream::VIDEO)); 492 EXPECT_FALSE(IsStreamStopped(DemuxerStream::VIDEO));
546 EXPECT_TRUE(IsStreamStopped(DemuxerStream::AUDIO)); 493 EXPECT_TRUE(IsStreamStopped(DemuxerStream::AUDIO));
547 494
548 // Attempt a read from the video stream: it should return valid data. 495 // Attempt a read from the video stream: it should return valid data.
549 video->Read(NewReadCB(FROM_HERE, 22084, 0)); 496 video->Read(NewReadCB(FROM_HERE, 22084, 0));
550 message_loop_.Run(); 497 message_loop_.Run();
551 498
552 // Attempt a read from the audio stream: it should immediately return end of 499 // Attempt a read from the audio stream: it should immediately return end of
553 // stream without requiring the message loop to read data. 500 // stream without requiring the message loop to read data.
554 bool got_eos_buffer = false; 501 bool got_eos_buffer = false;
555 audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); 502 audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer));
556 message_loop_.RunUntilIdle(); 503 message_loop_.RunUntilIdle();
557 EXPECT_TRUE(got_eos_buffer); 504 EXPECT_TRUE(got_eos_buffer);
558 } 505 }
559 506
560 // Verify that seek works properly when the WebM cues data is at the start of 507 // Verify that seek works properly when the WebM cues data is at the start of
561 // the file instead of at the end. 508 // the file instead of at the end.
562 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { 509 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) {
563 CreateDemuxer("bear-320x240-cues-in-front.webm"); 510 CreateDemuxer("bear-320x240-cues-in-front.webm");
564 InitializeDemuxer(); 511 InitializeDemuxer();
565 512
566 // Get our streams. 513 // Get our streams.
567 scoped_refptr<DemuxerStream> video = 514 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
568 demuxer_->GetStream(DemuxerStream::VIDEO); 515 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
569 scoped_refptr<DemuxerStream> audio =
570 demuxer_->GetStream(DemuxerStream::AUDIO);
571 ASSERT_TRUE(video); 516 ASSERT_TRUE(video);
572 ASSERT_TRUE(audio); 517 ASSERT_TRUE(audio);
573 518
574 // Read a video packet and release it. 519 // Read a video packet and release it.
575 video->Read(NewReadCB(FROM_HERE, 22084, 0)); 520 video->Read(NewReadCB(FROM_HERE, 22084, 0));
576 message_loop_.Run(); 521 message_loop_.Run();
577 522
578 // Issue a simple forward seek, which should discard queued packets. 523 // Issue a simple forward seek, which should discard queued packets.
579 WaitableMessageLoopEvent event; 524 WaitableMessageLoopEvent event;
580 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000), 525 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000),
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { 596 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) {
652 #if !defined(USE_PROPRIETARY_CODECS) 597 #if !defined(USE_PROPRIETARY_CODECS)
653 return; 598 return;
654 #endif 599 #endif
655 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); 600 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4");
656 InitializeDemuxer(); 601 InitializeDemuxer();
657 ReadUntilEndOfStream(); 602 ReadUntilEndOfStream();
658 } 603 }
659 604
660 } // namespace media 605 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698