| 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_frame.h" | 10 #include "media/base/video_frame.h" |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 case 7: | 288 case 7: |
| 289 return CHANNEL_LAYOUT_6_1; | 289 return CHANNEL_LAYOUT_6_1; |
| 290 case 8: | 290 case 8: |
| 291 return CHANNEL_LAYOUT_7_1; | 291 return CHANNEL_LAYOUT_7_1; |
| 292 default: | 292 default: |
| 293 DVLOG(1) << "Unsupported channel count: " << channels; | 293 DVLOG(1) << "Unsupported channel count: " << channels; |
| 294 } | 294 } |
| 295 return CHANNEL_LAYOUT_UNSUPPORTED; | 295 return CHANNEL_LAYOUT_UNSUPPORTED; |
| 296 } | 296 } |
| 297 | 297 |
| 298 void AVCodecContextToAudioDecoderConfig( | 298 static void AVCodecContextToAudioDecoderConfig( |
| 299 const AVCodecContext* codec_context, | 299 const AVCodecContext* codec_context, |
| 300 bool is_encrypted, |
| 300 AudioDecoderConfig* config) { | 301 AudioDecoderConfig* config) { |
| 301 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); | 302 DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO); |
| 302 | 303 |
| 303 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); | 304 AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); |
| 304 | 305 |
| 305 SampleFormat sample_format = | 306 SampleFormat sample_format = |
| 306 AVSampleFormatToSampleFormat(codec_context->sample_fmt); | 307 AVSampleFormatToSampleFormat(codec_context->sample_fmt); |
| 307 | 308 |
| 308 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( | 309 ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( |
| 309 codec_context->channel_layout, codec_context->channels); | 310 codec_context->channel_layout, codec_context->channels); |
| 310 | 311 |
| 311 if (codec == kCodecOpus) { | 312 if (codec == kCodecOpus) { |
| 312 // |codec_context->sample_fmt| is not set by FFmpeg because Opus decoding is | 313 // |codec_context->sample_fmt| is not set by FFmpeg because Opus decoding is |
| 313 // not enabled in FFmpeg, so we need to manually set the sample format. | 314 // not enabled in FFmpeg, so we need to manually set the sample format. |
| 314 sample_format = kSampleFormatS16; | 315 sample_format = kSampleFormatS16; |
| 315 } | 316 } |
| 316 | 317 |
| 317 config->Initialize(codec, | 318 config->Initialize(codec, |
| 318 sample_format, | 319 sample_format, |
| 319 channel_layout, | 320 channel_layout, |
| 320 codec_context->sample_rate, | 321 codec_context->sample_rate, |
| 321 codec_context->extradata, | 322 codec_context->extradata, |
| 322 codec_context->extradata_size, | 323 codec_context->extradata_size, |
| 323 false, // Not encrypted. | 324 is_encrypted, |
| 324 true); | 325 true); |
| 325 if (codec != kCodecOpus) { | 326 if (codec != kCodecOpus) { |
| 326 DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8, | 327 DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8, |
| 327 config->bits_per_channel()); | 328 config->bits_per_channel()); |
| 328 } | 329 } |
| 329 } | 330 } |
| 330 | 331 |
| 332 void AVStreamToAudioDecoderConfig( |
| 333 const AVStream* stream, |
| 334 AudioDecoderConfig* config) { |
| 335 bool is_encrypted = false; |
| 336 AVDictionaryEntry* key = av_dict_get(stream->metadata, "enc_key_id", NULL, 0); |
| 337 if (key) |
| 338 is_encrypted = true; |
| 339 return AVCodecContextToAudioDecoderConfig(stream->codec, |
| 340 is_encrypted, config); |
| 341 } |
| 342 |
| 331 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, | 343 void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, |
| 332 AVCodecContext* codec_context) { | 344 AVCodecContext* codec_context) { |
| 333 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; | 345 codec_context->codec_type = AVMEDIA_TYPE_AUDIO; |
| 334 codec_context->codec_id = AudioCodecToCodecID(config.codec(), | 346 codec_context->codec_id = AudioCodecToCodecID(config.codec(), |
| 335 config.sample_format()); | 347 config.sample_format()); |
| 336 codec_context->sample_fmt = SampleFormatToAVSampleFormat( | 348 codec_context->sample_fmt = SampleFormatToAVSampleFormat( |
| 337 config.sample_format()); | 349 config.sample_format()); |
| 338 | 350 |
| 339 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses | 351 // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses |
| 340 // said information to decode. | 352 // said information to decode. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 gfx::Size natural_size = GetNaturalSize( | 396 gfx::Size natural_size = GetNaturalSize( |
| 385 visible_rect.size(), aspect_ratio.num, aspect_ratio.den); | 397 visible_rect.size(), aspect_ratio.num, aspect_ratio.den); |
| 386 | 398 |
| 387 VideoFrame::Format format = PixelFormatToVideoFormat(stream->codec->pix_fmt); | 399 VideoFrame::Format format = PixelFormatToVideoFormat(stream->codec->pix_fmt); |
| 388 if (codec == kCodecVP9) { | 400 if (codec == kCodecVP9) { |
| 389 // TODO(tomfinegan): libavcodec doesn't know about VP9. | 401 // TODO(tomfinegan): libavcodec doesn't know about VP9. |
| 390 format = VideoFrame::YV12; | 402 format = VideoFrame::YV12; |
| 391 coded_size = natural_size; | 403 coded_size = natural_size; |
| 392 } | 404 } |
| 393 | 405 |
| 406 bool is_encrypted = false; |
| 407 AVDictionaryEntry* key = av_dict_get(stream->metadata, "enc_key_id", NULL, 0); |
| 408 if (key) |
| 409 is_encrypted = true; |
| 410 |
| 394 config->Initialize(codec, | 411 config->Initialize(codec, |
| 395 profile, | 412 profile, |
| 396 format, | 413 format, |
| 397 coded_size, visible_rect, natural_size, | 414 coded_size, visible_rect, natural_size, |
| 398 stream->codec->extradata, stream->codec->extradata_size, | 415 stream->codec->extradata, stream->codec->extradata_size, |
| 399 false, // Not encrypted. | 416 is_encrypted, |
| 400 true); | 417 true); |
| 401 } | 418 } |
| 402 | 419 |
| 403 void VideoDecoderConfigToAVCodecContext( | 420 void VideoDecoderConfigToAVCodecContext( |
| 404 const VideoDecoderConfig& config, | 421 const VideoDecoderConfig& config, |
| 405 AVCodecContext* codec_context) { | 422 AVCodecContext* codec_context) { |
| 406 codec_context->codec_type = AVMEDIA_TYPE_VIDEO; | 423 codec_context->codec_type = AVMEDIA_TYPE_VIDEO; |
| 407 codec_context->codec_id = VideoCodecToCodecID(config.codec()); | 424 codec_context->codec_id = VideoCodecToCodecID(config.codec()); |
| 408 codec_context->profile = VideoCodecProfileToProfileID(config.profile()); | 425 codec_context->profile = VideoCodecProfileToProfileID(config.profile()); |
| 409 codec_context->coded_width = config.coded_size().width(); | 426 codec_context->coded_width = config.coded_size().width(); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 return PIX_FMT_YUV422P; | 528 return PIX_FMT_YUV422P; |
| 512 case VideoFrame::YV12: | 529 case VideoFrame::YV12: |
| 513 return PIX_FMT_YUV420P; | 530 return PIX_FMT_YUV420P; |
| 514 default: | 531 default: |
| 515 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; | 532 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; |
| 516 } | 533 } |
| 517 return PIX_FMT_NONE; | 534 return PIX_FMT_NONE; |
| 518 } | 535 } |
| 519 | 536 |
| 520 } // namespace media | 537 } // namespace media |
| OLD | NEW |