diff options
author | tomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-22 02:00:26 +0000 |
---|---|---|
committer | tomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-22 02:00:26 +0000 |
commit | e17c547493001b9195e1209b9444d2aee676c826 (patch) | |
tree | 63cb2af3787464e60b62f00a83e2ec9dabd0ed0b /media/ffmpeg | |
parent | 668719e2ddde41c16cecb3774decfc0b5799e753 (diff) | |
download | chromium_src-e17c547493001b9195e1209b9444d2aee676c826.zip chromium_src-e17c547493001b9195e1209b9444d2aee676c826.tar.gz chromium_src-e17c547493001b9195e1209b9444d2aee676c826.tar.bz2 |
Add wrapper class to media for support of VP9 video, and add a command line flag to enable the support.
This initial version of the wrapper provides support for decoding VP9 video in WebM container files, and is disabled by default.
New flag added: --enable-vp9-playback
TBR=brettw,scherkus,xhwang
BUG=166094
TEST=VP9 video in WebM containers plays back in <video> elements when --enable-vp9-playback is specified on the command line.
Review URL: https://codereview.chromium.org/11644078
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174488 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/ffmpeg')
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 1fd5cd9..3562ec3 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc @@ -10,6 +10,10 @@ #include "media/base/video_frame.h" #include "media/base/video_util.h" +// TODO(tomfinegan): Remove this once FFmpeg rolls for M25. The VP9 patch is in +// tree, but this is required until the roll happens. +#define AV_CODEC_ID_VP9 170 + namespace media { // Why FF_INPUT_BUFFER_PADDING_SIZE? FFmpeg assumes all input buffers are @@ -149,6 +153,11 @@ VideoCodec CodecIDToVideoCodec(CodecID codec_id) { case CODEC_ID_VP8: return kCodecVP8; default: + if (codec_id == AV_CODEC_ID_VP9) { + // TODO(tomfinegan): Remove this once FFmpeg rolls for M25, and + // AV_CODEC_ID_VP9 is part of CodecID. + return kCodecVP9; + } DVLOG(1) << "Unknown video CodecID: " << codec_id; } return kUnknownVideoCodec; @@ -168,6 +177,10 @@ static CodecID VideoCodecToCodecID(VideoCodec video_codec) { return CODEC_ID_MPEG4; case kCodecVP8: return CODEC_ID_VP8; + case kCodecVP9: + // TODO(tomfinegan): Remove this cast once FFmpeg rolls for M25, and the + // local define for AV_CODEC_ID_VP9 is removed. + return static_cast<CodecID>(AV_CODEC_ID_VP9); default: DVLOG(1) << "Unknown VideoCodec: " << video_codec; } @@ -311,13 +324,28 @@ void AVStreamToVideoDecoderConfig( aspect_ratio = stream->codec->sample_aspect_ratio; VideoCodec codec = CodecIDToVideoCodec(stream->codec->codec_id); - VideoCodecProfile profile = (codec == kCodecVP8) ? VP8PROFILE_MAIN : - ProfileIDToVideoCodecProfile(stream->codec->profile); + + VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; + if (codec == kCodecVP8) + profile = VP8PROFILE_MAIN; + else if (codec == kCodecVP9) + profile = VP9PROFILE_MAIN; + else + profile = ProfileIDToVideoCodecProfile(stream->codec->profile); + gfx::Size natural_size = GetNaturalSize( visible_rect.size(), aspect_ratio.num, aspect_ratio.den); + + VideoFrame::Format format = PixelFormatToVideoFormat(stream->codec->pix_fmt); + if (codec == kCodecVP9) { + // TODO(tomfinegan): libavcodec doesn't know about VP9. + format = VideoFrame::YV12; + coded_size = natural_size; + } + config->Initialize(codec, profile, - PixelFormatToVideoFormat(stream->codec->pix_fmt), + format, coded_size, visible_rect, natural_size, stream->codec->extradata, stream->codec->extradata_size, false, // Not encrypted. |