[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 23:17:29 PDT 2014


On Sun, 2014-05-11 at 23:31 -0600, Gwenole Beauchesne wrote:
> Hi,
> 
> 2014-05-12 7:21 GMT+02:00 Zhao, Yakui <yakui.zhao at intel.com>:
> > On Sun, 2014-05-11 at 22:35 -0600, Gwenole Beauchesne wrote:
> >> Hi,
> >>
> >> 2014-05-12 2:55 GMT+02:00 Zhao Yakui <yakui.zhao at intel.com>:
> >> > 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?
> >>
> >> As it ought to be: at vaDestroySurfaces() time.
> >>
> >> >     2. How to find one free slot in decode_state->reference_surfaces
> >> > array to store the corresponding reference frame?
> >>
> >> It's the same algorithm. :)
> >> At this time, the reference_surfaces[] contents exactly matches
> >> ReferenceFrames[], hole for hole, if there is any. The former holds
> >> object_surface, the latter holds the associated VAPictureH264. i.e.
> >> pointer to object_surface [i] is really the reference_surface[i] that
> >> matches VAPictureH264 at ReferenceFrames[i]. Previously, there could
> >> be a mismatch between both.
> >
> > As you know, the current policy in the driver is based on the following
> > flowchart:
> >     1. the driver maintains one array for the hardware-requirement.
> >     2. When one new frame is decoded, it will check whether the array
> > element  maintained by the driver is still used by the DPB. If not, the
> > internal data structure will be free and then be used for the later
> > selection.
> >     3. Find the free slot in the array to store the reference frames in
> > DPB.
> >
> > But I don't see how this patch set stores/updates the reference frames
> > of DPB into the driver array and how to decide which slot can be
> > replaced by the reference frames in new DPB.
> 
> I don't understand your concern. It works the same as before, but
> replaces ReferenceFrames[] with reference_surface[], which now hold
> the same contents, in order. The free_slots[] array is filled in order
> too so that to avoid the extraneous iterations again to look for the
> same free slot id.

My point is that you can describe how you find the free slot for the
later update about the reference frame in DPB.  

> 
> > It will be better that you can describe the keypoint in the patch
> > especially when it updates the content required by the hardware.
> 
> What contents do you think we need to maintain for the hardware? The
> hardware is designed to be stateless, so it normally doesn't keep
> anything. This is necessary for context switching performance.

As I said in the previous email, the array of reference surface is one
content required by the hardware. 

> 
> Regards,
> Gwenole.
> 
> >> >>  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