[FFmpeg-devel] [PATCH][7/8] Add VA API accelerated H.264 decoding (take 3)

Gwenolé Beauchesne gbeauchesne
Thu Feb 5 23:06:53 CET 2009


Hi,

Le 5 f?vr. 09 ? 19:51, Stephen Warren a ?crit :

>> @@ -7502,7 +7524,11 @@ static int decode_nal_units(H264Context *h,  
>> const uint8_t *buf, int buf_size){
>>             av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d  
>> bits)\n", h->nal_unit_type, bit_length);
>>         }
>>
>> -        if(context_count == h->max_contexts) {
>> +        if(IS_VAAPI_ENABLED(s)) {
>> +            /* Make sure we never call execute_decode_slices() */
>> +            context_count = 0;
>> +        }
>> +        else if(context_count == h->max_contexts) {
>>             execute_decode_slices(h, context_count);
>>             context_count = 0;
>>         }
>
> The VDPAU code handles this by making execute_decode_slices return  
> immediately
> if VDPAU is enabled. VDPAU and VA API should really be consistent. I  
> think we
> copied the VDPAU mechanism from existing MPEG-2 XvMC integration.

Well, I don't like things getting incremented for no reason/use, so I  
prefer making sure they never grow instead. ;-) But you are also right  
to exit early in that function.

> Note however, that there's a reason that *some* of the information  
> VDPAU uses
> is picked up during frame_end time not frame_start time. My memory  
> is poor,
> but I *think* the call to execute_ref_pic_marking() right before the  
> existing
> ff_vdpau_h264_picture_complete() modifies one of the data fields  
> VDPAU uses,
> and I *think* that was h->frame_num (everything else comes from SPS/ 
> PPS
> anyway, so shouldn't be modified after parsing those). It looks like  
> VA API
> grabs this during ff_vaapi_h264_frame_start() rather than
> ff_vaapi_h264_frame_end(), which I suspect is a bug.

Now that you mention it, it's possible. The remaining issue I have is  
some frames are not displayed in the right order for very specific  
streams. The pictures don't have any artifacts (like in the past  
because of bad ReferenceFrames[] construction), they just aren't  
displayed in the right order. That's with VA API on Intel. With VDPAU  
(your original work r34something, or my wrapper), those streams don't  
play at all. MPlayer aborts with an error 25 (or whatever is the  
generic error code and that I don't remember), I need to investigate  
further.

On the other hand, isn't frame_num the verbatim copy from the  
bitstream? Isn't Picture::pic_id the thing that is modified during  
ref_pic_marking instead? i.e. what you called frame_idx, though it's  
not the exact same semantics, I think.

I think I placed ff_vaapi_h264_frame_start() at the right location:  
after everything is parsed and before actual decoding of the first  
slice. It's also at this location that what-FFmpeg-uses-as-a-DPB  
should valid for proper decoding.

BTW, the latest incarnation of mplayer-vaapi and vdpau-video work  
equivalently to mplayer-vdpau. According to my poor eyes, of course.  
The non smooth motion you might see is my failure to implement double  
buffering correctly, I think.

Regards,
Gwenole.



More information about the ffmpeg-devel mailing list