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

Unified Diff: media/filters/ffmpeg_demuxer.cc

Issue 1935873002: Implement disabling and enabling media tracks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@track-control2
Patch Set: rebase + buildfix Created 4 years, 6 months 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
Index: media/filters/ffmpeg_demuxer.cc
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index 76ac688f911fd68f56ddc6cbbc8dbc451964f466..f546e670148d54158fb14fd31773fb937fba7fa1 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -272,6 +272,8 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(
last_packet_timestamp_(kNoTimestamp()),
last_packet_duration_(kNoTimestamp()),
video_rotation_(VIDEO_ROTATION_0),
+ is_enabled_(true),
+ waiting_for_keyframe_(false),
fixup_negative_timestamps_(false) {
DCHECK(demuxer_);
@@ -358,6 +360,13 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) {
return;
}
+ if (waiting_for_keyframe_) {
+ if (packet.get()->flags & AV_PKT_FLAG_KEY)
+ waiting_for_keyframe_ = false;
+ else
+ return;
chcunningham 2016/06/24 23:32:55 This would be good to DVLOG - "Dropping non-key fr
servolk 2016/06/25 00:36:33 Done.
+ }
+
#if defined(USE_PROPRIETARY_CODECS)
// Convert the packet if there is a bitstream filter.
if (packet->data && bitstream_converter_ &&
@@ -618,6 +627,12 @@ void FFmpegDemuxerStream::Read(const ReadCB& read_cb) {
return;
}
+ if (!is_enabled_) {
+ DVLOG(1) << "Read from disabled stream, returning EOS";
+ base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer());
+ return;
+ }
+
SatisfyPendingRead();
}
@@ -681,6 +696,34 @@ VideoRotation FFmpegDemuxerStream::video_rotation() {
return video_rotation_;
}
+bool FFmpegDemuxerStream::enabled() const {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ return is_enabled_;
+}
+
+void FFmpegDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ if (enabled == is_enabled_)
+ return;
+
+ is_enabled_ = enabled;
+ if (is_enabled_) {
+ waiting_for_keyframe_ = true;
+ if (!stream_restarted_cb_.is_null())
+ stream_restarted_cb_.Run(this, timestamp);
+ }
+ if (!is_enabled_ && !read_cb_.is_null()) {
+ DVLOG(1) << "Read from disabled stream, returning EOS";
+ base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer());
+ return;
+ }
+}
+
+void FFmpegDemuxerStream::SetStreamRestartedCB(const StreamRestartedCB& cb) {
+ DCHECK(!cb.is_null());
+ stream_restarted_cb_ = cb;
+}
+
void FFmpegDemuxerStream::SetLiveness(Liveness liveness) {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK_EQ(liveness_, LIVENESS_UNKNOWN);
@@ -1469,6 +1512,34 @@ void FFmpegDemuxer::OnSeekFrameDone(const PipelineStatusCB& cb, int result) {
cb.Run(PIPELINE_OK);
}
+void FFmpegDemuxer::OnEnabledAudioTracksChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta currTime) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ bool enabled = false;
+ DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
+ CHECK(audio_stream);
+ if (track_ids.size() > 0) {
+ // DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == audio_stream);
+ enabled = true;
+ }
+ audio_stream->set_enabled(enabled, currTime);
+}
+
+void FFmpegDemuxer::OnSelectedVideoTrackChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta currTime) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ bool enabled = false;
+ DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
+ CHECK(video_stream);
+ if (track_ids.size() > 0) {
+ // DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == video_stream);
+ enabled = true;
+ }
+ video_stream->set_enabled(enabled, currTime);
+}
+
void FFmpegDemuxer::ReadFrameIfNeeded() {
DCHECK(task_runner_->BelongsToCurrentThread());
@@ -1556,7 +1627,8 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) {
}
FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index];
- demuxer_stream->EnqueuePacket(std::move(packet));
+ if (demuxer_stream->enabled())
+ demuxer_stream->EnqueuePacket(std::move(packet));
}
// Keep reading until we've reached capacity.

Powered by Google App Engine
This is Rietveld 408576698