OSDN Git Service

ENC: add MFX pipeline for AVC encoder
[android-x86/hardware-intel-common-vaapi.git] / src / intel_media_common.c
index 5fe9fc5..2b4db4f 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "intel_driver.h"
 #include "intel_media.h"
+#include "i965_drv_video.h"
 
 static pthread_mutex_t free_avc_surface_lock = PTHREAD_MUTEX_INITIALIZER;
 
@@ -76,7 +77,7 @@ int intel_format_convert(float src, int out_int_bits, int out_frac_bits,int out_
      if(negative_flag)
          output_value = (~output_value + 1) & ((1 <<(out_int_bits + out_frac_bits)) -1);
 
-     if(out_sign_flag == 1 && negative_flag)
+     if(output_value != 0 && out_sign_flag == 1 && negative_flag)
      {
           output_value |= negative_flag <<(out_int_bits + out_frac_bits);
      }
@@ -102,6 +103,12 @@ gen_free_hevc_surface(void **data)
     dri_bo_unreference(hevc_surface->motion_vector_temporal_bo);
     hevc_surface->motion_vector_temporal_bo = NULL;
 
+    if (hevc_surface->nv12_surface_obj) {
+        i965_DestroySurfaces(hevc_surface->ctx, &hevc_surface->nv12_surface_id, 1);
+        hevc_surface->nv12_surface_id = VA_INVALID_SURFACE;
+        hevc_surface->nv12_surface_obj = NULL;
+    }
+
     free(hevc_surface);
     *data = NULL;
 
@@ -123,11 +130,41 @@ void gen_free_vp9_surface(void **data)
         return;
     }
 
-    dri_bo_unreference(vp9_surface->motion_vector_temporal_bo);
-    vp9_surface->motion_vector_temporal_bo = NULL;
-
     free(vp9_surface);
     *data = NULL;
 
     pthread_mutex_unlock(&free_vp9_surface_lock);
 }
+
+extern VAStatus
+i965_DestroySurfaces(VADriverContextP ctx,
+                     VASurfaceID *surface_list,
+                     int num_surfaces);
+
+static pthread_mutex_t free_vdenc_avc_surface_lock = PTHREAD_MUTEX_INITIALIZER;
+
+void
+vdenc_free_avc_surface(void **data)
+{
+    VDEncAvcSurface *avc_surface;
+
+    pthread_mutex_lock(&free_vdenc_avc_surface_lock);
+
+    avc_surface = *data;
+
+    if (!avc_surface) {
+        pthread_mutex_unlock(&free_vdenc_avc_surface_lock);
+        return;
+    }
+
+    if (avc_surface->scaled_4x_surface_obj) {
+        i965_DestroySurfaces(avc_surface->ctx, &avc_surface->scaled_4x_surface_id, 1);
+        avc_surface->scaled_4x_surface_id = VA_INVALID_SURFACE;
+        avc_surface->scaled_4x_surface_obj = NULL;
+    }
+
+    free(avc_surface);
+    *data = NULL;
+
+    pthread_mutex_unlock(&free_vdenc_avc_surface_lock);
+}