Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: media/ffmpeg/ffmpeg_common.cc

Issue 812643005: Re-add AC3/EAC3 audio demuxing support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move CanPlay tests into _mp4 test case Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/ffmpeg/ffmpeg_common.h" 5 #include "media/ffmpeg/ffmpeg_common.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/sha1.h" 10 #include "base/sha1.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 int64 ConvertToTimeBase(const AVRational& time_base, 60 int64 ConvertToTimeBase(const AVRational& time_base,
61 const base::TimeDelta& timestamp) { 61 const base::TimeDelta& timestamp) {
62 return av_rescale_q(timestamp.InMicroseconds(), kMicrosBase, time_base); 62 return av_rescale_q(timestamp.InMicroseconds(), kMicrosBase, time_base);
63 } 63 }
64 64
65 // Converts an FFmpeg audio codec ID into its corresponding supported codec id. 65 // Converts an FFmpeg audio codec ID into its corresponding supported codec id.
66 static AudioCodec CodecIDToAudioCodec(AVCodecID codec_id) { 66 static AudioCodec CodecIDToAudioCodec(AVCodecID codec_id) {
67 switch (codec_id) { 67 switch (codec_id) {
68 case AV_CODEC_ID_AAC: 68 case AV_CODEC_ID_AAC:
69 return kCodecAAC; 69 return kCodecAAC;
70 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
71 case AV_CODEC_ID_AC3:
72 return kCodecAC3;
73 case AV_CODEC_ID_EAC3:
74 return kCodecEAC3;
75 #endif
70 case AV_CODEC_ID_MP3: 76 case AV_CODEC_ID_MP3:
71 return kCodecMP3; 77 return kCodecMP3;
72 case AV_CODEC_ID_VORBIS: 78 case AV_CODEC_ID_VORBIS:
73 return kCodecVorbis; 79 return kCodecVorbis;
74 case AV_CODEC_ID_PCM_U8: 80 case AV_CODEC_ID_PCM_U8:
75 case AV_CODEC_ID_PCM_S16LE: 81 case AV_CODEC_ID_PCM_S16LE:
76 case AV_CODEC_ID_PCM_S24LE: 82 case AV_CODEC_ID_PCM_S24LE:
77 case AV_CODEC_ID_PCM_F32LE: 83 case AV_CODEC_ID_PCM_F32LE:
78 return kCodecPCM; 84 return kCodecPCM;
79 case AV_CODEC_ID_PCM_S16BE: 85 case AV_CODEC_ID_PCM_S16BE:
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 return AV_SAMPLE_FMT_NONE; 292 return AV_SAMPLE_FMT_NONE;
287 } 293 }
288 294
289 bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context, 295 bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
290 bool is_encrypted, 296 bool is_encrypted,
291 AudioDecoderConfig* config) { 297 AudioDecoderConfig* config) {
292 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); 298 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO);
293 299
294 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); 300 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id);
295 301
302 // For AC3/EAC3, FFmpeg does not fill |sample_fmt|.
296 SampleFormat sample_format = 303 SampleFormat sample_format =
297 AVSampleFormatToSampleFormat(codec_context->sample_fmt); 304 (codec == kCodecAC3 || codec == kCodecEAC3)
305 ? kSampleFormatS16
306 : AVSampleFormatToSampleFormat(codec_context->sample_fmt);
298 307
299 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( 308 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
300 codec_context->channel_layout, codec_context->channels); 309 codec_context->channel_layout, codec_context->channels);
301 310
302 int sample_rate = codec_context->sample_rate; 311 int sample_rate = codec_context->sample_rate;
303 if (codec == kCodecOpus) { 312 if (codec == kCodecOpus) {
304 // |codec_context->sample_fmt| is not set by FFmpeg because Opus decoding is 313 // |codec_context->sample_fmt| is not set by FFmpeg because Opus decoding is
305 // not enabled in FFmpeg. It doesn't matter what value is set here, so long 314 // not enabled in FFmpeg. It doesn't matter what value is set here, so long
306 // as it's valid, the true sample format is selected inside the decoder. 315 // as it's valid, the true sample format is selected inside the decoder.
307 sample_format = kSampleFormatF32; 316 sample_format = kSampleFormatF32;
(...skipping 28 matching lines...) Expand all
336 codec_context->extradata + codec_context->extradata_size); 345 codec_context->extradata + codec_context->extradata_size);
337 } 346 }
338 config->Initialize(codec, 347 config->Initialize(codec,
339 sample_format, 348 sample_format,
340 channel_layout, 349 channel_layout,
341 sample_rate, 350 sample_rate,
342 extra_data, 351 extra_data,
343 is_encrypted, 352 is_encrypted,
344 seek_preroll, 353 seek_preroll,
345 codec_context->delay); 354 codec_context->delay);
346 355 if (codec != kCodecOpus && codec != kCodecAC3 && codec != kCodecEAC3) {
347 if (codec != kCodecOpus) {
348 DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8, 356 DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8,
349 config->bits_per_channel()); 357 config->bits_per_channel());
350 } 358 }
351 359
352 return true; 360 return true;
353 } 361 }
354 362
355 bool AVStreamToAudioDecoderConfig(const AVStream* stream, 363 bool AVStreamToAudioDecoderConfig(const AVStream* stream,
356 AudioDecoderConfig* config) { 364 AudioDecoderConfig* config) {
357 bool is_encrypted = false; 365 bool is_encrypted = false;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 } 689 }
682 690
683 int32_t HashCodecName(const char* codec_name) { 691 int32_t HashCodecName(const char* codec_name) {
684 // Use the first 32-bits from the SHA1 hash as the identifier. 692 // Use the first 32-bits from the SHA1 hash as the identifier.
685 int32_t hash; 693 int32_t hash;
686 memcpy(&hash, base::SHA1HashString(codec_name).substr(0, 4).c_str(), 4); 694 memcpy(&hash, base::SHA1HashString(codec_name).substr(0, 4).c_str(), 4);
687 return hash; 695 return hash;
688 } 696 }
689 697
690 } // namespace media 698 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698