OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 return is_enabled_; |
| 688 } |
| 689 |
| 690 void FFmpegDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) { |
| 691 if (enabled == is_enabled_) |
| 692 return; |
| 693 |
| 694 is_enabled_ = enabled; |
| 695 if (!is_enabled_ && !read_cb_.is_null()) { |
| 696 DVLOG(1) << "Read from disabled stream, returning EOS"; |
| 697 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer()); |
| 698 return; |
| 699 } |
| 700 } |
| 701 |
679 void FFmpegDemuxerStream::SetLiveness(Liveness liveness) { | 702 void FFmpegDemuxerStream::SetLiveness(Liveness liveness) { |
680 DCHECK(task_runner_->BelongsToCurrentThread()); | 703 DCHECK(task_runner_->BelongsToCurrentThread()); |
681 DCHECK_EQ(liveness_, LIVENESS_UNKNOWN); | 704 DCHECK_EQ(liveness_, LIVENESS_UNKNOWN); |
682 liveness_ = liveness; | 705 liveness_ = liveness; |
683 } | 706 } |
684 | 707 |
685 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { | 708 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { |
686 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); | 709 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); |
687 } | 710 } |
688 | 711 |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1531 // | 1554 // |
1532 // https://code.google.com/p/chromium/issues/detail?id=169133#c10 | 1555 // https://code.google.com/p/chromium/issues/detail?id=169133#c10 |
1533 if (!packet->data) { | 1556 if (!packet->data) { |
1534 ScopedAVPacket new_packet(new AVPacket()); | 1557 ScopedAVPacket new_packet(new AVPacket()); |
1535 av_new_packet(new_packet.get(), 0); | 1558 av_new_packet(new_packet.get(), 0); |
1536 av_packet_copy_props(new_packet.get(), packet.get()); | 1559 av_packet_copy_props(new_packet.get(), packet.get()); |
1537 packet.swap(new_packet); | 1560 packet.swap(new_packet); |
1538 } | 1561 } |
1539 | 1562 |
1540 FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index]; | 1563 FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index]; |
1541 demuxer_stream->EnqueuePacket(std::move(packet)); | 1564 if (demuxer_stream->enabled()) |
| 1565 demuxer_stream->EnqueuePacket(std::move(packet)); |
1542 } | 1566 } |
1543 | 1567 |
1544 // Keep reading until we've reached capacity. | 1568 // Keep reading until we've reached capacity. |
1545 ReadFrameIfNeeded(); | 1569 ReadFrameIfNeeded(); |
1546 } | 1570 } |
1547 | 1571 |
1548 bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { | 1572 bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { |
1549 DCHECK(task_runner_->BelongsToCurrentThread()); | 1573 DCHECK(task_runner_->BelongsToCurrentThread()); |
1550 StreamVector::iterator iter; | 1574 StreamVector::iterator iter; |
1551 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { | 1575 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1606 } | 1630 } |
1607 | 1631 |
1608 const DemuxerStream* FFmpegDemuxer::GetDemuxerStreamByTrackId( | 1632 const DemuxerStream* FFmpegDemuxer::GetDemuxerStreamByTrackId( |
1609 unsigned track_id) const { | 1633 unsigned track_id) const { |
1610 const auto& it = track_id_to_demux_stream_.find(track_id); | 1634 const auto& it = track_id_to_demux_stream_.find(track_id); |
1611 CHECK(it != track_id_to_demux_stream_.end()); | 1635 CHECK(it != track_id_to_demux_stream_.end()); |
1612 return it->second; | 1636 return it->second; |
1613 } | 1637 } |
1614 | 1638 |
1615 } // namespace media | 1639 } // namespace media |
OLD | NEW |