encoders: remove encoders image upload and simplify parts code
authorWind Yuan <feng.yuan@intel.com>
Thu, 2 Aug 2012 07:29:05 +0000 (03:29 -0400)
committerZhong Cong <congx.zhong@intel.com>
Tue, 5 Feb 2013 07:37:11 +0000 (15:37 +0800)
gst-libs/gst/vaapi/gstvaapibaseencoder.c
gst-libs/gst/vaapi/gstvaapiencoder.c
gst-libs/gst/vaapi/gstvaapiencoder.h
gst/vaapi/gstvaapiencode.c

index ae91cdf..00ec591 100644 (file)
 #include "gst/vaapi/gstvaapidisplay_priv.h"
 #include "gst/vaapi/gstvaapidebug.h"
 
-
-#if USE_VAAPI_GLX
-#include "gst/vaapi/gstvaapivideobuffer_glx.h"
-#define gst_vaapi_video_buffer_new_from_pool(pool) \
-    gst_vaapi_video_buffer_glx_new_from_pool(pool)
-#endif
-
-
 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_base_encoder_debug);
 #define GST_CAT_DEFAULT gst_vaapi_base_encoder_debug
 
 #define VA_INVALID_PROFILE 0xffffffff
 #define DEFAULT_VA_CODEDBUF_NUM  4
 
-#define GST_TYPE_ENCODER_SHARED_BUFFER (gst_base_encode_buffer_get_type())
-
-static GstMiniObjectClass *gst_encoder_share_buffer_parent_class = NULL;
-
-typedef struct _GstEncoderShareBuffer  GstEncoderShareBuffer;
-struct _GstEncoderShareBuffer {
-  GstBuffer            buffer;
-  VABufferID          *coded_id;
-  GstVaapiBaseEncoder *encoder;
-};
-
-
 struct _GstVaapiBaseEncoderPrivate {
   guint32           format;   /*NV12, I420,*/
   VAProfile         profile;
   /*total encoded frames*/
   guint32           frame_count;
-  gboolean          frame_notify_flag;
-
   VABufferID       *coded_bufs;
   guint32           coded_buf_num;
   GMutex           *code_buffer_lock;
@@ -82,7 +60,8 @@ struct _GstVaapiBaseEncoderPrivate {
 
   GstVaapiSurfacePool *surfaces_pool;
 
-  gboolean          need_flush;
+  guint             frame_notify_flag : 1;
+  guint             need_flush        : 1;
 };
 
 G_DEFINE_TYPE(GstVaapiBaseEncoder, gst_vaapi_base_encoder, GST_TYPE_VAAPI_ENCODER);
@@ -92,7 +71,7 @@ static EncoderStatus gst_vaapi_base_encoder_initialize_default(
 static EncoderStatus gst_vaapi_base_encoder_uninitialize_default(
                          GstVaapiEncoder* encoder, GstVaapiDisplay *display);
 static EncoderStatus gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder,
-                         GstVaapiDisplay *display, void* private_data,
+                         GstVaapiDisplay *display,
                          GstVaapiContext **context);
 static EncoderStatus gst_vaapi_base_encoder_close_default(GstVaapiEncoder* encoder,
                          GstVaapiDisplay *display, GstVaapiContext *context);
@@ -111,9 +90,6 @@ static gboolean      base_encoder_alloc_coded_buffers(GstVaapiBaseEncoder *base_
                          GstVaapiDisplay *display, GstVaapiContext *context);
 static EncoderStatus base_encoder_release_coded_buffers(GstVaapiBaseEncoder *base_encoder,
                          GstVaapiDisplay *display, GstVaapiContext *context);
-static EncoderStatus base_put_raw_buffer_to_surface(GstVaapiBaseEncoder *base_encoder,
-                         GstVaapiDisplay *display, GstBuffer *raw_pic, GstVaapiSurface *surface);
-
 static EncoderStatus base_query_encoding_status(GstVaapiBaseEncoder *base_encoder,
                          GstVaapiDisplay *display, GstVaapiSurface *buffer_surface,
                          gboolean is_key, GstVaapiVideoBuffer *surface_buffer,
@@ -182,87 +158,6 @@ gst_vaapi_base_encoder_class_init(GstVaapiBaseEncoderClass *klass)
 }
 
 static void
-gst_encoder_share_buffer_finalize (GstEncoderShareBuffer *base_buffer)
-{
-  GstVaapiBaseEncoder *encoder = NULL;
-  VABufferID* coded_id = NULL;
-  GstVaapiDisplay *display = NULL;
-  GstVaapiBaseEncoderPrivate *encoder_prv = NULL;
-
-  gboolean is_locked = FALSE;
-
-  encoder = base_buffer->encoder;
-  coded_id = base_buffer->coded_id;
-  display = ENCODER_DISPLAY(encoder);
-  encoder_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
-
-  ENCODER_ASSERT(display);
-  VADisplay va_dpy = gst_vaapi_display_get_display(display);
-
-  ENCODER_ASSERT(encoder_prv);
-  ENCODER_ASSERT(coded_id && VA_INVALID_ID!= *coded_id);
-
-  /*if (--(*base_buffer->ref_coded_id) == 0) */
-  {
-    /*g_free(base_buffer->ref_coded_id);*/
-    ENCODER_ACQUIRE_DISPLAY_LOCK(display);
-    vaUnmapBuffer(va_dpy, *coded_id);
-    ENCODER_RELEASE_DISPLAY_LOCK(display);
-    push_available_coded_buffer(encoder_prv, coded_id);
-  }
-
-  if (GST_MINI_OBJECT_CLASS(gst_encoder_share_buffer_parent_class)->finalize) {
-    GST_MINI_OBJECT_CLASS(gst_encoder_share_buffer_parent_class)->finalize(GST_MINI_OBJECT(base_buffer));
-  }
-}
-
-static void
-gst_encode_share_buffer_class_init (gpointer g_class, gpointer class_data)
-{
-  GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS(g_class);
-
-  gst_encoder_share_buffer_parent_class = g_type_class_peek_parent(g_class);
-  ENCODER_ASSERT(gst_encoder_share_buffer_parent_class);
-
-  mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
-      gst_encoder_share_buffer_finalize;
-}
-
-
-static GType
-gst_base_encode_buffer_get_type (void)
-{
-  static GType s_base_encode_buffer_type = 0;
-  if (G_UNLIKELY (s_base_encode_buffer_type == 0)) {
-    static const GTypeInfo s_base_encode_buffer_info = {
-      sizeof(GstBufferClass),
-      NULL,
-      NULL,
-      gst_encode_share_buffer_class_init,
-      NULL,
-      NULL,
-      sizeof(GstEncoderShareBuffer),
-      0,
-      NULL,
-      NULL
-    };
-    s_base_encode_buffer_type = g_type_register_static (GST_TYPE_BUFFER,
-        "GstEncoderShareBuffer", &s_base_encode_buffer_info, 0);
-  }
-  return s_base_encode_buffer_type;
-}
-
-static GstEncoderShareBuffer *
-gst_base_encode_share_buffer_new(GstVaapiBaseEncoder *encoder, VABufferID *coded_id)
-{
-  GstEncoderShareBuffer *buf = (GstEncoderShareBuffer*)gst_mini_object_new(GST_TYPE_ENCODER_SHARED_BUFFER);
-  buf->coded_id = coded_id;
-  buf->encoder = encoder;
-  return buf;
-}
-
-
-static void
 gst_vaapi_base_encoder_init(GstVaapiBaseEncoder *encoder)
 {
   GstVaapiBaseEncoderPrivate *base_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
@@ -280,7 +175,6 @@ gst_vaapi_base_encoder_init(GstVaapiBaseEncoder *encoder)
   base_prv->code_buffer_cond = g_cond_new();
   base_prv->available_code_buffers = g_queue_new();
 
-  base_prv->surfaces_pool = NULL;
   base_prv->need_flush = FALSE;
 }
 
@@ -329,13 +223,12 @@ default_validate_encoder_parameters(GstVaapiBaseEncoder *encoder)
 }
 
 EncoderStatus
-gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *display, void* private_data, GstVaapiContext **context)
+gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext **context)
 {
   GstVaapiBaseEncoder* base_encoder = GST_VAAPI_BASE_ENCODER(encoder);
   GstVaapiBaseEncoderClass *base_class = GST_VAAPI_BASE_ENCODER_GET_CLASS(encoder);
   GstVaapiBaseEncoderPrivate *base_prv = GST_VAAPI_BASE_ENCODER_GET_PRIVATE(encoder);
 
-  GstVaapiSurfacePool *surfaces_pool = private_data;
   GstVaapiContext *out_context = NULL;
 
   EncoderStatus ret = ENCODER_NO_ERROR;
@@ -351,29 +244,11 @@ gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *d
 
   ENCODER_ASSERT(ENCODER_DISPLAY(encoder));
 
-#ifdef _MRST_
-  out_context = g_object_new(
-        GST_VAAPI_TYPE_CONTEXT,
-        "display",      display,
-        "id",           GST_VAAPI_ID(VA_INVALID_ID),
-        "entrypoint",   gst_vaapi_entrypoint(VAEntrypointEncSlice),
-        "width",        ENCODER_WIDTH(encoder),
-        "height",       ENCODER_HEIGHT(encoder),
-        NULL
-    );
-  if (surfaces_pool) {
-    gst_vaapi_context_set_surface_pool(out_context, surfaces_pool);
-  }
-  g_object_set(out_context, "profile",  gst_vaapi_profile(base_prv->profile), NULL);
-
-#else
-  VAAPI_UNUSED_ARG(surfaces_pool);
   out_context = gst_vaapi_context_new(display,
                         gst_vaapi_profile(base_prv->profile),
                         gst_vaapi_entrypoint(VAEntrypointEncSlice),
                         ENCODER_WIDTH(encoder),
                         ENCODER_HEIGHT(encoder));
-#endif
   ENCODER_CHECK_STATUS(out_context, ENCODER_CONTEXT_ERR, "gst_vaapi_context_new failed.");
   ENCODER_CHECK_STATUS(VA_INVALID_ID != GST_VAAPI_OBJECT_ID(out_context), ENCODER_CONTEXT_ERR, "gst_vaapi_context_new failed.");
 
@@ -388,8 +263,6 @@ gst_vaapi_base_encoder_open_default(GstVaapiEncoder* encoder, GstVaapiDisplay *d
   );
   *context = out_context;
 
-  base_prv->surfaces_pool = gst_vaapi_context_get_surface_pool(out_context);
-  ENCODER_ASSERT(base_prv->surfaces_pool);
   return ENCODER_NO_ERROR;
 
 end:
@@ -420,11 +293,6 @@ gst_vaapi_base_encoder_close_default(GstVaapiEncoder* encoder, GstVaapiDisplay *
   base_encoder_release_coded_buffers(base_encoder, display, context);
   base_prv->frame_count = 0;
 
-  if (base_prv->surfaces_pool) {
-    g_object_unref(base_prv->surfaces_pool);
-    base_prv->surfaces_pool = NULL;
-  }
-
   return ret;
 }
 
@@ -525,7 +393,6 @@ gst_vaapi_base_encoder_encode_default(GstVaapiEncoder* encoder, GstVaapiDisplay
   ENCODER_ASSERT(display && context);
   VADisplay va_dpy = gst_vaapi_display_get_display(display);
   VAContextID context_id = GST_VAAPI_OBJECT_ID(context);
-  GstVaapiSurface *new_surface = NULL;
 
   /* Video Buffer */
   GstVaapiVideoBuffer *video_buffer = NULL;
@@ -538,17 +405,7 @@ gst_vaapi_base_encoder_encode_default(GstVaapiEncoder* encoder, GstVaapiDisplay
       video_buffer = GST_VAAPI_VIDEO_BUFFER(raw_pic);
       gst_buffer_ref(GST_BUFFER_CAST(video_buffer));
     } else {
-      ENCODER_CHECK_STATUS(base_prv->surfaces_pool, ENCODER_SURFACE_ERR, "surface pool could not be found in context");
-      video_buffer = (GstVaapiVideoBuffer*)gst_vaapi_video_buffer_new_from_pool((GstVaapiVideoPool*)base_prv->surfaces_pool);
-      new_surface = gst_vaapi_video_buffer_get_surface(video_buffer); //gst_vaapi_context_get_surface(context);
-      ENCODER_CHECK_STATUS(new_surface, ENCODER_SURFACE_ERR, "base_pop_free_surface failed.");
-
-      /* put picture to new surface */
-      va_status = base_put_raw_buffer_to_surface(base_encoder, display, raw_pic, new_surface);
-      ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status, ENCODER_PICTURE_ERR, "va put buffer to surface failed.");
-
-      GST_BUFFER_TIMESTAMP(video_buffer) = GST_BUFFER_TIMESTAMP(raw_pic);
-      GST_BUFFER_DURATION(video_buffer) = GST_BUFFER_DURATION(raw_pic);
+        /* do something else */
     }
   } else {
     base_prv->need_flush = TRUE;
@@ -662,6 +519,7 @@ push_available_coded_buffer(GstVaapiBaseEncoderPrivate *base_prv, VABufferID *bu
   return TRUE;
 }
 
+#if 0
 static EncoderStatus
 base_put_raw_buffer_to_surface(GstVaapiBaseEncoder *base_encoder,
                                GstVaapiDisplay *display,
@@ -751,6 +609,7 @@ base_put_raw_buffer_to_surface(GstVaapiBaseEncoder *base_encoder,
 
   return ret;
 }
+#endif
 
 static EncoderStatus
 base_query_encoding_status(GstVaapiBaseEncoder *base_encoder,
index 203fbc5..3030fbb 100644 (file)
@@ -58,11 +58,15 @@ gst_vaapi_encoder_class_init(GstVaapiEncoderClass *kclass)
 static void
 gst_vaapi_encoder_init(GstVaapiEncoder *encoder)
 {
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
-  ENCODER_ASSERT(encoder_prv);
-  encoder_prv->display = NULL;
-  encoder_prv->context = NULL;
-  encoder_prv->state = VAAPI_ENC_NULL;
+  GstVaapiEncoderPrivate *priv;
+
+  encoder->priv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  priv = encoder->priv;
+  ENCODER_ASSERT(priv);
+
+  priv->display = NULL;
+  priv->context = NULL;
+  priv->state = VAAPI_ENC_NULL;
 
   encoder->width = 0;
   encoder->height = 0;
@@ -73,19 +77,19 @@ static void
 gst_vaapi_encoder_finalize(GObject *object)
 {
   GstVaapiEncoder* encoder = GST_VAAPI_ENCODER(object);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(object);
-  if (VAAPI_ENC_NULL != encoder_prv->state) {
+  GstVaapiEncoderPrivate *priv = encoder->priv;
+  if (VAAPI_ENC_NULL != priv->state) {
     gst_vaapi_encoder_uninitialize(encoder);
   }
 
-  if (encoder_prv->context) {
-    g_object_unref(encoder_prv->context);
-    encoder_prv->context = NULL;
+  if (priv->context) {
+    g_object_unref(priv->context);
+    priv->context = NULL;
   }
 
-  if (encoder_prv->display) {
-    g_object_unref(encoder_prv->display);
-    encoder_prv->display = NULL;
+  if (priv->display) {
+    g_object_unref(priv->display);
+    priv->display = NULL;
   }
 
   G_OBJECT_CLASS (gst_vaapi_encoder_parent_class)->finalize (object);
@@ -95,42 +99,42 @@ gst_vaapi_encoder_finalize(GObject *object)
 gboolean
 gst_vaapi_encoder_set_display(GstVaapiEncoder* encoder, GstVaapiDisplay *display)
 {
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
-  if (display == encoder_prv->display) {
+  GstVaapiEncoderPrivate *priv = encoder->priv;
+  if (display == priv->display) {
     return TRUE;
   }
 
-  if (VAAPI_ENC_INIT < encoder_prv->state) {
+  if (VAAPI_ENC_INIT < priv->state) {
     return FALSE;
   }
-  if (encoder_prv->display) {
-    g_object_unref(encoder_prv->display);
-    encoder_prv->display = NULL;
+  if (priv->display) {
+    g_object_unref(priv->display);
+    priv->display = NULL;
   }
-  encoder_prv->display = g_object_ref(display);
+  priv->display = g_object_ref(display);
   return TRUE;
 }
 
 GstVaapiDisplay *
 gst_vaapi_encoder_get_display(GstVaapiEncoder* encoder)
 {
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
-  return (encoder_prv->display ? g_object_ref(encoder_prv->display) : NULL);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
+  return (priv->display ? g_object_ref(priv->display) : NULL);
 }
 
 GstVaapiContext *
 gst_vaapi_encoder_get_context(GstVaapiEncoder* encoder)
 {
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
-  return (encoder_prv->context ? g_object_ref(encoder_prv->context) : NULL);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
+  return (priv->context ? g_object_ref(priv->context) : NULL);
 }
 
 
 VAAPI_Encode_State
 gst_vaapi_encoder_get_state(GstVaapiEncoder* encoder)
 {
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
-  return encoder_prv->state;
+  GstVaapiEncoderPrivate *priv = encoder->priv;
+  return priv->state;
 }
 
 
@@ -139,56 +143,56 @@ gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
   /* check state */
-  if (VAAPI_ENC_INIT == encoder_prv->state) {
+  if (VAAPI_ENC_INIT == priv->state) {
     return ENCODER_NO_ERROR;
   }
-  ENCODER_ASSERT(VAAPI_ENC_NULL == encoder_prv->state);
-  if (VAAPI_ENC_NULL != encoder_prv->state) {
+  ENCODER_ASSERT(VAAPI_ENC_NULL == priv->state);
+  if (VAAPI_ENC_NULL != priv->state) {
     return ENCODER_STATE_ERR;
   }
 
   /* create va_dpy*/
-  if (!encoder_prv->display) {
-    encoder_prv->display = gst_vaapi_display_x11_new(NULL);
-    ENCODER_CHECK_STATUS(encoder_prv->display, ENCODER_DISPLAY_ERR, "gst_vaapi_display_x11_new failed.");
+  if (!priv->display) {
+    priv->display = gst_vaapi_display_x11_new(NULL);
+    ENCODER_CHECK_STATUS(priv->display, ENCODER_DISPLAY_ERR, "gst_vaapi_display_x11_new failed.");
   }
 
   if (encoder_class->initialize) {
-    ret = encoder_class->initialize(encoder, encoder_prv->display);
+    ret = encoder_class->initialize(encoder, priv->display);
     ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == ret, ret, "encoder <initialize> failed.");
   }
-  encoder_prv->state = VAAPI_ENC_INIT;
+  priv->state = VAAPI_ENC_INIT;
 
 end:
   return ret;
 }
 
 EncoderStatus
-gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data)
+gst_vaapi_encoder_open(GstVaapiEncoder* encoder)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
   /* check state */
-  if (VAAPI_ENC_OPENED == encoder_prv->state) {
+  if (VAAPI_ENC_OPENED == priv->state) {
     return ENCODER_NO_ERROR;
   }
-  ENCODER_ASSERT(VAAPI_ENC_INIT == encoder_prv->state);
-  if (VAAPI_ENC_INIT != encoder_prv->state) {
+  ENCODER_ASSERT(VAAPI_ENC_INIT == priv->state);
+  if (VAAPI_ENC_INIT != priv->state) {
     return ENCODER_STATE_ERR;
   }
-  ENCODER_ASSERT(!encoder_prv->context);
+  ENCODER_ASSERT(!priv->context);
 
   ENCODER_CHECK_STATUS(encoder_class->open, ENCODER_FUNC_PTR_ERR, "encoder <open> function pointer empty.");
-  ret = encoder_class->open(encoder, encoder_prv->display, private_data, &encoder_prv->context);
+  ret = encoder_class->open(encoder, priv->display, &priv->context);
   ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <open> failed.");
-  ENCODER_CHECK_STATUS(encoder_prv->context, ENCODER_CONTEXT_ERR, "encoder <open> context failed.");
+  ENCODER_CHECK_STATUS(priv->context, ENCODER_CONTEXT_ERR, "encoder <open> context failed.");
 
-  encoder_prv->state = VAAPI_ENC_OPENED;
+  priv->state = VAAPI_ENC_OPENED;
 
 end:
   return ret;
@@ -199,14 +203,14 @@ gst_vaapi_encoder_encode(GstVaapiEncoder* encoder, GstBuffer *raw_pic, GList **c
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
-  ENCODER_CHECK_STATUS(encoder_prv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <encode>.");
+  ENCODER_CHECK_STATUS(priv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <encode>.");
   ENCODER_CHECK_STATUS(encoder_class->encode, ENCODER_FUNC_PTR_ERR, "encoder <encode> function pointer empty.");
-  ret = encoder_class->encode(encoder, encoder_prv->display, encoder_prv->context, raw_pic, coded_pics);
+  ret = encoder_class->encode(encoder, priv->display, priv->context, raw_pic, coded_pics);
   ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <encode> failed.");
-  if (encoder_prv->state < VAAPI_ENC_ENCODING) {
-    encoder_prv->state = VAAPI_ENC_ENCODING;
+  if (priv->state < VAAPI_ENC_ENCODING) {
+    priv->state = VAAPI_ENC_ENCODING;
   }
 end:
   return ret;
@@ -216,9 +220,9 @@ EncoderStatus gst_vaapi_encoder_get_codec_data(GstVaapiEncoder* encoder, GstBuff
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
-  ENCODER_CHECK_STATUS(encoder_prv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <get_codec_data>.");
+  ENCODER_CHECK_STATUS(priv->state >= VAAPI_ENC_OPENED, ENCODER_STATE_ERR, "encoder was not opened before <get_codec_data>.");
   if (!encoder_class->get_codec_data) {
     *codec_data = NULL;
     ENCODER_LOG_INFO("There's no codec_data");
@@ -235,16 +239,16 @@ gst_vaapi_encoder_flush(GstVaapiEncoder* encoder, GList **coded_pics)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
-  if (encoder_prv->state < VAAPI_ENC_OPENED) {
+  if (priv->state < VAAPI_ENC_OPENED) {
     return ENCODER_STATE_ERR;
   }
   ENCODER_CHECK_STATUS(encoder_class->flush, ENCODER_FUNC_PTR_ERR, "encoder <flush> function pointer empty.");
-  ret = encoder_class->flush(encoder, encoder_prv->display, encoder_prv->context, coded_pics);
+  ret = encoder_class->flush(encoder, priv->display, priv->context, coded_pics);
   ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <flush> failed.");
-  if (encoder_prv->state > VAAPI_ENC_OPENED) {
-    encoder_prv->state = VAAPI_ENC_OPENED;
+  if (priv->state > VAAPI_ENC_OPENED) {
+    priv->state = VAAPI_ENC_OPENED;
   }
 end:
   return ret;
@@ -255,21 +259,21 @@ gst_vaapi_encoder_close(GstVaapiEncoder* encoder)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
-  if (VAAPI_ENC_INIT >= encoder_prv->state) {
+  if (VAAPI_ENC_INIT >= priv->state) {
     return ENCODER_NO_ERROR;
   }
   ENCODER_CHECK_STATUS(encoder_class->close, ENCODER_FUNC_PTR_ERR, "encoder <close> function pointers empty.");
-  ret = encoder_class->close(encoder, encoder_prv->display, encoder_prv->context);
+  ret = encoder_class->close(encoder, priv->display, priv->context);
   ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <close> failed.");
 end:
-  if (encoder_prv->context) {
-    g_object_unref(encoder_prv->context);
-    encoder_prv->context = NULL;
+  if (priv->context) {
+    g_object_unref(priv->context);
+    priv->context = NULL;
   }
 
-  encoder_prv->state = VAAPI_ENC_INIT;
+  priv->state = VAAPI_ENC_INIT;
   return ret;
 }
 
@@ -278,26 +282,26 @@ gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder)
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderClass *encoder_class = GST_VAAPI_ENCODER_GET_CLASS(encoder);
-  GstVaapiEncoderPrivate *encoder_prv = GST_VAAPI_ENCODER_GET_PRIVATE(encoder);
+  GstVaapiEncoderPrivate *priv = encoder->priv;
 
-  if (VAAPI_ENC_NULL == encoder_prv->state) {
+  if (VAAPI_ENC_NULL == priv->state) {
     return ENCODER_NO_ERROR;
   }
 
-  if (VAAPI_ENC_INIT < encoder_prv->state) {
+  if (VAAPI_ENC_INIT < priv->state) {
     ret = gst_vaapi_encoder_close(encoder);
   }
-  ENCODER_ASSERT(VAAPI_ENC_INIT == encoder_prv->state);
+  ENCODER_ASSERT(VAAPI_ENC_INIT == priv->state);
   if (encoder_class->uninitialize) {
-    ret = encoder_class->uninitialize(encoder, encoder_prv->display);
+    ret = encoder_class->uninitialize(encoder, priv->display);
     ENCODER_CHECK_STATUS(ENCODER_NO_ERROR == ret, ret, "encoder <uninitialize> failed.");
   }
 end:
-  if (encoder_prv->display) {
-    g_object_unref(encoder_prv->display);
-    encoder_prv->display = NULL;
+  if (priv->display) {
+    g_object_unref(priv->display);
+    priv->display = NULL;
   }
-  encoder_prv->state = VAAPI_ENC_NULL;
+  priv->state = VAAPI_ENC_NULL;
   return ret;
 
 }
index 530e4f7..244c3a0 100644 (file)
@@ -116,14 +116,15 @@ typedef struct _GstVaapiEncoderClass         GstVaapiEncoderClass;
 #define GST_VAAPI_ENCODER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VAAPI_ENCODER,  GstVaapiEncoderClass))
 #define GST_VAAPI_ENCODER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),GST_TYPE_VAAPI_ENCODER,  GstVaapiEncoderPrivate))
 
-#define ENCODER_DISPLAY(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->display)
-#define ENCODER_CONTEXT(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->context)
+#define ENCODER_DISPLAY(encoder) (((GstVaapiEncoder*)(encoder))->priv->display)
+#define ENCODER_CONTEXT(encoder) (((GstVaapiEncoder*)(encoder))->priv->context)
 #define ENCODER_WIDTH(encoder)   (((GstVaapiEncoder*)(encoder))->width)
 #define ENCODER_HEIGHT(encoder)  (((GstVaapiEncoder*)(encoder))->height)
 #define ENCODER_FPS(encoder)     (((GstVaapiEncoder*)(encoder))->frame_rate)
 
 struct _GstVaapiEncoder {
   GObject parent;
+  GstVaapiEncoderPrivate *priv;
 
   guint32 width;
   guint32 height;
@@ -138,7 +139,7 @@ struct _GstVaapiEncoderClass {
 
   /* context [out] */
   EncoderStatus (*open)          (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
-                                  void* private_data, GstVaapiContext **context);
+                                  GstVaapiContext **context);
 
   EncoderStatus (*close)         (GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext *context);
   /* coded_pics [out] */
@@ -173,7 +174,7 @@ VAAPI_Encode_State gst_vaapi_encoder_get_state(GstVaapiEncoder* encoder);
 EncoderStatus gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder);
 
 /* check/open context */
-EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data);
+EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder);
 
 /* encode one frame */
 EncoderStatus gst_vaapi_encoder_encode(GstVaapiEncoder* encoder, GstBuffer *raw_pic, GList **coded_pics);
index 0308ee4..c895ae9 100644 (file)
 #include <X11/Xlib.h>
 #include <gst/video/videocontext.h>
 
-#include "gst/vaapi/gstvaapivideobuffer.h"
-#include "gst/vaapi/gstvaapisurfacepool.h"
 #include "gst/vaapi/gstvaapiencode_h264.h"
 #include "gst/vaapi/gstvaapiencode_h263.h"
 #include "gst/vaapi/gstvaapiencode_mpeg4.h"
 #include "gst/vaapi/gstvaapibaseencoder.h"
-#include "gst/vaapi/gstvaapipluginutil.h"
 
-#if USE_VAAPI_GLX
-#include <gst/vaapi/gstvaapivideobuffer_glx.h>
-#define gst_vaapi_video_buffer_new(display) \
-    gst_vaapi_video_buffer_glx_new(GST_VAAPI_DISPLAY_GLX(display))
-#endif
+#include "gstvaapipluginutil.h"
+#include "gstvaapipluginbuffer.h"
+
 
 /* gst_debug
      GST_DEBUG_CATEGORY_STATIC (gst_vaapi_encode_debug)
@@ -263,6 +258,14 @@ gst_vaapi_encode_get_property (GObject * object, guint prop_id,
   }
 }
 
+static inline gboolean
+gst_vaapi_encode_ensure_display(GstVaapiEncode *encode)
+{
+    return gst_vaapi_ensure_display(encode, GST_VAAPI_DISPLAY_TYPE_ANY,
+        &ENCODER_DISPLAY(encode->encoder));
+}
+
+
 static gboolean
 gst_vaapi_encode_set_caps(GstPad *sink_pad, GstCaps *caps)
 {
@@ -317,12 +320,12 @@ gst_vaapi_encode_set_caps(GstPad *sink_pad, GstCaps *caps)
   }
 
   /*set display and initialize encoder*/
-  ENCODER_CHECK_STATUS(gst_vaapi_ensure_display(encode, &ENCODER_DISPLAY(encode->encoder)),
+  ENCODER_CHECK_STATUS(gst_vaapi_encode_ensure_display(encode),
                          FALSE, "encoder ensure display failed on setting caps.")
   encoder_ret = gst_vaapi_encoder_initialize(encode->encoder);
   ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == encoder_ret,
                          FALSE, "gst_vaapi_encoder_initialize failed.");
-  encoder_ret = gst_vaapi_encoder_open(encode->encoder, NULL);
+  encoder_ret = gst_vaapi_encoder_open(encode->encoder);
   ENCODER_CHECK_STATUS (ENCODER_NO_ERROR == encoder_ret,
                          FALSE, "gst_vaapi_encoder_open failed.");
 end:
@@ -445,10 +448,10 @@ gst_vaapi_encode_buffer_alloc(GstPad * pad, guint64 offset, guint size,
   }
   if (!structure || gst_structure_has_name(structure, "video/x-vaapi-surface")) {
     ENCODER_ASSERT(encode->encoder);
-    ENCODER_CHECK_STATUS(gst_vaapi_ensure_display(encode, &ENCODER_DISPLAY(encode->encoder)),
+    ENCODER_CHECK_STATUS(gst_vaapi_encode_ensure_display(encode),
                          GST_FLOW_ERROR, "encoder ensure display failed.")
     display = ENCODER_DISPLAY(encode->encoder);
-    buffer = gst_vaapi_video_buffer_new(display);
+    buffer = (GstBuffer*)gst_vaapi_video_buffer_new(display);
   } else { /* video/x-raw-yuv */
     buffer = gst_buffer_new_and_alloc(size);
   }