| 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 <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 | 364 |
| 365 if (waiting_for_keyframe_) { | 365 if (waiting_for_keyframe_) { |
| 366 if (packet.get()->flags & AV_PKT_FLAG_KEY) | 366 if (packet.get()->flags & AV_PKT_FLAG_KEY) |
| 367 waiting_for_keyframe_ = false; | 367 waiting_for_keyframe_ = false; |
| 368 else { | 368 else { |
| 369 DVLOG(3) << "Dropped non-keyframe pts=" << packet->pts; | 369 DVLOG(3) << "Dropped non-keyframe pts=" << packet->pts; |
| 370 return; | 370 return; |
| 371 } | 371 } |
| 372 } | 372 } |
| 373 | 373 |
| 374 #if defined(USE_PROPRIETARY_CODECS) | 374 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 375 // Convert the packet if there is a bitstream filter. | 375 // Convert the packet if there is a bitstream filter. |
| 376 if (packet->data && bitstream_converter_ && | 376 if (packet->data && bitstream_converter_ && |
| 377 !bitstream_converter_->ConvertPacket(packet.get())) { | 377 !bitstream_converter_->ConvertPacket(packet.get())) { |
| 378 LOG(ERROR) << "Format conversion failed."; | 378 LOG(ERROR) << "Format conversion failed."; |
| 379 } | 379 } |
| 380 #endif | 380 #endif |
| 381 | 381 |
| 382 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We | 382 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We |
| 383 // keep this generic so that other side_data types in the future can be | 383 // keep this generic so that other side_data types in the future can be |
| 384 // handled the same way as well. | 384 // handled the same way as well. |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 base::ResetAndReturn(&read_cb_).Run(kAborted, nullptr); | 645 base::ResetAndReturn(&read_cb_).Run(kAborted, nullptr); |
| 646 return; | 646 return; |
| 647 } | 647 } |
| 648 | 648 |
| 649 SatisfyPendingRead(); | 649 SatisfyPendingRead(); |
| 650 } | 650 } |
| 651 | 651 |
| 652 void FFmpegDemuxerStream::EnableBitstreamConverter() { | 652 void FFmpegDemuxerStream::EnableBitstreamConverter() { |
| 653 DCHECK(task_runner_->BelongsToCurrentThread()); | 653 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 654 | 654 |
| 655 #if defined(USE_PROPRIETARY_CODECS) | 655 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 656 InitBitstreamConverter(); | 656 InitBitstreamConverter(); |
| 657 #else | 657 #else |
| 658 NOTREACHED() << "Proprietary codecs not enabled."; | 658 NOTREACHED() << "Proprietary codecs not enabled."; |
| 659 #endif | 659 #endif |
| 660 } | 660 } |
| 661 | 661 |
| 662 void FFmpegDemuxerStream::ResetBitstreamConverter() { | 662 void FFmpegDemuxerStream::ResetBitstreamConverter() { |
| 663 #if defined(USE_PROPRIETARY_CODECS) | 663 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 664 if (bitstream_converter_) | 664 if (bitstream_converter_) |
| 665 InitBitstreamConverter(); | 665 InitBitstreamConverter(); |
| 666 #endif // defined(USE_PROPRIETARY_CODECS) | 666 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 667 } | 667 } |
| 668 | 668 |
| 669 void FFmpegDemuxerStream::InitBitstreamConverter() { | 669 void FFmpegDemuxerStream::InitBitstreamConverter() { |
| 670 #if defined(USE_PROPRIETARY_CODECS) | 670 #if BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 671 switch (stream_->codecpar->codec_id) { | 671 switch (stream_->codecpar->codec_id) { |
| 672 case AV_CODEC_ID_H264: | 672 case AV_CODEC_ID_H264: |
| 673 // Clear |extra_data| so that future (fallback) decoders will know that | 673 // Clear |extra_data| so that future (fallback) decoders will know that |
| 674 // conversion is forcibly enabled on this stream. | 674 // conversion is forcibly enabled on this stream. |
| 675 // | 675 // |
| 676 // TODO(sandersd): Ideally we would convert |extra_data| to concatenated | 676 // TODO(sandersd): Ideally we would convert |extra_data| to concatenated |
| 677 // SPS/PPS data, but it's too late to be useful because Initialize() was | 677 // SPS/PPS data, but it's too late to be useful because Initialize() was |
| 678 // already called on GpuVideoDecoder, which is the only path that would | 678 // already called on GpuVideoDecoder, which is the only path that would |
| 679 // consume that data. | 679 // consume that data. |
| 680 if (video_config_) | 680 if (video_config_) |
| 681 video_config_->SetExtraData(std::vector<uint8_t>()); | 681 video_config_->SetExtraData(std::vector<uint8_t>()); |
| 682 bitstream_converter_.reset( | 682 bitstream_converter_.reset( |
| 683 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codecpar)); | 683 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codecpar)); |
| 684 break; | 684 break; |
| 685 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 685 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
| 686 case AV_CODEC_ID_HEVC: | 686 case AV_CODEC_ID_HEVC: |
| 687 bitstream_converter_.reset( | 687 bitstream_converter_.reset( |
| 688 new FFmpegH265ToAnnexBBitstreamConverter(stream_->codecpar)); | 688 new FFmpegH265ToAnnexBBitstreamConverter(stream_->codecpar)); |
| 689 break; | 689 break; |
| 690 #endif | 690 #endif |
| 691 case AV_CODEC_ID_AAC: | 691 case AV_CODEC_ID_AAC: |
| 692 bitstream_converter_.reset( | 692 bitstream_converter_.reset( |
| 693 new FFmpegAACBitstreamConverter(stream_->codecpar)); | 693 new FFmpegAACBitstreamConverter(stream_->codecpar)); |
| 694 break; | 694 break; |
| 695 default: | 695 default: |
| 696 break; | 696 break; |
| 697 } | 697 } |
| 698 #endif // defined(USE_PROPRIETARY_CODECS) | 698 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) |
| 699 } | 699 } |
| 700 | 700 |
| 701 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } | 701 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } |
| 702 | 702 |
| 703 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { | 703 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { |
| 704 DCHECK(task_runner_->BelongsToCurrentThread()); | 704 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 705 DCHECK_EQ(type_, AUDIO); | 705 DCHECK_EQ(type_, AUDIO); |
| 706 DCHECK(audio_config_.get()); | 706 DCHECK(audio_config_.get()); |
| 707 return *audio_config_; | 707 return *audio_config_; |
| 708 } | 708 } |
| (...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1808 | 1808 |
| 1809 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { | 1809 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { |
| 1810 DCHECK(task_runner_->BelongsToCurrentThread()); | 1810 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 1811 for (const auto& stream : streams_) { | 1811 for (const auto& stream : streams_) { |
| 1812 if (stream) | 1812 if (stream) |
| 1813 stream->SetLiveness(liveness); | 1813 stream->SetLiveness(liveness); |
| 1814 } | 1814 } |
| 1815 } | 1815 } |
| 1816 | 1816 |
| 1817 } // namespace media | 1817 } // namespace media |
| OLD | NEW |