[Libva] [PATCH intel-driver 1/4] decoder: h264: don't deallocate surface storage of older frames.

Zhao Yakui yakui.zhao at intel.com
Sun May 11 17:55:53 PDT 2014


On Fri, 2014-05-09 at 08:34 -0600, Gwenole Beauchesne wrote:
> Drop the optimization whereby surfaces that are no longer marked as
> reference and that were already displayed are to be destroyed. This
> is wrong mainly for two reasons:
> 
> 1. The surface was displayed... once but it may still be needed for
>    subsequent operations like displaying it again, using it for a
>    transcode pipeline (encode) for instance, etc.
> 
> 2. The new set of ReferenceFrames[] correspond to the active set of
>    reference frames used for decoding the current slice. In presence
>    of Multiview Coding (MVC), that could correspond to the current
>    view, in view order index, but the surface may still be needed
>    for decoding the next view with the same view_id, while also
>    decoding other views with another set of reference frames for them.

Hi, Gwenole
    
    Thanks for working on the h264 reference frame list. And I have 
some concerns about the patch set:
    1. When will the unused reference surface be destroyed? 
    2. How to find one free slot in decode_state->reference_surfaces
array to store the corresponding reference frame?

Will you please describe it in the patch description?

Thanks.
    Yakui
> 
> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
> ---
>  src/i965_decoder_utils.c | 13 -------------
>  1 file changed, 13 deletions(-)
> 
> diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c
> index 2533381..9d537ff 100644
> --- a/src/i965_decoder_utils.c
> +++ b/src/i965_decoder_utils.c
> @@ -382,19 +382,6 @@ intel_update_avc_frame_store_index(VADriverContextP ctx,
>  
>          /* remove it from the internal DPB */
>          if (!found) {
> -            struct object_surface *obj_surface = frame_store[i].obj_surface;
> -            
> -            obj_surface->flags &= ~SURFACE_REFERENCED;
> -
> -            if ((obj_surface->flags & SURFACE_ALL_MASK) == SURFACE_DISPLAYED) {
> -                dri_bo_unreference(obj_surface->bo);
> -                obj_surface->bo = NULL;
> -                obj_surface->flags &= ~SURFACE_REF_DIS_MASK;
> -            }
> -
> -            if (obj_surface->free_private_data)
> -                obj_surface->free_private_data(&obj_surface->private_data);
> -
>              frame_store[i].surface_id = VA_INVALID_ID;
>              frame_store[i].frame_store_id = -1;
>              frame_store[i].obj_surface = NULL;




More information about the Libva mailing list