| 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) {
|
|
|