[Libva] [PATCH 2/3] Encode: Don't mess up the index handling of packed raw data with packed slice header

Zhao, Yakui yakui.zhao at intel.com
Wed May 28 17:42:10 PDT 2014


On Wed, 2014-05-28 at 15:02 -0600, sreerenj.balachandran at intel.com
wrote:
> From: Sreerenj Balachandran <sreerenj.balachandran at intel.com>
> 
> Avoid storing packed slice header index as packed raw data index.
> This patch is a preparation for submitting all the packed slice
> headers as a group , instead of pairing with VAEncSliceParameterBuffer in
> multi slice per frame encoding. If the user only passes the packed
> slice_header data for one slice before VAEncSliceParameterbuffer
> one by one, it still can work without this patch.

Hi, Sreerenj

    Thanks for your patch.
    But I have two concerns about this patch and following patch(grouped
submission of packed_slice header)
    a. After this patch, it won't work when passing the packed
rawdata/slice header like the below order for one slice(Of course they
are passed before VAEncSliceParameterBuffer).
       >packed rawdata 0, slice_header , packed rawdata 1;
       
       In such case the packed rawdata 1 won't be inserted as expected.

       Without this patch, it will firstly insert packed rawdata 0/1 and
then insert the slice_header. 

       If so, it will be better that a new structure is added to store
the packed slice_header data. 

    b. The next patch will try to group the submission of packed
slice_header data for multi-slices. If the frame is divided into four
slices and three slice header data are passed, how will it be handled?
And how to decide which slice header data is inserted for one slice? As
you know, the current mechanism is that the slice_header data is
optional.(That is to say: For one slice the driver will firstly try to
insert the slice_header data passed from user. If it doesn't exist, it
will generate the data by itself.) So the submission of slice_header
data is also based on the VAEncSliceParameterBuffer delimeter.

Thanks.
    Yakui  

> ---
>  src/i965_drv_video.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
> index 44da864..4854a62 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -2341,8 +2341,7 @@ i965_encoder_render_picture(VADriverContextP ctx,
>                  vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
>                  return vaStatus;
>              }
> -            if (encode->last_packed_header_type == VAEncPackedHeaderRawData ||
> -                encode->last_packed_header_type == VAEncPackedHeaderSlice) {
> +            if (encode->last_packed_header_type == VAEncPackedHeaderRawData) {
>                  vaStatus = I965_RENDER_ENCODE_BUFFER(packed_header_data_ext);
>                  if (vaStatus == VA_STATUS_SUCCESS) {
>                      /* store the first index of the packed header data for current slice */
> @@ -2351,6 +2350,10 @@ i965_encoder_render_picture(VADriverContextP ctx,
>                               SLICE_PACKED_DATA_INDEX_TYPE | (encode->num_packed_header_data_ext - 1);
>                      }
>                      encode->slice_rawdata_count[encode->num_slice_params_ext]++;
> +                }
> +	    } else if (encode->last_packed_header_type == VAEncPackedHeaderSlice) {
> +                vaStatus = I965_RENDER_ENCODE_BUFFER(packed_header_data_ext);
> +                if (vaStatus == VA_STATUS_SUCCESS) {
>                      if (encode->last_packed_header_type == VAEncPackedHeaderSlice) {
>                          if (encode->slice_header_index[encode->num_slice_params_ext] == 0) {
>                              encode->slice_header_index[encode->num_slice_params_ext] =




More information about the Libva mailing list