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

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 AFR. 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_util.h" 10 #include "media/base/video_util.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 switch (codec_id) { 47 switch (codec_id) {
48 case CODEC_ID_AAC: 48 case CODEC_ID_AAC:
49 return kCodecAAC; 49 return kCodecAAC;
50 case CODEC_ID_MP3: 50 case CODEC_ID_MP3:
51 return kCodecMP3; 51 return kCodecMP3;
52 case CODEC_ID_VORBIS: 52 case CODEC_ID_VORBIS:
53 return kCodecVorbis; 53 return kCodecVorbis;
54 case CODEC_ID_PCM_U8: 54 case CODEC_ID_PCM_U8:
55 case CODEC_ID_PCM_S16LE: 55 case CODEC_ID_PCM_S16LE:
56 case CODEC_ID_PCM_S24LE: 56 case CODEC_ID_PCM_S24LE:
57 case CODEC_ID_PCM_F32LE:
57 return kCodecPCM; 58 return kCodecPCM;
58 case CODEC_ID_PCM_S16BE: 59 case CODEC_ID_PCM_S16BE:
59 return kCodecPCM_S16BE; 60 return kCodecPCM_S16BE;
60 case CODEC_ID_PCM_S24BE: 61 case CODEC_ID_PCM_S24BE:
61 return kCodecPCM_S24BE; 62 return kCodecPCM_S24BE;
62 case CODEC_ID_FLAC: 63 case CODEC_ID_FLAC:
63 return kCodecFLAC; 64 return kCodecFLAC;
64 case CODEC_ID_AMR_NB: 65 case CODEC_ID_AMR_NB:
65 return kCodecAMR_NB; 66 return kCodecAMR_NB;
66 case CODEC_ID_AMR_WB: 67 case CODEC_ID_AMR_WB:
67 return kCodecAMR_WB; 68 return kCodecAMR_WB;
68 case CODEC_ID_GSM_MS: 69 case CODEC_ID_GSM_MS:
69 return kCodecGSM_MS; 70 return kCodecGSM_MS;
70 case CODEC_ID_PCM_MULAW: 71 case CODEC_ID_PCM_MULAW:
71 return kCodecPCM_MULAW; 72 return kCodecPCM_MULAW;
72 default: 73 default:
73 DVLOG(1) << "Unknown audio CodecID: " << codec_id; 74 DVLOG(1) << "Unknown audio CodecID: " << codec_id;
74 } 75 }
75 return kUnknownAudioCodec; 76 return kUnknownAudioCodec;
76 } 77 }
77 78
78 static CodecID AudioCodecToCodecID(AudioCodec audio_codec, 79 static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
79 int bits_per_channel) { 80 SampleFormat sample_format) {
80 switch (audio_codec) { 81 switch (audio_codec) {
81 case kCodecAAC: 82 case kCodecAAC:
82 return CODEC_ID_AAC; 83 return CODEC_ID_AAC;
83 case kCodecMP3: 84 case kCodecMP3:
84 return CODEC_ID_MP3; 85 return CODEC_ID_MP3;
85 case kCodecPCM: 86 case kCodecPCM:
86 switch (bits_per_channel) { 87 switch (sample_format) {
87 case 8: 88 case kSampleFormatU8:
88 return CODEC_ID_PCM_U8; 89 return CODEC_ID_PCM_U8;
89 case 16: 90 case kSampleFormatS16:
90 return CODEC_ID_PCM_S16LE; 91 return CODEC_ID_PCM_S16LE;
91 case 32: 92 case kSampleFormatS32:
92 return CODEC_ID_PCM_S24LE; 93 return CODEC_ID_PCM_S24LE;
94 case kSampleFormatFLT:
95 return CODEC_ID_PCM_F32LE;
93 default: 96 default:
94 DVLOG(1) << "Unsupported bits per channel: " << bits_per_channel; 97 DVLOG(1) << "Unsupported sample format: " << sample_format;
95 } 98 }
96 break; 99 break;
97 case kCodecPCM_S16BE: 100 case kCodecPCM_S16BE:
98 return CODEC_ID_PCM_S16BE; 101 return CODEC_ID_PCM_S16BE;
99 case kCodecPCM_S24BE: 102 case kCodecPCM_S24BE:
100 return CODEC_ID_PCM_S24BE; 103 return CODEC_ID_PCM_S24BE;
101 case kCodecVorbis: 104 case kCodecVorbis:
102 return CODEC_ID_VORBIS; 105 return CODEC_ID_VORBIS;
103 case kCodecFLAC: 106 case kCodecFLAC:
104 return CODEC_ID_FLAC; 107 return CODEC_ID_FLAC;
105 case kCodecAMR_NB: 108 case kCodecAMR_NB:
106 return CODEC_ID_AMR_NB; 109 return CODEC_ID_AMR_NB;
107 case kCodecAMR_WB: 110 case kCodecAMR_WB:
108 return CODEC_ID_AMR_WB; 111 return CODEC_ID_AMR_WB;
109 case kCodecGSM_MS: 112 case kCodecGSM_MS:
110 return CODEC_ID_GSM_MS; 113 return CODEC_ID_GSM_MS;
111 case kCodecPCM_MULAW: 114 case kCodecPCM_MULAW:
112 return CODEC_ID_PCM_MULAW; 115 return CODEC_ID_PCM_MULAW;
113 default: 116 default:
114 DVLOG(1) << "Unknown AudioCodec: " << audio_codec; 117 DVLOG(1) << "Unknown AudioCodec: " << audio_codec;
115 } 118 }
116 return CODEC_ID_NONE; 119 return CODEC_ID_NONE;
117 } 120 }
118 121
119 VideoCodec CodecIDToVideoCodec(CodecID codec_id) { 122 VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
120 switch (codec_id) { 123 switch (codec_id) {
121 case CODEC_ID_VC1:
122 return kCodecVC1;
123 case CODEC_ID_H264: 124 case CODEC_ID_H264:
124 return kCodecH264; 125 return kCodecH264;
125 case CODEC_ID_THEORA: 126 case CODEC_ID_THEORA:
126 return kCodecTheora; 127 return kCodecTheora;
127 case CODEC_ID_MPEG2VIDEO:
128 return kCodecMPEG2;
129 case CODEC_ID_MPEG4: 128 case CODEC_ID_MPEG4:
130 return kCodecMPEG4; 129 return kCodecMPEG4;
131 case CODEC_ID_VP8: 130 case CODEC_ID_VP8:
132 return kCodecVP8; 131 return kCodecVP8;
133 default: 132 default:
134 DVLOG(1) << "Unknown video CodecID: " << codec_id; 133 DVLOG(1) << "Unknown video CodecID: " << codec_id;
135 } 134 }
136 return kUnknownVideoCodec; 135 return kUnknownVideoCodec;
137 } 136 }
138 137
139 static CodecID VideoCodecToCodecID(VideoCodec video_codec) { 138 static CodecID VideoCodecToCodecID(VideoCodec video_codec) {
140 switch (video_codec) { 139 switch (video_codec) {
141 case kCodecVC1:
142 return CODEC_ID_VC1;
143 case kCodecH264: 140 case kCodecH264:
144 return CODEC_ID_H264; 141 return CODEC_ID_H264;
145 case kCodecTheora: 142 case kCodecTheora:
146 return CODEC_ID_THEORA; 143 return CODEC_ID_THEORA;
147 case kCodecMPEG2:
148 return CODEC_ID_MPEG2VIDEO;
149 case kCodecMPEG4: 144 case kCodecMPEG4:
150 return CODEC_ID_MPEG4; 145 return CODEC_ID_MPEG4;
151 case kCodecVP8: 146 case kCodecVP8:
152 return CODEC_ID_VP8; 147 return CODEC_ID_VP8;
153 default: 148 default:
154 DVLOG(1) << "Unknown VideoCodec: " << video_codec; 149 DVLOG(1) << "Unknown VideoCodec: " << video_codec;
155 } 150 }
156 return CODEC_ID_NONE; 151 return CODEC_ID_NONE;
157 } 152 }
158 153
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 case H264PROFILE_HIGH422PROFILE: 192 case H264PROFILE_HIGH422PROFILE:
198 return FF_PROFILE_H264_HIGH_422; 193 return FF_PROFILE_H264_HIGH_422;
199 case H264PROFILE_HIGH444PREDICTIVEPROFILE: 194 case H264PROFILE_HIGH444PREDICTIVEPROFILE:
200 return FF_PROFILE_H264_HIGH_444_PREDICTIVE; 195 return FF_PROFILE_H264_HIGH_444_PREDICTIVE;
201 default: 196 default:
202 DVLOG(1) << "Unknown VideoCodecProfile: " << profile; 197 DVLOG(1) << "Unknown VideoCodecProfile: " << profile;
203 } 198 }
204 return FF_PROFILE_UNKNOWN; 199 return FF_PROFILE_UNKNOWN;
205 } 200 }
206 201
202 static SampleFormat AVSampleFormatToSampleFormat(AVSampleFormat sample_format) {
203 switch (sample_format) {
204 case AV_SAMPLE_FMT_U8:
205 return kSampleFormatU8;
206 case AV_SAMPLE_FMT_S16:
207 return kSampleFormatS16;
208 case AV_SAMPLE_FMT_S32:
209 return kSampleFormatS32;
210 case AV_SAMPLE_FMT_FLT:
211 return kSampleFormatFLT;
212 case AV_SAMPLE_FMT_FLTP:
213 return kSampleFormatFLTP;
214 default:
215 DVLOG(1) << "Unknown AVSampleFormat: " << sample_format;
216 }
217 return kUnknownSampleFormat;
218 }
219
220 static AVSampleFormat SampleFormatToAVSampleFormat(SampleFormat sample_format) {
221 switch (sample_format) {
222 case kSampleFormatU8:
223 return AV_SAMPLE_FMT_U8;
224 case kSampleFormatS16:
225 return AV_SAMPLE_FMT_S16;
226 case kSampleFormatS32:
227 return AV_SAMPLE_FMT_S32;
228 case kSampleFormatFLT:
229 return AV_SAMPLE_FMT_FLT;
230 case kSampleFormatFLTP:
231 return AV_SAMPLE_FMT_FLTP;
232 default:
233 DVLOG(1) << "Unknown SampleFormat: " << sample_format;
234 }
235 return AV_SAMPLE_FMT_NONE;
236 }
237
207 void AVCodecContextToAudioDecoderConfig( 238 void AVCodecContextToAudioDecoderConfig(
208 const AVCodecContext* codec_context, 239 const AVCodecContext* codec_context,
209 AudioDecoderConfig* config) { 240 AudioDecoderConfig* config) {
210 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); 241 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO);
211 242
212 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); 243 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
213 int bytes_per_channel = av_get_bytes_per_sample(codec_context->sample_fmt); 244 codec_context->channel_layout, codec_context->channels);
214 ChannelLayout channel_layout = 245 config->Initialize(CodecIDToAudioCodec(codec_context->codec_id),
215 ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, 246 av_get_bytes_per_sample(codec_context->sample_fmt) * 8,
216 codec_context->channels);
217 int samples_per_second = codec_context->sample_rate;
218
219 config->Initialize(codec,
220 bytes_per_channel << 3,
221 channel_layout, 247 channel_layout,
222 samples_per_second, 248 codec_context->sample_rate,
223 codec_context->extradata, 249 codec_context->extradata,
224 codec_context->extradata_size, 250 codec_context->extradata_size,
251 AVSampleFormatToSampleFormat(codec_context->sample_fmt),
225 false, // Not encrypted. 252 false, // Not encrypted.
226 true); 253 true);
227 } 254 }
228 255
229 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, 256 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
230 AVCodecContext* codec_context) { 257 AVCodecContext* codec_context) {
231 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; 258 codec_context->codec_type = AVMEDIA_TYPE_AUDIO;
232 codec_context->codec_id = AudioCodecToCodecID(config.codec(), 259 codec_context->codec_id = AudioCodecToCodecID(config.codec(),
233 config.bits_per_channel()); 260 config.sample_format());
234 261 codec_context->sample_fmt = SampleFormatToAVSampleFormat(
235 switch (config.bits_per_channel()) { 262 config.sample_format());
236 case 8:
237 codec_context->sample_fmt = AV_SAMPLE_FMT_U8;
238 break;
239 case 16:
240 codec_context->sample_fmt = AV_SAMPLE_FMT_S16;
241 break;
242 case 32:
243 codec_context->sample_fmt = AV_SAMPLE_FMT_S32;
244 break;
245 default:
246 DVLOG(1) << "Unsupported bits per channel: " << config.bits_per_channel();
247 codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
248 }
249 263
250 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses 264 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
251 // said information to decode. 265 // said information to decode.
252 codec_context->channels = 266 codec_context->channels =
253 ChannelLayoutToChannelCount(config.channel_layout()); 267 ChannelLayoutToChannelCount(config.channel_layout());
254 codec_context->sample_rate = config.samples_per_second(); 268 codec_context->sample_rate = config.samples_per_second();
255 269
256 if (config.extra_data()) { 270 if (config.extra_data()) {
257 codec_context->extradata_size = config.extra_data_size(); 271 codec_context->extradata_size = config.extra_data_size();
258 codec_context->extradata = reinterpret_cast<uint8_t*>( 272 codec_context->extradata = reinterpret_cast<uint8_t*>(
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 return PIX_FMT_YUV422P; 421 return PIX_FMT_YUV422P;
408 case VideoFrame::YV12: 422 case VideoFrame::YV12:
409 return PIX_FMT_YUV420P; 423 return PIX_FMT_YUV420P;
410 default: 424 default:
411 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; 425 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format;
412 } 426 }
413 return PIX_FMT_NONE; 427 return PIX_FMT_NONE;
414 } 428 }
415 429
416 } // namespace media 430 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698