encoder: reduce locks and extract rendering function
authorWind Yuan <feng.yuan@intel.com>
Fri, 16 Nov 2012 05:07:27 +0000 (13:07 +0800)
committerWind Yuan <feng.yuan@intel.com>
Fri, 22 Mar 2013 01:59:16 +0000 (09:59 +0800)
some locks in gstvaapiencoder is not quite necessary

gst-libs/gst/vaapi/gstvaapibaseencoder.c
gst-libs/gst/vaapi/gstvaapiencoder.c
gst-libs/gst/vaapi/gstvaapiencoder.h
gst-libs/gst/vaapi/gstvaapiencoder_h263.c
gst-libs/gst/vaapi/gstvaapiencoder_h264.c
gst-libs/gst/vaapi/gstvaapiencoder_mpeg4.c

index 38854e8..b82cbb1 100644 (file)
@@ -126,18 +126,16 @@ base_encoder_alloc_coded_buffers(
 )
 {
   GstVaapiBaseEncoderPrivate *priv = base_encoder->priv;
-  GstVaapiDisplay *display = ENCODER_DISPLAY(base_encoder);
   VADisplay va_dpy;
   VAContextID context_id;
   VAStatus va_status = VA_STATUS_SUCCESS;
-  gboolean is_locked = FALSE;
   guint i = 0;
   gboolean ret = TRUE;
   guint32 buffer_size =
       (ENCODER_WIDTH(base_encoder) * ENCODER_HEIGHT(base_encoder) * 400) /
       (16*16);
 
-  ENCODER_ASSERT(display && context);
+  ENCODER_ASSERT(context);
   ENCODER_ASSERT(priv->available_code_buffers);
   ENCODER_ASSERT(!priv->coded_bufs);
 
@@ -147,7 +145,6 @@ base_encoder_alloc_coded_buffers(
   priv->coded_bufs = (VABufferID*)
       g_malloc0(priv->coded_buf_num * sizeof(priv->coded_bufs[0]));
 
-  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
   for (i = 0; i < priv->coded_buf_num; i++) {
     va_status = vaCreateBuffer(va_dpy,
                                context_id,
@@ -158,7 +155,6 @@ base_encoder_alloc_coded_buffers(
     if (VA_STATUS_SUCCESS != va_status)
       break;
   }
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
   ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
                        FALSE,
                        "create coded buffer failed.");
@@ -184,7 +180,6 @@ release_coded_buffers(GstVaapiBaseEncoder *base_encoder)
   GstVaapiDisplay *display = ENCODER_DISPLAY(base_encoder);
   guint32 available_buf_count = priv->coded_buf_num;
   guint32 i;
-  gboolean is_locked = FALSE;
 
   ENCODER_ASSERT(display);
   VAAPI_UNUSED_ARG(va_status);
@@ -202,11 +197,9 @@ release_coded_buffers(GstVaapiBaseEncoder *base_encoder)
   }
   g_mutex_unlock(priv->code_buffer_lock);
 
-  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
   for (i = 0; i < priv->coded_buf_num; i++) {
     va_status = vaDestroyBuffer(va_dpy, priv->coded_bufs[i]);
   }
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
 
   return ENCODER_NO_ERROR;
 }
@@ -474,16 +467,9 @@ gst_vaapi_base_encoder_encode_default(
   EncoderStatus ret = ENCODER_NO_ERROR;
   gboolean is_key = FALSE;
   VABufferID* coded_buf = NULL;
-  VAStatus va_status = VA_STATUS_SUCCESS;
-  VASurfaceID  buffer_surface_id = VA_INVALID_SURFACE;
   GstVaapiSurface *buffer_surface = NULL;
-  gboolean is_locked = FALSE;
-  VADisplay va_dpy;
-  VAContextID context_id;
 
   ENCODER_ASSERT(display && context);
-  va_dpy = ENCODER_VA_DISPLAY(encoder);
-  context_id = ENCODER_VA_CONTEXT(encoder);
 
   /* Video Buffer */
   GstVaapiVideoBuffer *video_buffer = NULL;
@@ -521,19 +507,6 @@ again:
   }
 
   buffer_surface = gst_vaapi_video_buffer_get_surface(video_buffer);
-  buffer_surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(buffer_surface);
-  ENCODER_CHECK_STATUS(buffer_surface_id != VA_INVALID_SURFACE,
-                       ENCODER_SURFACE_ERR,
-                       "surface id == VA_INVALID_SURFACE");
-
-  /* begin surface*/
-  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
-  va_status = vaBeginPicture(va_dpy, context_id, buffer_surface_id);
-  //ENCODER_RELEASE_DISPLAY_LOCK(display);
-
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
-                       ENCODER_PICTURE_ERR,
-                       "vaBeginPicture error");
 
   /*get valid coded buffer*/
   coded_buf = pop_available_coded_buffer(priv);
