From bb691a6da4f7531ef94243c12deeefe978d98d56 Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Sat, 21 Mar 2009 23:44:21 +0000 Subject: Add support for HW accelerated VC-1 decoding through the new AVHWAccel infrastructure. Originally committed as revision 18135 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/vc1.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'libavcodec/vc1.c') diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 03257b8f37..229c885060 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -4010,9 +4010,10 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) if (!avctx->extradata_size || !avctx->extradata) return -1; if (!(avctx->flags & CODEC_FLAG_GRAY)) - avctx->pix_fmt = PIX_FMT_YUV420P; + avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts); else avctx->pix_fmt = PIX_FMT_GRAY8; + avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt); v->s.avctx = avctx; avctx->flags |= CODEC_FLAG_EMU_EDGE; v->s.flags |= CODEC_FLAG_EMU_EDGE; @@ -4187,7 +4188,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, if(size <= 0) continue; switch(AV_RB32(start)){ case VC1_CODE_FRAME: - if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) + if (avctx->hwaccel || + s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) buf_start = start; buf_size2 = vc1_unescape_buffer(start + 4, size, buf2); break; @@ -4280,7 +4282,14 @@ static int vc1_decode_frame(AVCodecContext *avctx, if ((CONFIG_VC1_VDPAU_DECODER || CONFIG_WMV3_VDPAU_DECODER) &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start); - else { + else if (avctx->hwaccel) { + if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0) + return -1; + if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0) + return -1; + if (avctx->hwaccel->end_frame(avctx) < 0) + return -1; + } else { ff_er_frame_start(s); v->bits = buf_size * 8; @@ -4348,7 +4357,7 @@ AVCodec vc1_decoder = { CODEC_CAP_DELAY, NULL, .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"), - .pix_fmts = ff_pixfmt_list_420 + .pix_fmts = ff_hwaccel_pixfmt_list_420 }; AVCodec wmv3_decoder = { @@ -4363,7 +4372,7 @@ AVCodec wmv3_decoder = { CODEC_CAP_DELAY, NULL, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"), - .pix_fmts = ff_pixfmt_list_420 + .pix_fmts = ff_hwaccel_pixfmt_list_420 }; #if CONFIG_WMV3_VDPAU_DECODER -- cgit v1.2.3