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

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

Issue 11280301: Roll FFMpeg for M26. Fix ffmpeg float audio decoding. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix DCHECK. Roll DEPS for fix. Created 8 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 | Annotate | Revision Log
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 "media/base/decoder_buffer.h" 9 #include "media/base/decoder_buffer.h"
10 #include "media/base/video_frame.h" 10 #include "media/base/video_frame.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 switch (codec_id) { 61 switch (codec_id) {
62 case CODEC_ID_AAC: 62 case CODEC_ID_AAC:
63 return kCodecAAC; 63 return kCodecAAC;
64 case CODEC_ID_MP3: 64 case CODEC_ID_MP3:
65 return kCodecMP3; 65 return kCodecMP3;
66 case CODEC_ID_VORBIS: 66 case CODEC_ID_VORBIS:
67 return kCodecVorbis; 67 return kCodecVorbis;
68 case CODEC_ID_PCM_U8: 68 case CODEC_ID_PCM_U8:
69 case CODEC_ID_PCM_S16LE: 69 case CODEC_ID_PCM_S16LE:
70 case CODEC_ID_PCM_S24LE: 70 case CODEC_ID_PCM_S24LE:
71 case CODEC_ID_PCM_F32LE:
71 return kCodecPCM; 72 return kCodecPCM;
72 case CODEC_ID_PCM_S16BE: 73 case CODEC_ID_PCM_S16BE:
73 return kCodecPCM_S16BE; 74 return kCodecPCM_S16BE;
74 case CODEC_ID_PCM_S24BE: 75 case CODEC_ID_PCM_S24BE:
75 return kCodecPCM_S24BE; 76 return kCodecPCM_S24BE;
76 case CODEC_ID_FLAC: 77 case CODEC_ID_FLAC:
77 return kCodecFLAC; 78 return kCodecFLAC;
78 case CODEC_ID_AMR_NB: 79 case CODEC_ID_AMR_NB:
79 return kCodecAMR_NB; 80 return kCodecAMR_NB;
80 case CODEC_ID_AMR_WB: 81 case CODEC_ID_AMR_WB:
81 return kCodecAMR_WB; 82 return kCodecAMR_WB;
82 case CODEC_ID_GSM_MS: 83 case CODEC_ID_GSM_MS:
83 return kCodecGSM_MS; 84 return kCodecGSM_MS;
84 case CODEC_ID_PCM_MULAW: 85 case CODEC_ID_PCM_MULAW:
85 return kCodecPCM_MULAW; 86 return kCodecPCM_MULAW;
86 default: 87 default:
87 DVLOG(1) << "Unknown audio CodecID: " << codec_id; 88 DVLOG(1) << "Unknown audio CodecID: " << codec_id;
88 } 89 }
89 return kUnknownAudioCodec; 90 return kUnknownAudioCodec;
90 } 91 }
91 92
92 static CodecID AudioCodecToCodecID(AudioCodec audio_codec, 93 static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
93 int bits_per_channel) { 94 SampleFormat sample_format) {
94 switch (audio_codec) { 95 switch (audio_codec) {
95 case kCodecAAC: 96 case kCodecAAC:
96 return CODEC_ID_AAC; 97 return CODEC_ID_AAC;
97 case kCodecMP3: 98 case kCodecMP3:
98 return CODEC_ID_MP3; 99 return CODEC_ID_MP3;
99 case kCodecPCM: 100 case kCodecPCM:
100 switch (bits_per_channel) { 101 switch (sample_format) {
101 case 8: 102 case kSampleFormatU8:
102 return CODEC_ID_PCM_U8; 103 return CODEC_ID_PCM_U8;
103 case 16: 104 case kSampleFormatS16:
104 return CODEC_ID_PCM_S16LE; 105 return CODEC_ID_PCM_S16LE;
105 case 32: 106 case kSampleFormatS32:
106 return CODEC_ID_PCM_S24LE; 107 return CODEC_ID_PCM_S24LE;
108 case kSampleFormatF32:
109 return CODEC_ID_PCM_F32LE;
107 default: 110 default:
108 DVLOG(1) << "Unsupported bits per channel: " << bits_per_channel; 111 DVLOG(1) << "Unsupported sample format: " << sample_format;
109 } 112 }
110 break; 113 break;
111 case kCodecPCM_S16BE: 114 case kCodecPCM_S16BE:
112 return CODEC_ID_PCM_S16BE; 115 return CODEC_ID_PCM_S16BE;
113 case kCodecPCM_S24BE: 116 case kCodecPCM_S24BE:
114 return CODEC_ID_PCM_S24BE; 117 return CODEC_ID_PCM_S24BE;
115 case kCodecVorbis: 118 case kCodecVorbis:
116 return CODEC_ID_VORBIS; 119 return CODEC_ID_VORBIS;
117 case kCodecFLAC: 120 case kCodecFLAC:
118 return CODEC_ID_FLAC; 121 return CODEC_ID_FLAC;
119 case kCodecAMR_NB: 122 case kCodecAMR_NB:
120 return CODEC_ID_AMR_NB; 123 return CODEC_ID_AMR_NB;
121 case kCodecAMR_WB: 124 case kCodecAMR_WB:
122 return CODEC_ID_AMR_WB; 125 return CODEC_ID_AMR_WB;
123 case kCodecGSM_MS: 126 case kCodecGSM_MS:
124 return CODEC_ID_GSM_MS; 127 return CODEC_ID_GSM_MS;
125 case kCodecPCM_MULAW: 128 case kCodecPCM_MULAW:
126 return CODEC_ID_PCM_MULAW; 129 return CODEC_ID_PCM_MULAW;
127 default: 130 default:
128 DVLOG(1) << "Unknown AudioCodec: " << audio_codec; 131 DVLOG(1) << "Unknown AudioCodec: " << audio_codec;
129 } 132 }
130 return CODEC_ID_NONE; 133 return CODEC_ID_NONE;
131 } 134 }
132 135
133 VideoCodec CodecIDToVideoCodec(CodecID codec_id) { 136 VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
134 switch (codec_id) { 137 switch (codec_id) {
135 case CODEC_ID_VC1:
136 return kCodecVC1;
137 case CODEC_ID_H264: 138 case CODEC_ID_H264:
138 return kCodecH264; 139 return kCodecH264;
139 case CODEC_ID_THEORA: 140 case CODEC_ID_THEORA:
140 return kCodecTheora; 141 return kCodecTheora;
141 case CODEC_ID_MPEG2VIDEO:
142 return kCodecMPEG2;
143 case CODEC_ID_MPEG4: 142 case CODEC_ID_MPEG4:
144 return kCodecMPEG4; 143 return kCodecMPEG4;
145 case CODEC_ID_VP8: 144 case CODEC_ID_VP8:
146 return kCodecVP8; 145 return kCodecVP8;
147 default: 146 default:
148 DVLOG(1) << "Unknown video CodecID: " << codec_id; 147 DVLOG(1) << "Unknown video CodecID: " << codec_id;
149 } 148 }
150 return kUnknownVideoCodec; 149 return kUnknownVideoCodec;
151 } 150 }
152 151
153 static CodecID VideoCodecToCodecID(VideoCodec video_codec) { 152 static CodecID VideoCodecToCodecID(VideoCodec video_codec) {
154 switch (video_codec) { 153 switch (video_codec) {
155 case kCodecVC1:
156 return CODEC_ID_VC1;
157 case kCodecH264: 154 case kCodecH264:
158 return CODEC_ID_H264; 155 return CODEC_ID_H264;
159 case kCodecTheora: 156 case kCodecTheora:
160 return CODEC_ID_THEORA; 157 return CODEC_ID_THEORA;
161 case kCodecMPEG2:
162 return CODEC_ID_MPEG2VIDEO;
163 case kCodecMPEG4: 158 case kCodecMPEG4:
164 return CODEC_ID_MPEG4; 159 return CODEC_ID_MPEG4;
165 case kCodecVP8: 160 case kCodecVP8:
166 return CODEC_ID_VP8; 161 return CODEC_ID_VP8;
167 default: 162 default:
168 DVLOG(1) << "Unknown VideoCodec: " << video_codec; 163 DVLOG(1) << "Unknown VideoCodec: " << video_codec;
169 } 164 }
170 return CODEC_ID_NONE; 165 return CODEC_ID_NONE;
171 } 166 }
172 167
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 case H264PROFILE_HIGH422PROFILE: 206 case H264PROFILE_HIGH422PROFILE:
212 return FF_PROFILE_H264_HIGH_422; 207 return FF_PROFILE_H264_HIGH_422;
213 case H264PROFILE_HIGH444PREDICTIVEPROFILE: 208 case H264PROFILE_HIGH444PREDICTIVEPROFILE:
214 return FF_PROFILE_H264_HIGH_444_PREDICTIVE; 209 return FF_PROFILE_H264_HIGH_444_PREDICTIVE;
215 default: 210 default:
216 DVLOG(1) << "Unknown VideoCodecProfile: " << profile; 211 DVLOG(1) << "Unknown VideoCodecProfile: " << profile;
217 } 212 }
218 return FF_PROFILE_UNKNOWN; 213 return FF_PROFILE_UNKNOWN;
219 } 214 }
220 215
216 static SampleFormat AVSampleFormatToSampleFormat(AVSampleFormat sample_format) {
217 switch (sample_format) {
218 case AV_SAMPLE_FMT_U8:
219 return kSampleFormatU8;
220 case AV_SAMPLE_FMT_S16:
221 return kSampleFormatS16;
222 case AV_SAMPLE_FMT_S32:
223 return kSampleFormatS32;
224 case AV_SAMPLE_FMT_FLT:
225 return kSampleFormatF32;
226 case AV_SAMPLE_FMT_FLTP:
227 return kSampleFormatPlanarF32;
228 default:
229 DVLOG(1) << "Unknown AVSampleFormat: " << sample_format;
230 }
231 return kUnknownSampleFormat;
232 }
233
234 static AVSampleFormat SampleFormatToAVSampleFormat(SampleFormat sample_format) {
235 switch (sample_format) {
236 case kSampleFormatU8:
237 return AV_SAMPLE_FMT_U8;
238 case kSampleFormatS16:
239 return AV_SAMPLE_FMT_S16;
240 case kSampleFormatS32:
241 return AV_SAMPLE_FMT_S32;
242 case kSampleFormatF32:
243 return AV_SAMPLE_FMT_FLT;
244 case kSampleFormatPlanarF32:
245 return AV_SAMPLE_FMT_FLTP;
246 default:
247 DVLOG(1) << "Unknown SampleFormat: " << sample_format;
248 }
249 return AV_SAMPLE_FMT_NONE;
250 }
251
221 void AVCodecContextToAudioDecoderConfig( 252 void AVCodecContextToAudioDecoderConfig(
222 const AVCodecContext* codec_context, 253 const AVCodecContext* codec_context,
223 AudioDecoderConfig* config) { 254 AudioDecoderConfig* config) {
224 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); 255 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO);
225 256
226 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); 257 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
227 int bytes_per_channel = av_get_bytes_per_sample(codec_context->sample_fmt); 258 codec_context->channel_layout, codec_context->channels);
228 ChannelLayout channel_layout = 259 config->Initialize(CodecIDToAudioCodec(codec_context->codec_id),
229 ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, 260 AVSampleFormatToSampleFormat(codec_context->sample_fmt),
230 codec_context->channels);
231 int samples_per_second = codec_context->sample_rate;
232
233 config->Initialize(codec,
234 bytes_per_channel << 3,
235 channel_layout, 261 channel_layout,
236 samples_per_second, 262 codec_context->sample_rate,
237 codec_context->extradata, 263 codec_context->extradata,
238 codec_context->extradata_size, 264 codec_context->extradata_size,
239 false, // Not encrypted. 265 false, // Not encrypted.
240 true); 266 true);
267 DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8,
268 config->bits_per_channel());
241 } 269 }
242 270
243 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, 271 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
244 AVCodecContext* codec_context) { 272 AVCodecContext* codec_context) {
245 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; 273 codec_context->codec_type = AVMEDIA_TYPE_AUDIO;
246 codec_context->codec_id = AudioCodecToCodecID(config.codec(), 274 codec_context->codec_id = AudioCodecToCodecID(config.codec(),
247 config.bits_per_channel()); 275 config.sample_format());
248 276 codec_context->sample_fmt = SampleFormatToAVSampleFormat(
249 switch (config.bits_per_channel()) { 277 config.sample_format());
250 case 8:
251 codec_context->sample_fmt = AV_SAMPLE_FMT_U8;
252 break;
253 case 16:
254 codec_context->sample_fmt = AV_SAMPLE_FMT_S16;
255 break;
256 case 32:
257 codec_context->sample_fmt = AV_SAMPLE_FMT_S32;
258 break;
259 default:
260 DVLOG(1) << "Unsupported bits per channel: " << config.bits_per_channel();
261 codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
262 }
263 278
264 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses 279 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
265 // said information to decode. 280 // said information to decode.
266 codec_context->channels = 281 codec_context->channels =
267 ChannelLayoutToChannelCount(config.channel_layout()); 282 ChannelLayoutToChannelCount(config.channel_layout());
268 codec_context->sample_rate = config.samples_per_second(); 283 codec_context->sample_rate = config.samples_per_second();
269 284
270 if (config.extra_data()) { 285 if (config.extra_data()) {
271 codec_context->extradata_size = config.extra_data_size(); 286 codec_context->extradata_size = config.extra_data_size();
272 codec_context->extradata = reinterpret_cast<uint8_t*>( 287 codec_context->extradata = reinterpret_cast<uint8_t*>(
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 return PIX_FMT_YUV422P; 436 return PIX_FMT_YUV422P;
422 case VideoFrame::YV12: 437 case VideoFrame::YV12:
423 return PIX_FMT_YUV420P; 438 return PIX_FMT_YUV420P;
424 default: 439 default:
425 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; 440 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format;
426 } 441 }
427 return PIX_FMT_NONE; 442 return PIX_FMT_NONE;
428 } 443 }
429 444
430 } // namespace media 445 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698