@@ -555,14 +528,6 @@ again:
                        ENCODER_PICTURE_ERR,
                        "base_prepare_encoding failed");
 
-  /* end picture */
-  //ENCODER_ACQUIRE_DISPLAY_LOCK(display);
-  va_status = vaEndPicture(va_dpy, context_id);
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
-                       ENCODER_PICTURE_ERR,
-                       "vaEndPicture error");
-
   /*query surface result*/
   ret = base_query_encoding_status(base_encoder,
                                    buffer_surface,
@@ -586,7 +551,6 @@ again:
   }
 
 end:
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
   if (ret > ENCODER_NO_ERROR) {
     ret = ENCODER_NO_ERROR;
   }
index c7ca938..2b0c875 100644 (file)
@@ -24,6 +24,8 @@
 #include <string.h>
 
 #include "gstvaapidisplay_x11.h"
+#include "gstvaapiobject_priv.h"
+#include "gstvaapidisplay_priv.h"
 
 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_encoder_debug);
 #define GST_CAT_DEFAULT gst_vaapi_encoder_debug
@@ -259,6 +261,57 @@ end:
 }
 
 EncoderStatus
+gst_vaapi_encoder_render_picture(
+    GstVaapiEncoder *encoder,
+    GstVaapiSurface *surface,
+    VABufferID *bufs,
+    guint num
+)
+{
+  GstVaapiDisplay *display;
+  VASurfaceID  surface_id;
+  VAContextID context_id;
+  VADisplay   va_display;
+  VAStatus    va_status;
+  gboolean is_locked = FALSE;
+  EncoderStatus ret = ENCODER_NO_ERROR;
+
+  display = ENCODER_DISPLAY(encoder);
+
+  g_return_val_if_fail(surface, ENCODER_PARAMETER_ERR);
+  g_return_val_if_fail(ENCODER_CONTEXT(encoder), ENCODER_PARAMETER_ERR);
+
+  surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(surface);
+  context_id = ENCODER_VA_CONTEXT(encoder);
+  va_display = ENCODER_VA_DISPLAY(encoder);
+  g_return_val_if_fail(surface_id != VA_INVALID_SURFACE, ENCODER_PARAMETER_ERR);
+
+  /* begin surface*/
+  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
+  va_status = vaBeginPicture(va_display, context_id, surface_id);
+  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+                       ENCODER_PARAMETER_ERR,
+                                          "vaBeginPicture failed");
+
+  va_status = vaRenderPicture(va_display,
+                              context_id,
+                              bufs,
+                              num);
+  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+                       ENCODER_PARAMETER_ERR,
+                                          "vaRenderPicture failed");
+
+  va_status = vaEndPicture(va_display, context_id);
+  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+                       ENCODER_PARAMETER_ERR,
+                                          "vaRenderPicture failed");
+
+end:
+  ENCODER_RELEASE_DISPLAY_LOCK(display);
+  return ret;
+}
+
+EncoderStatus
 gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
index f3458a3..af0d2c3 100644 (file)
@@ -257,6 +257,14 @@ gst_vaapi_encoder_flush(GstVaapiEncoder* encoder, GList **coded_pics);
 EncoderStatus
 gst_vaapi_encoder_close(GstVaapiEncoder* encoder);
 
