[FFmpeg-devel] [PATCH] vc1.c: add support for HWAccel (take 2)

Benoit Fouet benoit.fouet
Fri Feb 27 11:58:23 CET 2009


On 02/27/2009 11:37 AM, Gwenole Beauchesne wrote:
> On Wed, 25 Feb 2009, Gwenole Beauchesne wrote:
>
>> This patch adds AVHWAccel entry-points to VC-1 codec.
>
> Here is a new revision with ff_hwaccel_pixfmt_list_420[].

> diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
> index 03257b8..bea3b55 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;
> @@ -4277,6 +4279,15 @@ static int vc1_decode_frame(AVCodecContext *avctx,
>      s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
>      s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
>  
> +    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;
> +    }
>   

those if()'s can be merged

> +    else
>      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);
> @@ -4348,7 +4359,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 +4374,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
>
>   

Ben





More information about the ffmpeg-devel mailing list