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/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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |