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

Unified Diff: media/filters/ffmpeg_demuxer.cc

Issue 2549263002: FFmpegDemuxer should fall back to disabled streams for seeking (Closed)
Patch Set: Set start time to 0 for streams with unknown start time Created 4 years 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.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698