summaryrefslogtreecommitdiffstats
path: root/media/ffmpeg
diff options
context:
space:
mode:
authortomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-22 02:00:26 +0000
committertomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-22 02:00:26 +0000
commite17c547493001b9195e1209b9444d2aee676c826 (patch)
tree63cb2af3787464e60b62f00a83e2ec9dabd0ed0b /media/ffmpeg
parent668719e2ddde41c16cecb3774decfc0b5799e753 (diff)
downloadchromium_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.cc34
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.