Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 093e4f539b13847a1f7f6beb0e140674af037f69..871e04f6bd22fff7591362f6da9de6f60ab1daa0 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -1523,6 +1523,21 @@ void FFmpegDemuxer::LogMetadata(AVFormatContext* avctx, |
media_log_->AddEvent(std::move(metadata_event)); |
} |
+FFmpegDemuxerStream* FFmpegDemuxer::FindStreamWithLowestStartPts(bool enabled) { |
+ FFmpegDemuxerStream* lowest_start_time_stream = nullptr; |
+ for (const auto& stream : streams_) { |
+ if (!stream || stream->start_time() == kNoTimestamp) |
+ continue; |
+ if (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 |
@@ -1541,25 +1556,36 @@ 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; |
+ FFmpegDemuxerStream* lowest_start_time_enabled_stream = |
+ FindStreamWithLowestStartPts(true); |
+ if (lowest_start_time_enabled_stream && |
+ lowest_start_time_enabled_stream->start_time() <= seek_time) { |
+ return lowest_start_time_enabled_stream; |
+ } |
+ |
+ // Fall back to any enabled stream, even if it's start time is unknown. |
servolk
2016/12/06 18:14:17
TBH I'm not 100% sure about this. Should we prefer
DaleCurtis
2016/12/06 20:18:03
We shouldn't have any streams with a start time of
servolk
2016/12/06 22:05:29
Are you sure about this? Looking at comment https:
DaleCurtis
2016/12/06 22:17:09
We never correct the start time if this is true, s
servolk
2016/12/06 23:00:41
Ok, so in other words this means that it's the rig
DaleCurtis
2016/12/06 23:29:05
I think we can set the start_time to zero when it'
servolk
2016/12/06 23:43:34
You are right, looks like FFmpegDemuxerStream::sta
|
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(); |
- } |
+ if (stream && stream->enabled()) |
+ return stream.get(); |
} |
- // 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 = |
+ FindStreamWithLowestStartPts(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) { |