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."; |
| 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 |