| 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 BUILDFLAG(USE_PROPRIETARY_CODECS) | 374 #if defined(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 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 base::ResetAndReturn(&read_cb_).Run(kAborted, nullptr); | 648 base::ResetAndReturn(&read_cb_).Run(kAborted, nullptr); |
| 649 return; | 649 return; |
| 650 } | 650 } |
| 651 | 651 |
| 652 SatisfyPendingRead(); | 652 SatisfyPendingRead(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void FFmpegDemuxerStream::EnableBitstreamConverter() { | 655 void FFmpegDemuxerStream::EnableBitstreamConverter() { |
| 656 DCHECK(task_runner_->BelongsToCurrentThread()); | 656 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 657 | 657 |
| 658 #if BUILDFLAG(USE_PROPRIETARY_CODECS) | 658 #if defined(USE_PROPRIETARY_CODECS) |
| 659 InitBitstreamConverter(); | 659 InitBitstreamConverter(); |
| 660 #else | 660 #else |
| 661 NOTREACHED() << "Proprietary codecs not enabled."; | 661 NOTREACHED() << "Proprietary codecs not enabled."; |
| 662 #endif | 662 #endif |
| 663 } | 663 } |
| 664 | 664 |
| 665 void FFmpegDemuxerStream::ResetBitstreamConverter() { | 665 void FFmpegDemuxerStream::ResetBitstreamConverter() { |
| 666 #if BUILDFLAG(USE_PROPRIETARY_CODECS) | 666 #if defined(USE_PROPRIETARY_CODECS) |
| 667 if (bitstream_converter_) | 667 if (bitstream_converter_) |
| 668 InitBitstreamConverter(); | 668 InitBitstreamConverter(); |
| 669 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) | 669 #endif // defined(USE_PROPRIETARY_CODECS) |
| 670 } | 670 } |
| 671 | 671 |
| 672 void FFmpegDemuxerStream::InitBitstreamConverter() { | 672 void FFmpegDemuxerStream::InitBitstreamConverter() { |
| 673 #if BUILDFLAG(USE_PROPRIETARY_CODECS) | 673 #if defined(USE_PROPRIETARY_CODECS) |
| 674 switch (stream_->codecpar->codec_id) { | 674 switch (stream_->codecpar->codec_id) { |
| 675 case AV_CODEC_ID_H264: | 675 case AV_CODEC_ID_H264: |
| 676 // Clear |extra_data| so that future (fallback) decoders will know that | 676 // Clear |extra_data| so that future (fallback) decoders will know that |
| 677 // conversion is forcibly enabled on this stream. | 677 // conversion is forcibly enabled on this stream. |
| 678 // | 678 // |
| 679 // TODO(sandersd): Ideally we would convert |extra_data| to concatenated | 679 // TODO(sandersd): Ideally we would convert |extra_data| to concatenated |
| 680 // SPS/PPS data, but it's too late to be useful because Initialize() was | 680 // SPS/PPS data, but it's too late to be useful because Initialize() was |
| 681 // already called on GpuVideoDecoder, which is the only path that would | 681 // already called on GpuVideoDecoder, which is the only path that would |
| 682 // consume that data. | 682 // consume that data. |
| 683 if (video_config_) | 683 if (video_config_) |
| 684 video_config_->SetExtraData(std::vector<uint8_t>()); | 684 video_config_->SetExtraData(std::vector<uint8_t>()); |
| 685 bitstream_converter_.reset( | 685 bitstream_converter_.reset( |
| 686 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codecpar)); | 686 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codecpar)); |
| 687 break; | 687 break; |
| 688 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 688 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
| 689 case AV_CODEC_ID_HEVC: | 689 case AV_CODEC_ID_HEVC: |
| 690 bitstream_converter_.reset( | 690 bitstream_converter_.reset( |
| 691 new FFmpegH265ToAnnexBBitstreamConverter(stream_->codecpar)); | 691 new FFmpegH265ToAnnexBBitstreamConverter(stream_->codecpar)); |
| 692 break; | 692 break; |
| 693 #endif | 693 #endif |
| 694 case AV_CODEC_ID_AAC: | 694 case AV_CODEC_ID_AAC: |
| 695 bitstream_converter_.reset( | 695 bitstream_converter_.reset( |
| 696 new FFmpegAACBitstreamConverter(stream_->codecpar)); | 696 new FFmpegAACBitstreamConverter(stream_->codecpar)); |
| 697 break; | 697 break; |
| 698 default: | 698 default: |
| 699 break; | 699 break; |
| 700 } | 700 } |
| 701 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) | 701 #endif // defined(USE_PROPRIETARY_CODECS) |
| 702 } | 702 } |
| 703 | 703 |
| 704 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } | 704 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } |
| 705 | 705 |
| 706 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { | 706 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { |
| 707 DCHECK(task_runner_->BelongsToCurrentThread()); | 707 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 708 DCHECK_EQ(type_, AUDIO); | 708 DCHECK_EQ(type_, AUDIO); |
| 709 DCHECK(audio_config_.get()); | 709 DCHECK(audio_config_.get()); |
| 710 return *audio_config_; | 710 return *audio_config_; |
| 711 } | 711 } |
| (...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 | 1804 |
| 1805 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { | 1805 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { |
| 1806 DCHECK(task_runner_->BelongsToCurrentThread()); | 1806 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 1807 for (const auto& stream : streams_) { | 1807 for (const auto& stream : streams_) { |
| 1808 if (stream) | 1808 if (stream) |
| 1809 stream->SetLiveness(liveness); | 1809 stream->SetLiveness(liveness); |
| 1810 } | 1810 } |
| 1811 } | 1811 } |
| 1812 | 1812 |
| 1813 } // namespace media | 1813 } // namespace media |
| OLD | NEW |