[Libva] [HEVC10bit ENC V2 1/5] HEVC10bit ENC: add driver context member and internal NV12 surface in VME

Zhao Yakui yakui.zhao at intel.com
Fri Sep 2 07:20:02 UTC 2016


On 09/02/2016 03:01 PM, Pengfei Qu wrote:
> Signed-off-by: Pengfei Qu<Pengfei.Qu at intel.com>
> ---
>   src/gen6_vme.c | 17 +++++++++++++++++
>   src/gen6_vme.h |  8 ++++++++
>   src/gen7_vme.c |  2 ++
>   src/gen8_vme.c | 12 +++++++++++-
>   4 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/src/gen6_vme.c b/src/gen6_vme.c
> index 45cc30e..1f4f001 100644
> --- a/src/gen6_vme.c
> +++ b/src/gen6_vme.c
> @@ -611,6 +611,7 @@ static void
>   gen6_vme_context_destroy(void *context)
>   {
>       struct gen6_vme_context *vme_context = context;
> +    int i = 0;
>
>       i965_gpe_context_destroy(&vme_context->gpe_context);
>
> @@ -626,6 +627,20 @@ gen6_vme_context_destroy(void *context)
>       free(vme_context->qp_per_mb);
>       vme_context->qp_per_mb = NULL;
>
> +    if (vme_context->input_yuv_object_internal) {
> +        i965_DestroySurfaces(vme_context->driver_context,&vme_context->input_yuv_surface_internal, 1);
> +        vme_context->input_yuv_surface_internal = VA_INVALID_SURFACE;
> +        vme_context->input_yuv_object_internal = NULL;
> +    }
> +
> +    for(i = 0 ; i<  16 ; i++) {
> +        if (vme_context->reference_objects_internal[i]) {
> +            i965_DestroySurfaces(vme_context->driver_context,&vme_context->reference_surface_internal[i], 1);
> +            vme_context->reference_surface_internal[i] = VA_INVALID_SURFACE;
> +            vme_context->reference_objects_internal[i] = NULL;
> +        }
> +    }

I guess that the member of reference_surface_internal/object is only for 
the specific platform/codec.

Is it possible that it is added as priv_state pointer for the 
vme_context? How to parse/intercept it depends on the specific 
platform/codec. In such case if some platform doesn't need it, we only 
need to add similar code:
     > free(vme_context->priv_state);


> +
>       free(vme_context);
>   }
>
> @@ -672,5 +687,7 @@ Bool gen6_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *e
>       encoder_context->vme_context = vme_context;
>       encoder_context->vme_context_destroy = gen6_vme_context_destroy;
>
> +    vme_context->driver_context = ctx;

It will be better to add more description about adding the ctx pointer 
into vme_context.

> +
>       return True;
>   }
> diff --git a/src/gen6_vme.h b/src/gen6_vme.h
> index e8f4742..8aeced0 100644
> --- a/src/gen6_vme.h
> +++ b/src/gen6_vme.h
> @@ -107,6 +107,14 @@ struct gen6_vme_context
>       bool roi_enabled;
>       char *qp_per_mb;
>       int saved_width_mbs, saved_height_mbs;
> +
> +    //Encoding HEVC10:internal surface keep for P010->NV12 , this is only for hevc10 to save the P010->NV12
> +    struct object_surface *input_yuv_object_internal;
> +    struct object_surface *reference_objects_internal[16];
> +    VASurfaceID input_yuv_surface_internal;
> +    VASurfaceID reference_surface_internal[16];
> +    VADriverContextP driver_context;
> +
>   };
>
>   #define MPEG2_PIC_WIDTH_HEIGHT	30
> diff --git a/src/gen7_vme.c b/src/gen7_vme.c
> index 897d169..7f8dc5e 100644
> --- a/src/gen7_vme.c
> +++ b/src/gen7_vme.c
> @@ -1167,5 +1167,7 @@ Bool gen7_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *e
>       encoder_context->vme_context_destroy = gen7_vme_context_destroy;
>       vme_context->vme_state_message = malloc(VME_MSG_LENGTH * sizeof(int));
>
> +    vme_context->driver_context = ctx;
> +
>       return True;
>   }
> diff --git a/src/gen8_vme.c b/src/gen8_vme.c
> index 2a93d1e..f6b3318 100644
> --- a/src/gen8_vme.c
> +++ b/src/gen8_vme.c
> @@ -1335,7 +1335,7 @@ Bool gen8_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *e
>   {
>       struct gen6_vme_context *vme_context = NULL;
>       struct i965_kernel *vme_kernel_list = NULL;
> -    int i965_kernel_num;
> +    int i965_kernel_num,i;
>
>       switch (encoder_context->codec) {
>       case CODEC_H264:
> @@ -1404,6 +1404,16 @@ Bool gen8_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *e
>           encoder_context->vme_context_destroy = gen8_vme_context_destroy;
>
>           vme_context->vme_state_message = malloc(VME_MSG_LENGTH * sizeof(int));
> +
> +        vme_context->driver_context = ctx;
> +
> +        // HEVC 10bit
> +        vme_context->input_yuv_surface_internal = VA_INVALID_SURFACE;
> +        vme_context->input_yuv_object_internal = NULL;
> +        for(i = 0 ; i<  16 ; i++) {
> +            vme_context->reference_surface_internal[i] = VA_INVALID_SURFACE;
> +            vme_context->reference_objects_internal[i] = NULL;
> +        }
>       }
>
>       return True;



More information about the Libva mailing list