Commit b42cf2a7 authored by acolwell@chromium.org's avatar acolwell@chromium.org

Update FFmpegDemuxer unknown duration logic to work for video-only streams.

The FFmpegDemuxer would only compute the duration at the end of
playback for clips without a duration that contained audio. This was not
being done for video-only streams which resulted inconsistent behavior.
This change simply make the duration computation logic apply to all
stream types.

TEST=FFmpegDemuxerTest.Read_EndOfStream_NoDuration_VideoOnly, FFmpegDemuxerTest.Read_EndOfStream_NoDuration_AudioOnly

Review URL: https://codereview.chromium.org/105503011

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243304 0039d316-1c4b-4281-b951-d872f2087c98
parent 16c7abc1
...@@ -792,21 +792,22 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { ...@@ -792,21 +792,22 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) {
} }
if (result < 0) { if (result < 0) {
// Update the duration based on the audio stream if // Update the duration based on the highest elapsed time across all streams
// it was previously unknown http://crbug.com/86830 // if it was previously unknown.
if (!duration_known_) { if (!duration_known_) {
// Search streams for AUDIO one. base::TimeDelta max_duration;
for (StreamVector::iterator iter = streams_.begin(); for (StreamVector::iterator iter = streams_.begin();
iter != streams_.end(); iter != streams_.end();
++iter) { ++iter) {
if (*iter && (*iter)->type() == DemuxerStream::AUDIO) { base::TimeDelta duration = (*iter)->GetElapsedTime();
base::TimeDelta duration = (*iter)->GetElapsedTime(); if (duration != kNoTimestamp() && duration > max_duration)
if (duration != kNoTimestamp() && duration > base::TimeDelta()) { max_duration = duration;
host_->SetDuration(duration); }
duration_known_ = true;
} if (max_duration > base::TimeDelta()) {
break; host_->SetDuration(max_duration);
} duration_known_ = true;
} }
} }
// If we have reached the end of stream, tell the downstream filters about // If we have reached the end of stream, tell the downstream filters about
......
...@@ -167,14 +167,11 @@ class FFmpegDemuxerTest : public testing::Test { ...@@ -167,14 +167,11 @@ class FFmpegDemuxerTest : public testing::Test {
return demuxer_->glue_->format_context(); return demuxer_->glue_->format_context();
} }
void ReadUntilEndOfStream() { void ReadUntilEndOfStream(DemuxerStream* stream) {
// We should expect an end of stream buffer.
DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
bool got_eos_buffer = false; bool got_eos_buffer = false;
const int kMaxBuffers = 170; const int kMaxBuffers = 170;
for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) {
audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer));
message_loop_.Run(); message_loop_.Run();
} }
...@@ -414,7 +411,7 @@ TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { ...@@ -414,7 +411,7 @@ TEST_F(FFmpegDemuxerTest, Read_EndOfStream) {
// Verify that end of stream buffers are created. // Verify that end of stream buffers are created.
CreateDemuxer("bear-320x240.webm"); CreateDemuxer("bear-320x240.webm");
InitializeDemuxer(); InitializeDemuxer();
ReadUntilEndOfStream(); ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO));
} }
TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) {
...@@ -442,8 +439,27 @@ TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { ...@@ -442,8 +439,27 @@ TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) {
CreateDemuxer("bear-320x240.webm"); CreateDemuxer("bear-320x240.webm");
InitializeDemuxer(); InitializeDemuxer();
set_duration_known(false); set_duration_known(false);
EXPECT_CALL(host_, SetDuration(_)); EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2767)));
ReadUntilEndOfStream(); ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO));
ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO));
}
TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_VideoOnly) {
// Verify that end of stream buffers are created.
CreateDemuxer("bear-320x240-video-only.webm");
InitializeDemuxer();
set_duration_known(false);
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2703)));
ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO));
}
TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_AudioOnly) {
// Verify that end of stream buffers are created.
CreateDemuxer("bear-320x240-audio-only.webm");
InitializeDemuxer();
set_duration_known(false);
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2767)));
ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO));
} }
TEST_F(FFmpegDemuxerTest, Seek) { TEST_F(FFmpegDemuxerTest, Seek) {
...@@ -703,7 +719,7 @@ TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { ...@@ -703,7 +719,7 @@ TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) {
#endif #endif
CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4");
InitializeDemuxer(); InitializeDemuxer();
ReadUntilEndOfStream(); ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO));
} }
} // namespace media } // namespace media
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment