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

Side by Side 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: Updated comments + dchecks in ffmpeg demux stream 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/ffmpeg_demuxer.h" 5 #include "media/filters/ffmpeg_demuxer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 task_runner_(base::ThreadTaskRunnerHandle::Get()), 260 task_runner_(base::ThreadTaskRunnerHandle::Get()),
261 stream_(stream), 261 stream_(stream),
262 audio_config_(audio_config.release()), 262 audio_config_(audio_config.release()),
263 video_config_(video_config.release()), 263 video_config_(video_config.release()),
264 type_(UNKNOWN), 264 type_(UNKNOWN),
265 liveness_(LIVENESS_UNKNOWN), 265 liveness_(LIVENESS_UNKNOWN),
266 end_of_stream_(false), 266 end_of_stream_(false),
267 last_packet_timestamp_(kNoTimestamp()), 267 last_packet_timestamp_(kNoTimestamp()),
268 last_packet_duration_(kNoTimestamp()), 268 last_packet_duration_(kNoTimestamp()),
269 video_rotation_(VIDEO_ROTATION_0), 269 video_rotation_(VIDEO_ROTATION_0),
270 is_enabled_(true),
270 fixup_negative_timestamps_(false) { 271 fixup_negative_timestamps_(false) {
271 DCHECK(demuxer_); 272 DCHECK(demuxer_);
272 273
273 bool is_encrypted = false; 274 bool is_encrypted = false;
274 int rotation = 0; 275 int rotation = 0;
275 AVDictionaryEntry* rotation_entry = NULL; 276 AVDictionaryEntry* rotation_entry = NULL;
276 277
277 // Determine our media format. 278 // Determine our media format.
278 switch (stream->codec->codec_type) { 279 switch (stream->codec->codec_type) {
279 case AVMEDIA_TYPE_AUDIO: 280 case AVMEDIA_TYPE_AUDIO:
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 // Don't accept any additional reads if we've been told to stop. 607 // Don't accept any additional reads if we've been told to stop.
607 // The |demuxer_| may have been destroyed in the pipeline thread. 608 // The |demuxer_| may have been destroyed in the pipeline thread.
608 // 609 //
609 // TODO(scherkus): it would be cleaner to reply with an error message. 610 // TODO(scherkus): it would be cleaner to reply with an error message.
610 if (!demuxer_) { 611 if (!demuxer_) {
611 base::ResetAndReturn(&read_cb_).Run( 612 base::ResetAndReturn(&read_cb_).Run(
612 DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer()); 613 DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer());
613 return; 614 return;
614 } 615 }
615 616
617 if (!is_enabled_) {
618 DVLOG(1) << "Read from disabled stream, returning EOS";
619 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer());
620 return;
621 }
622
616 SatisfyPendingRead(); 623 SatisfyPendingRead();
617 } 624 }
618 625
619 void FFmpegDemuxerStream::EnableBitstreamConverter() { 626 void FFmpegDemuxerStream::EnableBitstreamConverter() {
620 DCHECK(task_runner_->BelongsToCurrentThread()); 627 DCHECK(task_runner_->BelongsToCurrentThread());
621 628
622 #if defined(USE_PROPRIETARY_CODECS) 629 #if defined(USE_PROPRIETARY_CODECS)
623 InitBitstreamConverter(); 630 InitBitstreamConverter();
624 #else 631 #else
625 NOTREACHED() << "Proprietary codecs not enabled."; 632 NOTREACHED() << "Proprietary codecs not enabled.";
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 DCHECK(task_runner_->BelongsToCurrentThread()); 676 DCHECK(task_runner_->BelongsToCurrentThread());
670 DCHECK_EQ(type_, VIDEO); 677 DCHECK_EQ(type_, VIDEO);
671 DCHECK(video_config_.get()); 678 DCHECK(video_config_.get());
672 return *video_config_; 679 return *video_config_;
673 } 680 }
674 681
675 VideoRotation FFmpegDemuxerStream::video_rotation() { 682 VideoRotation FFmpegDemuxerStream::video_rotation() {
676 return video_rotation_; 683 return video_rotation_;
677 } 684 }
678 685
686 bool FFmpegDemuxerStream::enabled() const {
687 DCHECK(task_runner_->BelongsToCurrentThread());
688 return is_enabled_;
689 }
690
691 void FFmpegDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) {
chcunningham 2016/06/02 23:49:43 I feel like we need some logic here to drop frames
692 DCHECK(task_runner_->BelongsToCurrentThread());
693 if (enabled == is_enabled_)
694 return;
695
696 is_enabled_ = enabled;
697 if (!is_enabled_ && !read_cb_.is_null()) {
698 DVLOG(1) << "Read from disabled stream, returning EOS";
699 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer());
700 return;
701 }
702 }
703
679 void FFmpegDemuxerStream::SetLiveness(Liveness liveness) { 704 void FFmpegDemuxerStream::SetLiveness(Liveness liveness) {
680 DCHECK(task_runner_->BelongsToCurrentThread()); 705 DCHECK(task_runner_->BelongsToCurrentThread());
681 DCHECK_EQ(liveness_, LIVENESS_UNKNOWN); 706 DCHECK_EQ(liveness_, LIVENESS_UNKNOWN);
682 liveness_ = liveness; 707 liveness_ = liveness;
683 } 708 }
684 709
685 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { 710 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const {
686 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); 711 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts);
687 } 712 }
688 713
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 // 1556 //
1532 // https://code.google.com/p/chromium/issues/detail?id=169133#c10 1557 // https://code.google.com/p/chromium/issues/detail?id=169133#c10
1533 if (!packet->data) { 1558 if (!packet->data) {
1534 ScopedAVPacket new_packet(new AVPacket()); 1559 ScopedAVPacket new_packet(new AVPacket());
1535 av_new_packet(new_packet.get(), 0); 1560 av_new_packet(new_packet.get(), 0);
1536 av_packet_copy_props(new_packet.get(), packet.get()); 1561 av_packet_copy_props(new_packet.get(), packet.get());
1537 packet.swap(new_packet); 1562 packet.swap(new_packet);
1538 } 1563 }
1539 1564
1540 FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index]; 1565 FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index];
1541 demuxer_stream->EnqueuePacket(std::move(packet)); 1566 if (demuxer_stream->enabled())
1567 demuxer_stream->EnqueuePacket(std::move(packet));
1542 } 1568 }
1543 1569
1544 // Keep reading until we've reached capacity. 1570 // Keep reading until we've reached capacity.
1545 ReadFrameIfNeeded(); 1571 ReadFrameIfNeeded();
1546 } 1572 }
1547 1573
1548 bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { 1574 bool FFmpegDemuxer::StreamsHaveAvailableCapacity() {
1549 DCHECK(task_runner_->BelongsToCurrentThread()); 1575 DCHECK(task_runner_->BelongsToCurrentThread());
1550 StreamVector::iterator iter; 1576 StreamVector::iterator iter;
1551 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { 1577 for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 } 1632 }
1607 1633
1608 const DemuxerStream* FFmpegDemuxer::GetDemuxerStreamByTrackId( 1634 const DemuxerStream* FFmpegDemuxer::GetDemuxerStreamByTrackId(
1609 unsigned track_id) const { 1635 unsigned track_id) const {
1610 const auto& it = track_id_to_demux_stream_.find(track_id); 1636 const auto& it = track_id_to_demux_stream_.find(track_id);
1611 CHECK(it != track_id_to_demux_stream_.end()); 1637 CHECK(it != track_id_to_demux_stream_.end());
1612 return it->second; 1638 return it->second;
1613 } 1639 }
1614 1640
1615 } // namespace media 1641 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698