[Libva] [PATCH intel-driver 1/4] decoder: h264: don't deallocate surface storage of older frames.
Gwenole Beauchesne
gb.devel at gmail.com
Wed May 14 02:04:49 PDT 2014
Hi,
2014-05-12 8:17 GMT+02:00 Zhao, Yakui <yakui.zhao at intel.com>:
> 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.
OK, will do but there is really zero change in the algorithm beyond
the natural and higher order optimization.
>> > 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.
I think there was a misunderstanding. The reference_surface[] is not
changed (yet), only the reference_objects[]. That's totally different.
The former is the frame store to maintain for the HW (and internal
info we have in the DMV buffers actually); the latter should be a 1:1
correspondence with VA surface ids in ReferenceFrames[] to the
associated object_surface objects (stored in reference_surface).
I will provide another patch set with a couple more patches:
1. Definitely fix MVC decode use cases ;
2. Optimize the process for Haswell and newer.
(3. if this really interests anyone, I may submit doc fixes and
clarifications if I find time to, but the code will be used as
reference).
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