+EncoderStatus
+gst_vaapi_encoder_render_picture(
+    GstVaapiEncoder *encoder,
+    GstVaapiSurface *buffer_surface,
+    VABufferID *bufs,
+    guint num
+);
+
 /* close display */
 EncoderStatus
 gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder);
index 520a60b..70b0722 100644 (file)
@@ -162,6 +162,8 @@ gst_vaapi_encoder_h263_rendering(
   GstVaapiContext *context = ENCODER_CONTEXT(base);
   VADisplay va_dpy = ENCODER_VA_DISPLAY(base);
   VAContextID context_id = ENCODER_VA_CONTEXT(base);
+  VABufferID va_buffers[64];
+  guint32    va_buffers_count = 0;
 
   VAStatus va_status = VA_STATUS_SUCCESS;
   EncoderStatus ret = ENCODER_NO_ERROR;
@@ -186,10 +188,7 @@ gst_vaapi_encoder_h263_rendering(
     ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
                          ENCODER_ENC_RES_ERR,
                          "h263 alloc seq-buffer failed.");
-    va_status = vaRenderPicture(va_dpy, context_id, &priv->seq_param_id, 1);
-    ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
-                         ENCODER_PICTURE_ERR,
-                         "h263 vaRenderPicture seq-parameters failed.");
+    va_buffers[va_buffers_count++] = priv->seq_param_id;
   }
 
   /* set reference and reconstructed surfaces */
@@ -223,9 +222,8 @@ gst_vaapi_encoder_h263_rendering(
                                sizeof(pic_param), 1, &pic_param, &priv->pic_param_id);
   ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
                        ENCODER_ENC_RES_ERR, "h263 creating pic-param buffer failed.");
-  va_status = vaRenderPicture(va_dpy, context_id, &priv->pic_param_id, 1);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
-                       ENCODER_PICTURE_ERR, "h263 rendering pic-param buffer failed.");
+  va_buffers[va_buffers_count++] = priv->pic_param_id;
+
   /*initialize slice parameters, only ONE slice for h263*/
   VAEncSliceParameterBuffer slice_param = { 0 };
   slice_param.start_row_number = 0;
@@ -247,9 +245,13 @@ gst_vaapi_encoder_h263_rendering(
   ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
                        ENCODER_ENC_RES_ERR,
                        "h263 creating slice-parameters buffer failed.");
+  va_buffers[va_buffers_count++] = priv->slic_param_id;
 
-  va_status = vaRenderPicture(va_dpy, context_id, &priv->slic_param_id, 1);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
+  ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+                                         surface,
+                                         va_buffers,
+                                         va_buffers_count);
+  ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
                        ENCODER_PICTURE_ERR,
                        "h263 rendering slice-parameters buffer failed.");
 
index 2686bbd..1b82be8 100644 (file)
@@ -348,14 +348,11 @@ h264_encoder_release_parameters(GstVaapiEncoderH264 *encoder)
   GstVaapiDisplay *display = ENCODER_DISPLAY(encoder);
   GstVaapiContext *context = ENCODER_CONTEXT(encoder);
 
-  gboolean is_locked = FALSE;
-
   ENCODER_ASSERT(display);
   ENCODER_ASSERT(context);
   VAAPI_UNUSED_ARG(va_status);
   VADisplay va_dpy = gst_vaapi_display_get_display(display);
 
