Chromium Code Reviews| 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 <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 88 type_ = TEXT; | 88 type_ = TEXT; |
| 89 break; | 89 break; |
| 90 default: | 90 default: |
| 91 NOTREACHED(); | 91 NOTREACHED(); |
| 92 break; | 92 break; |
| 93 } | 93 } |
| 94 | 94 |
| 95 // Calculate the duration. | 95 // Calculate the duration. |
| 96 duration_ = ConvertStreamTimestamp(stream->time_base, stream->duration); | 96 duration_ = ConvertStreamTimestamp(stream->time_base, stream->duration); |
| 97 | 97 |
| 98 #if defined(USE_PROPRIETARY_CODECS) | |
| 98 if (stream_->codec->codec_id == AV_CODEC_ID_H264) { | 99 if (stream_->codec->codec_id == AV_CODEC_ID_H264) { |
| 99 bitstream_converter_.reset( | 100 bitstream_converter_.reset( |
| 100 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec)); | 101 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec)); |
| 101 } | 102 } |
| 103 #endif | |
| 102 | 104 |
| 103 if (is_encrypted) { | 105 if (is_encrypted) { |
| 104 AVDictionaryEntry* key = av_dict_get(stream->metadata, "enc_key_id", NULL, | 106 AVDictionaryEntry* key = av_dict_get(stream->metadata, "enc_key_id", NULL, |
| 105 0); | 107 0); |
| 106 DCHECK(key); | 108 DCHECK(key); |
| 107 DCHECK(key->value); | 109 DCHECK(key->value); |
| 108 if (!key || !key->value) | 110 if (!key || !key->value) |
| 109 return; | 111 return; |
| 110 base::StringPiece base64_key_id(key->value); | 112 base::StringPiece base64_key_id(key->value); |
| 111 std::string enc_key_id; | 113 std::string enc_key_id; |
| 112 base::Base64Decode(base64_key_id, &enc_key_id); | 114 base::Base64Decode(base64_key_id, &enc_key_id); |
| 113 DCHECK(!enc_key_id.empty()); | 115 DCHECK(!enc_key_id.empty()); |
| 114 if (enc_key_id.empty()) | 116 if (enc_key_id.empty()) |
| 115 return; | 117 return; |
| 116 | 118 |
| 117 encryption_key_id_.assign(enc_key_id); | 119 encryption_key_id_.assign(enc_key_id); |
| 118 demuxer_->FireNeedKey(kWebMEncryptInitDataType, enc_key_id); | 120 demuxer_->FireNeedKey(kWebMEncryptInitDataType, enc_key_id); |
| 119 } | 121 } |
| 120 } | 122 } |
| 121 | 123 |
| 122 void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { | 124 void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { |
| 123 DCHECK(task_runner_->BelongsToCurrentThread()); | 125 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 124 | 126 |
| 125 if (!demuxer_ || end_of_stream_) { | 127 if (!demuxer_ || end_of_stream_) { |
| 126 NOTREACHED() << "Attempted to enqueue packet on a stopped stream"; | 128 NOTREACHED() << "Attempted to enqueue packet on a stopped stream"; |
| 127 return; | 129 return; |
| 128 } | 130 } |
| 129 | 131 |
| 132 #if defined(USE_PROPRIETARY_CODECS) | |
| 130 // Convert the packet if there is a bitstream filter. | 133 // Convert the packet if there is a bitstream filter. |
| 131 if (packet->data && bitstream_converter_enabled_ && | 134 if (packet->data && bitstream_converter_enabled_ && |
| 132 !bitstream_converter_->ConvertPacket(packet.get())) { | 135 !bitstream_converter_->ConvertPacket(packet.get())) { |
| 133 LOG(ERROR) << "Format conversion failed."; | 136 LOG(ERROR) << "Format conversion failed."; |
| 134 } | 137 } |
| 138 #endif | |
| 135 | 139 |
| 136 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We | 140 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We |
| 137 // keep this generic so that other side_data types in the future can be | 141 // keep this generic so that other side_data types in the future can be |
| 138 // handled the same way as well. | 142 // handled the same way as well. |
| 139 av_packet_split_side_data(packet.get()); | 143 av_packet_split_side_data(packet.get()); |
| 140 | 144 |
| 141 scoped_refptr<DecoderBuffer> buffer; | 145 scoped_refptr<DecoderBuffer> buffer; |
| 142 | 146 |
| 143 if (type() == DemuxerStream::TEXT) { | 147 if (type() == DemuxerStream::TEXT) { |
| 144 int id_size = 0; | 148 int id_size = 0; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 base::ResetAndReturn(&read_cb_).Run( | 290 base::ResetAndReturn(&read_cb_).Run( |
| 287 DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer()); | 291 DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer()); |
| 288 return; | 292 return; |
| 289 } | 293 } |
| 290 | 294 |
| 291 SatisfyPendingRead(); | 295 SatisfyPendingRead(); |
| 292 } | 296 } |
| 293 | 297 |
| 294 void FFmpegDemuxerStream::EnableBitstreamConverter() { | 298 void FFmpegDemuxerStream::EnableBitstreamConverter() { |
| 295 DCHECK(task_runner_->BelongsToCurrentThread()); | 299 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 300 | |
| 301 #if defined(USE_PROPRIETARY_CODECS) | |
| 296 CHECK(bitstream_converter_.get()); | 302 CHECK(bitstream_converter_.get()); |
| 297 bitstream_converter_enabled_ = true; | 303 bitstream_converter_enabled_ = true; |
| 304 #else | |
| 305 NOTREACHED() << "Proprietary codecs not enabled."; | |
|
scherkus (not reviewing)
2014/05/05 18:22:17
will this end up being logspam?
acolwell GONE FROM CHROMIUM
2014/05/05 18:49:02
It shouldn't. Nothing should be calling this metho
| |
| 306 #endif | |
| 298 } | 307 } |
| 299 | 308 |
| 300 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } | 309 bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; } |
| 301 | 310 |
| 302 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { | 311 AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() { |
| 303 DCHECK(task_runner_->BelongsToCurrentThread()); | 312 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 304 CHECK_EQ(type_, AUDIO); | 313 CHECK_EQ(type_, AUDIO); |
| 305 return audio_config_; | 314 return audio_config_; |
| 306 } | 315 } |
| 307 | 316 |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1029 } | 1038 } |
| 1030 for (size_t i = 0; i < buffered.size(); ++i) | 1039 for (size_t i = 0; i < buffered.size(); ++i) |
| 1031 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); | 1040 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); |
| 1032 } | 1041 } |
| 1033 | 1042 |
| 1034 void FFmpegDemuxer::OnDataSourceError() { | 1043 void FFmpegDemuxer::OnDataSourceError() { |
| 1035 host_->OnDemuxerError(PIPELINE_ERROR_READ); | 1044 host_->OnDemuxerError(PIPELINE_ERROR_READ); |
| 1036 } | 1045 } |
| 1037 | 1046 |
| 1038 } // namespace media | 1047 } // namespace media |
| OLD | NEW |