Chromium Code Reviews| 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. |