Chromium Code Reviews| 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/logging.h" | 7 #include "base/logging.h" |
| 8 #include "media/base/audio_decoder_config.h" | 8 #include "media/base/audio_decoder_config.h" |
| 9 #include "media/base/video_decoder_config.h" | 9 #include "media/base/video_decoder_config.h" |
| 10 | 10 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 return FF_PROFILE_UNKNOWN; | 172 return FF_PROFILE_UNKNOWN; |
| 173 } | 173 } |
| 174 } | 174 } |
| 175 | 175 |
| 176 void AVCodecContextToAudioDecoderConfig( | 176 void AVCodecContextToAudioDecoderConfig( |
| 177 const AVCodecContext* codec_context, | 177 const AVCodecContext* codec_context, |
| 178 AudioDecoderConfig* config) { | 178 AudioDecoderConfig* config) { |
| 179 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); | 179 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); |
| 180 | 180 |
| 181 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); | 181 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); |
| 182 int bits_per_channel = av_get_bits_per_sample_fmt(codec_context->sample_fmt); | 182 int bytes_per_channel = av_get_bytes_per_sample(codec_context->sample_fmt); |
| 183 ChannelLayout channel_layout = | 183 ChannelLayout channel_layout = |
| 184 ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, | 184 ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, |
| 185 codec_context->channels); | 185 codec_context->channels); |
| 186 int samples_per_second = codec_context->sample_rate; | 186 int samples_per_second = codec_context->sample_rate; |
| 187 | 187 |
| 188 config->Initialize(codec, | 188 config->Initialize(codec, |
| 189 bits_per_channel, | 189 bytes_per_channel << 3, |
|
scherkus (not reviewing)
2012/02/06 21:13:49
we should also make a similar API change :)
mind
DaleCurtis
2012/02/07 19:09:13
Done.
| |
| 190 channel_layout, | 190 channel_layout, |
| 191 samples_per_second, | 191 samples_per_second, |
| 192 codec_context->extradata, | 192 codec_context->extradata, |
| 193 codec_context->extradata_size, | 193 codec_context->extradata_size, |
| 194 true); | 194 true); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, | 197 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, |
| 198 AVCodecContext* codec_context) { | 198 AVCodecContext* codec_context) { |
| 199 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; | 199 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 283 FF_INPUT_BUFFER_PADDING_SIZE); | 283 FF_INPUT_BUFFER_PADDING_SIZE); |
| 284 } else { | 284 } else { |
| 285 codec_context->extradata = NULL; | 285 codec_context->extradata = NULL; |
| 286 codec_context->extradata_size = 0; | 286 codec_context->extradata_size = 0; |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 | 289 |
| 290 ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout, | 290 ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout, |
| 291 int channels) { | 291 int channels) { |
| 292 switch (layout) { | 292 switch (layout) { |
| 293 case CH_LAYOUT_MONO: | 293 case AV_CH_LAYOUT_MONO: |
| 294 return CHANNEL_LAYOUT_MONO; | 294 return CHANNEL_LAYOUT_MONO; |
| 295 case CH_LAYOUT_STEREO: | 295 case AV_CH_LAYOUT_STEREO: |
| 296 return CHANNEL_LAYOUT_STEREO; | 296 return CHANNEL_LAYOUT_STEREO; |
| 297 case CH_LAYOUT_2_1: | 297 case AV_CH_LAYOUT_2_1: |
| 298 return CHANNEL_LAYOUT_2_1; | 298 return CHANNEL_LAYOUT_2_1; |
| 299 case CH_LAYOUT_SURROUND: | 299 case AV_CH_LAYOUT_SURROUND: |
| 300 return CHANNEL_LAYOUT_SURROUND; | 300 return CHANNEL_LAYOUT_SURROUND; |
| 301 case CH_LAYOUT_4POINT0: | 301 case AV_CH_LAYOUT_4POINT0: |
| 302 return CHANNEL_LAYOUT_4POINT0; | 302 return CHANNEL_LAYOUT_4POINT0; |
| 303 case CH_LAYOUT_2_2: | 303 case AV_CH_LAYOUT_2_2: |
| 304 return CHANNEL_LAYOUT_2_2; | 304 return CHANNEL_LAYOUT_2_2; |
| 305 case CH_LAYOUT_QUAD: | 305 case AV_CH_LAYOUT_QUAD: |
| 306 return CHANNEL_LAYOUT_QUAD; | 306 return CHANNEL_LAYOUT_QUAD; |
| 307 case CH_LAYOUT_5POINT0: | 307 case AV_CH_LAYOUT_5POINT0: |
| 308 return CHANNEL_LAYOUT_5POINT0; | 308 return CHANNEL_LAYOUT_5POINT0; |
| 309 case CH_LAYOUT_5POINT1: | 309 case AV_CH_LAYOUT_5POINT1: |
| 310 return CHANNEL_LAYOUT_5POINT1; | 310 return CHANNEL_LAYOUT_5POINT1; |
| 311 case CH_LAYOUT_5POINT0_BACK: | 311 case AV_CH_LAYOUT_5POINT0_BACK: |
| 312 return CHANNEL_LAYOUT_5POINT0_BACK; | 312 return CHANNEL_LAYOUT_5POINT0_BACK; |
| 313 case CH_LAYOUT_5POINT1_BACK: | 313 case AV_CH_LAYOUT_5POINT1_BACK: |
| 314 return CHANNEL_LAYOUT_5POINT1_BACK; | 314 return CHANNEL_LAYOUT_5POINT1_BACK; |
| 315 case CH_LAYOUT_7POINT0: | 315 case AV_CH_LAYOUT_7POINT0: |
| 316 return CHANNEL_LAYOUT_7POINT0; | 316 return CHANNEL_LAYOUT_7POINT0; |
| 317 case CH_LAYOUT_7POINT1: | 317 case AV_CH_LAYOUT_7POINT1: |
| 318 return CHANNEL_LAYOUT_7POINT1; | 318 return CHANNEL_LAYOUT_7POINT1; |
| 319 case CH_LAYOUT_7POINT1_WIDE: | 319 case AV_CH_LAYOUT_7POINT1_WIDE: |
| 320 return CHANNEL_LAYOUT_7POINT1_WIDE; | 320 return CHANNEL_LAYOUT_7POINT1_WIDE; |
| 321 case CH_LAYOUT_STEREO_DOWNMIX: | 321 case AV_CH_LAYOUT_STEREO_DOWNMIX: |
| 322 return CHANNEL_LAYOUT_STEREO_DOWNMIX; | 322 return CHANNEL_LAYOUT_STEREO_DOWNMIX; |
| 323 default: | 323 default: |
| 324 // FFmpeg channel_layout is 0 for .wav and .mp3. We know mono and stereo | 324 // FFmpeg channel_layout is 0 for .wav and .mp3. We know mono and stereo |
| 325 // from the number of channels, otherwise report errors. | 325 // from the number of channels, otherwise report errors. |
| 326 if (channels == 1) | 326 if (channels == 1) |
| 327 return CHANNEL_LAYOUT_MONO; | 327 return CHANNEL_LAYOUT_MONO; |
| 328 if (channels == 2) | 328 if (channels == 2) |
| 329 return CHANNEL_LAYOUT_STEREO; | 329 return CHANNEL_LAYOUT_STEREO; |
| 330 DLOG(WARNING) << "Unsupported/unencountered channel layout values"; | 330 DLOG(WARNING) << "Unsupported/unencountered channel layout values"; |
| 331 return CHANNEL_LAYOUT_UNSUPPORTED; | 331 return CHANNEL_LAYOUT_UNSUPPORTED; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 // Iterate each stream and destroy each one of them. | 370 // Iterate each stream and destroy each one of them. |
| 371 if (format_context->streams) { | 371 if (format_context->streams) { |
| 372 int streams = format_context->nb_streams; | 372 int streams = format_context->nb_streams; |
| 373 for (int i = 0; i < streams; ++i) { | 373 for (int i = 0; i < streams; ++i) { |
| 374 AVStream* stream = format_context->streams[i]; | 374 AVStream* stream = format_context->streams[i]; |
| 375 | 375 |
| 376 // The conditions for calling avcodec_close(): | 376 // The conditions for calling avcodec_close(): |
| 377 // 1. AVStream is alive. | 377 // 1. AVStream is alive. |
| 378 // 2. AVCodecContext in AVStream is alive. | 378 // 2. AVCodecContext in AVStream is alive. |
| 379 // 3. AVCodec in AVCodecContext is alive. | 379 // 3. AVCodec in AVCodecContext is alive. |
| 380 // Notice that closing a codec context without prior avcodec_open() will | 380 // Notice that closing a codec context without prior avcodec_open2() will |
| 381 // result in a crash in FFmpeg. | 381 // result in a crash in FFmpeg. |
| 382 if (stream && stream->codec && stream->codec->codec) { | 382 if (stream && stream->codec && stream->codec->codec) { |
| 383 stream->discard = AVDISCARD_ALL; | 383 stream->discard = AVDISCARD_ALL; |
| 384 avcodec_close(stream->codec); | 384 avcodec_close(stream->codec); |
| 385 } | 385 } |
| 386 } | 386 } |
| 387 } | 387 } |
| 388 | 388 |
| 389 // Then finally cleanup the format context. | 389 // Then finally cleanup the format context. |
| 390 av_close_input_file(format_context); | 390 avformat_close_input(&format_context); |
| 391 } | 391 } |
| 392 | 392 |
| 393 } // namespace media | 393 } // namespace media |
| OLD | NEW |