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

Kostya kostya.shishkov
Wed Mar 18 18:34:04 CET 2009


On Wed, Mar 18, 2009 at 06:06:31PM +0100, Gwenole Beauchesne wrote:
> Hi,
> 
> On Tue, 10 Mar 2009, Kostya wrote:
> 
> >>@@ -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;
> >>+    }
> >>+    else
> >
> ><don't forget proper indent here>
> 
> Well, that was an "optimization" to get a smaller patch (only '+') and 
> reduce the next one when removing VDPAU with only '-'s instead. ;-) 
> Anyway, reindented correctly as you can see in the attachment.

Actually I don't like
    }
    else
instead of
    } else

And you should not worry about that kind of optimisation.

> >>     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);
> >
> >Those two chunks make me a bit uneasy and not because of your changes.
> >
> >Patch OK in the case you swear to convert VDPAU to hwaccel architecture
> >(I don't like to have too many special cases).
> 
> I am sorry but I can't swear anything because

> (i) AVHWAccel is not really 
> a "special" case, it's the new default HW acceleration framework,

Well, I'm plain C codec developer, so hardware acceleration added in one form
or another is a special case to me (since the call does not proceed to actual
frame decoding routine).

> (ii) you 
> can't swear either that all VA API bits can get in by the end of the week,

I don't care about them but since you are the man behind AVHWAccel, why not
convert existing instances to AVHWAccel?

Example:
old vc1.c:
  decode_frame(){
   parse();
   decode();
  }

after VDPAU:
  decode_frame(){
   parse();
   if(codec_cap & VDPAU)
    decode_vdpau();
   else
    decode();

with this patch:
  decode_frame(){
   parse();
   if(codec_cap & VDPAU)
    decode_vdpau();
   else if(hwaccel)
    hwaccel->decode();
   else
    decode();
  }

what I like to see:
  decode_frame(){
   parse();
   if(hwaccel)
    hwaccel->decode();
   else
    decode();
  }

> (iii) this is independent from vc1.c,
> (iv) what if I did not actually have 
> the HW to work on VDPAU support in the first place? Blind coding? Well, 
> this process can work with patient enough testers, according to reports I 
> got for my initial VAAPI-to-VDPAU bridge code for VC-1. ;-)

Yes, we are accustomed to that here. Also since the code is already here, you
just have to reorganize it a bit to fit into HWAccel.

Also that does not mean you have to produce such patch immediately, I just
want to ensure it won't be forgotten.

[...]
> @@ -4277,8 +4279,16 @@ 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 ((CONFIG_VC1_VDPAU_DECODER || CONFIG_WMV3_VDPAU_DECODER)
> -        &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
> +    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 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 {
>          ff_er_frame_start(s);

No need to swap conditions here.




More information about the ffmpeg-devel mailing list