Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 093e4f539b13847a1f7f6beb0e140674af037f69..6eb5cf0dc3df17afcde79fff3036fb08622196d6 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -74,7 +74,7 @@ static base::TimeDelta ExtractStartTime(AVStream* stream, |
base::TimeDelta start_time_estimate) { |
DCHECK(start_time_estimate != kNoTimestamp); |
if (stream->start_time == static_cast<int64_t>(AV_NOPTS_VALUE)) { |
- return start_time_estimate == kInfiniteDuration ? kNoTimestamp |
+ return start_time_estimate == kInfiniteDuration ? base::TimeDelta() |
: start_time_estimate; |
} |
@@ -1339,11 +1339,6 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb, |
const base::TimeDelta start_time = |
ExtractStartTime(stream, start_time_estimates[i]); |
- const bool has_start_time = start_time != kNoTimestamp; |
- |
- if (!has_start_time) |
- continue; |
- |
streams_[i]->set_start_time(start_time); |
if (start_time < start_time_) { |
start_time_ = start_time; |
@@ -1523,6 +1518,20 @@ void FFmpegDemuxer::LogMetadata(AVFormatContext* avctx, |
media_log_->AddEvent(std::move(metadata_event)); |
} |
+FFmpegDemuxerStream* FFmpegDemuxer::FindStreamWithLowestStartTimestamp( |
+ bool enabled) { |
+ FFmpegDemuxerStream* lowest_start_time_stream = nullptr; |
+ for (const auto& stream : streams_) { |
+ if (!stream || stream->enabled() != enabled) |
+ continue; |
+ if (!lowest_start_time_stream || |
+ stream->start_time() < lowest_start_time_stream->start_time()) { |
+ lowest_start_time_stream = stream.get(); |
+ } |
+ } |
+ return lowest_start_time_stream; |
+} |
+ |
FFmpegDemuxerStream* FFmpegDemuxer::FindPreferredStreamForSeeking( |
base::TimeDelta seek_time) { |
// If we have a selected/enabled video stream and its start time is lower |
@@ -1531,8 +1540,7 @@ FFmpegDemuxerStream* FFmpegDemuxer::FindPreferredStreamForSeeking( |
for (const auto& stream : streams_) { |
if (stream && stream->type() == DemuxerStream::VIDEO && stream->enabled()) { |
video_stream = stream.get(); |
- if (video_stream->start_time() == kNoTimestamp || |
- video_stream->start_time() <= seek_time) { |
+ if (video_stream->start_time() <= seek_time) { |
return video_stream; |
} |
break; |
@@ -1541,25 +1549,30 @@ FFmpegDemuxerStream* FFmpegDemuxer::FindPreferredStreamForSeeking( |
// If video stream is not present or |seek_time| is lower than the video start |
// time, then try to find an enabled stream with the lowest start time. |
- FFmpegDemuxerStream* lowest_start_time_stream = nullptr; |
- for (const auto& stream : streams_) { |
- if (!stream || !stream->enabled() || stream->start_time() == kNoTimestamp) |
- continue; |
- if (!lowest_start_time_stream || |
- stream->start_time() < lowest_start_time_stream->start_time()) { |
- lowest_start_time_stream = stream.get(); |
- } |
+ FFmpegDemuxerStream* lowest_start_time_enabled_stream = |
+ FindStreamWithLowestStartTimestamp(true); |
+ if (lowest_start_time_enabled_stream && |
+ lowest_start_time_enabled_stream->start_time() <= seek_time) { |
+ return lowest_start_time_enabled_stream; |
} |
- // If we found a stream with start time lower than |seek_time|, then use it. |
- if (lowest_start_time_stream && |
- lowest_start_time_stream->start_time() <= seek_time) { |
- return lowest_start_time_stream; |
+ |
+ // If there's no enabled streams to consider from, try a disabled stream with |
+ // the lowest known start time. |
+ FFmpegDemuxerStream* lowest_start_time_disabled_stream = |
+ FindStreamWithLowestStartTimestamp(false); |
+ if (lowest_start_time_disabled_stream && |
+ lowest_start_time_disabled_stream->start_time() <= seek_time) { |
+ return lowest_start_time_disabled_stream; |
+ } |
+ |
+ // Otherwise fall back to any other stream. |
+ for (const auto& stream : streams_) { |
+ if (stream) |
+ return stream.get(); |
} |
- // If we couldn't find any streams with the start time lower than |seek_time| |
- // then use either video (if one exists) or any audio stream. |
- return video_stream ? video_stream : static_cast<FFmpegDemuxerStream*>( |
- GetStream(DemuxerStream::AUDIO)); |
+ NOTREACHED(); |
+ return nullptr; |
} |
void FFmpegDemuxer::OnSeekFrameDone(int result) { |