On 09/02/2016 03:01 PM, Pengfei Qu wrote:
Signed-off-by: Pengfei Qu<pengfei...@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;

_______________________________________________
Libva mailing list
Libva@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to