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

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

Issue 7867051: Introduce AudioDecoderConfig to migrate away from GetAVStream(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: samples_per_second Created 9 years, 3 months 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 | Annotate | Revision Log
« no previous file with comments | « media/ffmpeg/ffmpeg_common.h ('k') | media/filters/adaptive_demuxer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/logging.h" 7 #include "base/logging.h"
8 8
9 namespace media { 9 namespace media {
10 10
11 static const AVRational kMicrosBase = { 1, base::Time::kMicrosecondsPerSecond }; 11 static const AVRational kMicrosBase = { 1, base::Time::kMicrosecondsPerSecond };
12 12
13 base::TimeDelta ConvertFromTimeBase(const AVRational& time_base, 13 base::TimeDelta ConvertFromTimeBase(const AVRational& time_base,
14 int64 timestamp) { 14 int64 timestamp) {
15 int64 microseconds = av_rescale_q(timestamp, time_base, kMicrosBase); 15 int64 microseconds = av_rescale_q(timestamp, time_base, kMicrosBase);
16 return base::TimeDelta::FromMicroseconds(microseconds); 16 return base::TimeDelta::FromMicroseconds(microseconds);
17 } 17 }
18 18
19 int64 ConvertToTimeBase(const AVRational& time_base, 19 int64 ConvertToTimeBase(const AVRational& time_base,
20 const base::TimeDelta& timestamp) { 20 const base::TimeDelta& timestamp) {
21 return av_rescale_q(timestamp.InMicroseconds(), kMicrosBase, time_base); 21 return av_rescale_q(timestamp.InMicroseconds(), kMicrosBase, time_base);
22 } 22 }
23 23
24 static AudioCodec CodecIDToAudioCodec(CodecID codec_id) {
25 switch (codec_id) {
26 case CODEC_ID_AAC:
27 return kCodecAAC;
28 case CODEC_ID_MP3:
29 return kCodecMP3;
30 case CODEC_ID_VORBIS:
31 return kCodecVorbis;
32 case CODEC_ID_PCM_U8:
33 case CODEC_ID_PCM_S16LE:
34 case CODEC_ID_PCM_S32LE:
35 return kCodecPCM;
36 default:
37 NOTREACHED();
38 }
39 return kUnknownAudioCodec;
40 }
41
42 static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
43 int bits_per_channel) {
44 switch (audio_codec) {
45 case kUnknownAudioCodec:
46 return CODEC_ID_NONE;
47 case kCodecAAC:
48 return CODEC_ID_AAC;
49 case kCodecMP3:
50 return CODEC_ID_MP3;
51 case kCodecPCM:
52 switch (bits_per_channel) {
53 case 8:
54 return CODEC_ID_PCM_U8;
55 case 16:
56 return CODEC_ID_PCM_S16LE;
57 case 32:
58 return CODEC_ID_PCM_S32LE;
59 default:
60 NOTREACHED() << "Unsupported bits_per_channel: " << bits_per_channel;
61 }
62 case kCodecVorbis:
63 return CODEC_ID_VORBIS;
64 default:
65 NOTREACHED();
66 }
67 return CODEC_ID_NONE;
68 }
69
70 void AVCodecContextToAudioDecoderConfig(
71 const AVCodecContext* codec_context,
72 AudioDecoderConfig* config) {
73 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO);
74
75 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id);
76 int bits_per_channel = av_get_bits_per_sample_fmt(codec_context->sample_fmt);
77 ChannelLayout channel_layout =
78 ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
79 codec_context->channels);
80 int samples_per_second = codec_context->sample_rate;
81
82 config->Initialize(codec,
83 bits_per_channel,
84 channel_layout,
85 samples_per_second,
86 codec_context->extradata,
87 codec_context->extradata_size);
88 }
89
90 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
91 AVCodecContext* codec_context) {
92 codec_context->codec_type = AVMEDIA_TYPE_AUDIO;
93 codec_context->codec_id = AudioCodecToCodecID(config.codec(),
94 config.bits_per_channel());
95
96 switch (config.bits_per_channel()) {
97 case 8:
98 codec_context->sample_fmt = AV_SAMPLE_FMT_U8;
99 break;
100 case 16:
101 codec_context->sample_fmt = AV_SAMPLE_FMT_S16;
102 break;
103 case 32:
104 codec_context->sample_fmt = AV_SAMPLE_FMT_S32;
105 break;
106 default:
107 NOTIMPLEMENTED() << "TODO(scherkus): DO SOMETHING BETTER HERE?";
108 codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
109 }
110
111 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
112 // said information to decode.
113 codec_context->channels =
114 ChannelLayoutToChannelCount(config.channel_layout());
115 codec_context->sample_rate = config.samples_per_second();
116
117 if (config.extra_data()) {
118 codec_context->extradata_size = config.extra_data_size();
119 codec_context->extradata = reinterpret_cast<uint8_t*>(
120 av_malloc(config.extra_data_size() + FF_INPUT_BUFFER_PADDING_SIZE));
121 memcpy(codec_context->extradata, config.extra_data(),
122 config.extra_data_size());
123 memset(codec_context->extradata + config.extra_data_size(), '\0',
124 FF_INPUT_BUFFER_PADDING_SIZE);
125 } else {
126 codec_context->extradata = NULL;
127 codec_context->extradata_size = 0;
128 }
129 }
130
24 VideoCodec CodecIDToVideoCodec(CodecID codec_id) { 131 VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
25 switch (codec_id) { 132 switch (codec_id) {
26 case CODEC_ID_VC1: 133 case CODEC_ID_VC1:
27 return kCodecVC1; 134 return kCodecVC1;
28 case CODEC_ID_H264: 135 case CODEC_ID_H264:
29 return kCodecH264; 136 return kCodecH264;
30 case CODEC_ID_THEORA: 137 case CODEC_ID_THEORA:
31 return kCodecTheora; 138 return kCodecTheora;
32 case CODEC_ID_MPEG2VIDEO: 139 case CODEC_ID_MPEG2VIDEO:
33 return kCodecMPEG2; 140 return kCodecMPEG2;
34 case CODEC_ID_MPEG4: 141 case CODEC_ID_MPEG4:
35 return kCodecMPEG4; 142 return kCodecMPEG4;
36 case CODEC_ID_VP8: 143 case CODEC_ID_VP8:
37 return kCodecVP8; 144 return kCodecVP8;
38 default: 145 default:
39 NOTREACHED(); 146 NOTREACHED();
40 } 147 }
41 return kUnknown; 148 return kUnknownVideoCodec;
42 } 149 }
43 150
44 CodecID VideoCodecToCodecID(VideoCodec video_codec) { 151 CodecID VideoCodecToCodecID(VideoCodec video_codec) {
45 switch (video_codec) { 152 switch (video_codec) {
46 case kUnknown: 153 case kUnknownVideoCodec:
47 return CODEC_ID_NONE; 154 return CODEC_ID_NONE;
48 case kCodecVC1: 155 case kCodecVC1:
49 return CODEC_ID_VC1; 156 return CODEC_ID_VC1;
50 case kCodecH264: 157 case kCodecH264:
51 return CODEC_ID_H264; 158 return CODEC_ID_H264;
52 case kCodecTheora: 159 case kCodecTheora:
53 return CODEC_ID_THEORA; 160 return CODEC_ID_THEORA;
54 case kCodecMPEG2: 161 case kCodecMPEG2:
55 return CODEC_ID_MPEG2VIDEO; 162 return CODEC_ID_MPEG2VIDEO;
56 case kCodecMPEG4: 163 case kCodecMPEG4:
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 avcodec_close(stream->codec); 335 avcodec_close(stream->codec);
229 } 336 }
230 } 337 }
231 } 338 }
232 339
233 // Then finally cleanup the format context. 340 // Then finally cleanup the format context.
234 av_close_input_file(format_context); 341 av_close_input_file(format_context);
235 } 342 }
236 343
237 } // namespace media 344 } // namespace media
OLDNEW
« no previous file with comments | « media/ffmpeg/ffmpeg_common.h ('k') | media/filters/adaptive_demuxer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698