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

Unified Diff: media/filters/ffmpeg_demuxer_unittest.cc

Issue 2825863002: Fix status notifications for FFmpegDemuxerStream with a pending read (Closed)
Patch Set: Add a comment explaining FlushBuffers Created 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/ffmpeg_demuxer_unittest.cc
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
index 1c84ca97a2718a0b68334a19e9f3bed058bcbe7e..e7459cec6cad7aed1441aa77a32391fbbedfda54 100644
--- a/media/filters/ffmpeg_demuxer_unittest.cc
+++ b/media/filters/ffmpeg_demuxer_unittest.cc
@@ -54,6 +54,40 @@ MATCHER(IsEndOfStreamBuffer,
return arg->end_of_stream();
}
+namespace {
+void OnStreamStatusChanged(base::WaitableEvent* event,
+ DemuxerStream* stream,
+ bool enabled,
+ base::TimeDelta) {
+ event->Signal();
+}
+
+void CheckStreamStatusNotifications(MediaResource* media_resource,
+ FFmpegDemuxerStream* stream) {
+ base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+ base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+ ASSERT_TRUE(stream->IsEnabled());
+ media_resource->SetStreamStatusChangeCB(
+ base::Bind(&OnStreamStatusChanged, base::Unretained(&event)));
+
+ stream->SetEnabled(false, base::TimeDelta());
+ base::RunLoop().RunUntilIdle();
+ ASSERT_TRUE(event.IsSignaled());
+
+ event.Reset();
+ stream->SetEnabled(true, base::TimeDelta());
+ base::RunLoop().RunUntilIdle();
+ ASSERT_TRUE(event.IsSignaled());
+}
+
+void OnReadDone_ExpectEos(DemuxerStream::Status status,
+ const scoped_refptr<DecoderBuffer>& buffer) {
+ EXPECT_EQ(status, DemuxerStream::kOk);
+ EXPECT_TRUE(buffer->end_of_stream());
+}
+}
+
const uint8_t kEncryptedMediaInitData[] = {
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
@@ -1598,4 +1632,30 @@ TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledAudioStream) {
EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta()));
}
+TEST_F(FFmpegDemuxerTest, StreamStatusNotifications) {
+ CreateDemuxer("bear-320x240.webm");
+ InitializeDemuxer();
+ FFmpegDemuxerStream* audio_stream =
+ static_cast<FFmpegDemuxerStream*>(GetStream(DemuxerStream::AUDIO));
+ EXPECT_NE(nullptr, audio_stream);
+ FFmpegDemuxerStream* video_stream =
+ static_cast<FFmpegDemuxerStream*>(GetStream(DemuxerStream::VIDEO));
+ EXPECT_NE(nullptr, video_stream);
+
+ // Verify stream status notifications delivery without pending read first.
+ CheckStreamStatusNotifications(demuxer_.get(), audio_stream);
+ CheckStreamStatusNotifications(demuxer_.get(), video_stream);
+
+ // Verify that stream notifications are delivered properly when stream status
+ // changes with a pending read. Call FlushBuffers before reading, to ensure
+ // there is no buffers ready to be returned by the Read right away, thus
+ // ensuring that status changes occur while an async read is pending.
+ audio_stream->FlushBuffers();
+ audio_stream->Read(base::Bind(&media::OnReadDone_ExpectEos));
+ CheckStreamStatusNotifications(demuxer_.get(), audio_stream);
+ video_stream->FlushBuffers();
+ video_stream->Read(base::Bind(&media::OnReadDone_ExpectEos));
+ CheckStreamStatusNotifications(demuxer_.get(), video_stream);
+}
+
} // namespace media
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698