-  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
   if (VA_INVALID_ID != priv->seq_param_id) {
     va_status = vaDestroyBuffer(va_dpy, priv->seq_param_id);
     priv->seq_param_id = VA_INVALID_ID;
@@ -390,8 +387,6 @@ h264_encoder_release_parameters(GstVaapiEncoderH264 *encoder)
     priv->packed_pic_data_id = VA_INVALID_ID;
   }
 
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
-
   if (priv->slice_param_buffers) {
     g_free(priv->slice_param_buffers);
     priv->slice_param_buffers = NULL;
@@ -1221,23 +1216,15 @@ gst_vaapi_encoder_h264_rendering(
 )
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
-  VAStatus va_status = VA_STATUS_SUCCESS;
   GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
   GstVaapiEncoderH264Private *priv = encoder->priv;
-  GstVaapiDisplay *display = ENCODER_DISPLAY(base);
   GstVaapiContext *context = ENCODER_CONTEXT(base);
-  VADisplay va_dpy;
-  VAContextID context_id;
   VABufferID va_buffers[64];
   guint32    va_buffers_count = 0;
   gboolean is_params_ok = TRUE;
-  gboolean is_locked = FALSE;
 
   ENCODER_ASSERT(context);
 
-  va_dpy = ENCODER_VA_DISPLAY(base);
-  context_id = ENCODER_VA_CONTEXT(base);
-
   *is_key = (priv->cur_slice_type == SLICE_TYPE_I);
 
   if (!priv->ref_surface1) {
@@ -1288,9 +1275,6 @@ gst_vaapi_encoder_h264_rendering(
                        ENCODER_PARAMETER_ERR,
                        "h264_recreate_slice_param failed");
 
-  /* lock display */
-  ENCODER_ACQUIRE_DISPLAY_LOCK(display);
-
   /*render all buffers*/
   if (VA_INVALID_ID != priv->seq_param_id) {
   #if HAVE_OLD_H264_ENCODER
@@ -1325,12 +1309,11 @@ gst_vaapi_encoder_h264_rendering(
       va_buffers[va_buffers_count++] = priv->packed_pic_data_id;
     }
   }
-
-  va_status = vaRenderPicture(va_dpy,
-                              context_id,
-                              va_buffers,
-                              va_buffers_count);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+  ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+                                         surface,
+                                         va_buffers,
+                                         va_buffers_count);
+  ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
                        ENCODER_PICTURE_ERR,
                        "vaRenderH264Picture failed.");
 
@@ -1341,7 +1324,6 @@ gst_vaapi_encoder_h264_rendering(
   }
 
   end:
-  ENCODER_RELEASE_DISPLAY_LOCK(display);
   return ret;
 }
 
index cf18e3e..df55421 100644 (file)
@@ -197,6 +197,8 @@ gst_vaapi_encoder_mpeg4_rendering(
   GstVaapiContext *context = ENCODER_CONTEXT(base);
   VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
   VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
+  VABufferID va_buffers[64];
+  guint32    va_buffers_count = 0;
 
   VAStatus va_status = VA_STATUS_SUCCESS;
   EncoderStatus ret = ENCODER_NO_ERROR;
@@ -230,10 +232,7 @@ gst_vaapi_encoder_mpeg4_rendering(
     ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
                          ENCODER_ENC_RES_ERR,
                          "mpeg4 alloc seq-buffer failed.");
-    va_status = vaRenderPicture(va_dpy, context_id, &priv->seq_param_id, 1);
-    ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
-                         ENCODER_PICTURE_ERR,
-                         "mpeg4 vaRenderPicture seq-parameters failed.");
+    va_buffers[va_buffers_count++] = priv->seq_param_id;
   }
 
   /* set reference and reconstructed surfaces */
@@ -282,10 +281,7 @@ gst_vaapi_encoder_mpeg4_rendering(
                        ENCODER_ENC_RES_ERR,
                        "mpeg4 creating pic-param buffer failed.");
 
-  va_status = vaRenderPicture(va_dpy, context_id, &priv->pic_param_id, 1);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS ==va_status,
-                       ENCODER_PICTURE_ERR,
-                       "mpeg4 rendering pic-param buffer failed.");
+  va_buffers[va_buffers_count++] = priv->pic_param_id;
 
   /*initialize slice parameters, only ONE slice for mpeg4*/
   VAEncSliceParameterBuffer slice_param = { 0 };
@@ -309,8 +305,13 @@ gst_vaapi_encoder_mpeg4_rendering(
                        ENCODER_ENC_RES_ERR,
                        "mpeg4 creating slice-parameters buffer failed.");
 
-  va_status = vaRenderPicture(va_dpy, context_id, &priv->slice_param_id, 1);
-  ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
+  va_buffers[va_buffers_count++] = priv->slice_param_id;
+
+  ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
+                                         surface,
+                                         va_buffers,
+                                         va_buffers_count);
+  ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
                        ENCODER_PICTURE_ERR,
                        "mpeg4 rendering slice-parameters buffer failed.");