encoder: simplify gst_vaapi_encoder buffer ref_count
authorWind Yuan <feng.yuan@intel.com>
Wed, 9 Jan 2013 02:02:11 +0000 (10:02 +0800)
committerWind Yuan <feng.yuan@intel.com>
Fri, 22 Mar 2013 01:59:17 +0000 (09:59 +0800)
Prepare for other buffer types support, make buffer check simple

gst-libs/gst/vaapi/gstvaapibaseencoder.c
gst-libs/gst/vaapi/gstvaapibaseencoder.h
gst-libs/gst/vaapi/gstvaapiencoder.c
gst-libs/gst/vaapi/gstvaapiencoder_h264.c
gst/vaapi/gstvaapiencode.c

index a35dbdd..9ea0502 100644 (file)
@@ -686,10 +686,21 @@ end:
   return ret;
 }
 
+static GstVaapiVideoBuffer *
+_get_video_buffer(
+    GstVaapiBaseEncoder* encoder,
+    GstBuffer *buf
+)
+{
+  if (GST_VAAPI_IS_VIDEO_BUFFER(buf))
+    return GST_VAAPI_VIDEO_BUFFER(buf);
+  return NULL;
+}
+
 static EncoderStatus
 gst_vaapi_base_encoder_encode_default(
     GstVaapiEncoder* base,
-    GstBuffer *raw_pic
+    GstBuffer *pic
 )
 {
   GstVaapiBaseEncoder* encoder = GST_VAAPI_BASE_ENCODER(base);
@@ -702,44 +713,40 @@ gst_vaapi_base_encoder_encode_default(
   gboolean is_key = FALSE;
   VABufferID* coded_buf = NULL;
   GstVaapiSurface *buffer_surface = NULL;
+  gboolean is_prepared_buffer = FALSE;
 
   ENCODER_ASSERT(display && context);
 
   /* Video Buffer */
   GstVaapiVideoBuffer *video_buffer = NULL;
 
-  ENCODER_CHECK_STATUS(raw_pic || base_class->prepare_next_input_buffer,
+  ENCODER_CHECK_STATUS(pic || base_class->prepare_next_input_buffer,
                        ENCODER_DATA_ERR,
                        "Need a picture to encode");
-  if (raw_pic) {
-    /* load picture to surface */
-    if (GST_VAAPI_IS_VIDEO_BUFFER(raw_pic)) {
-      video_buffer = GST_VAAPI_VIDEO_BUFFER(raw_pic);
-      gst_buffer_ref(GST_BUFFER_CAST(video_buffer));
-    } else {
-        /* do something else */
-    }
-  } else {
+  if (!pic)
     priv->need_flush = TRUE;
-  }
 
 again:
   if (base_class->prepare_next_input_buffer) {
-    GstVaapiVideoBuffer* tmp_buf = NULL;
+    GstBuffer* tmp_buf = NULL;
     ret = base_class->prepare_next_input_buffer(encoder,
-                                                video_buffer,
+                                                pic,
                                                 priv->need_flush,
                                                 &tmp_buf);
     priv->need_flush = FALSE;
-    if (video_buffer) {
-      gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
-      video_buffer = NULL;
-    }
     if (ret != ENCODER_NO_ERROR || !tmp_buf)
       goto end;
-    video_buffer = tmp_buf;
+
+    is_prepared_buffer = TRUE;
+    pic = tmp_buf;
   }
 
+  video_buffer = _get_video_buffer(encoder, pic);
+  ENCODER_CHECK_STATUS(
+      video_buffer,
+      ENCODER_SURFACE_ERR,
+      "vaapi encoder doesn't has video buffer");
+
   buffer_surface = gst_vaapi_video_buffer_get_surface(video_buffer);
 
   while ((coded_buf = pop_idle_buffer_id(encoder)) == NULL) {
@@ -773,18 +780,17 @@ again:
   /* Push coded buffer to another task */
   GstVaapiEncoderBufferInfo* info = gst_vaapi_encoder_buffer_info_new(encoder);
   info->id = coded_buf;
-  info->timestamp = GST_BUFFER_TIMESTAMP(video_buffer);
-  info->duration = GST_BUFFER_DURATION(video_buffer);
+  info->timestamp = GST_BUFFER_TIMESTAMP(pic);
+  info->duration = GST_BUFFER_DURATION(pic);
   info->is_key = is_key;
   push_busy_buffer_info(encoder, info);
 
   priv->frame_count++;
 
-  if (base_class->prepare_next_input_buffer) {
-    if (video_buffer) {
-      gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
-    }
-    video_buffer = NULL;
+  if (is_prepared_buffer) {
+    if (pic)
+      gst_buffer_unref(pic);
+    pic = NULL;
     buffer_surface = NULL;
     coded_buf = NULL;
     goto again;
@@ -794,10 +800,9 @@ end:
   if (ret < ENCODER_NO_ERROR && base_class->encode_frame_failed) {
     base_class->encode_frame_failed(encoder, video_buffer);
   }
-  if (video_buffer) {
-    gst_buffer_unref(GST_BUFFER_CAST(video_buffer));
-    video_buffer = NULL;
-  }
+  if (pic && is_prepared_buffer)
+    gst_buffer_unref(pic);
+
   return ret;
 }
 
index 2b132ce..bb90b91 100644 (file)
@@ -86,9 +86,9 @@ struct _GstVaapiBaseEncoderClass {
 
   /* in <encode> function */
   EncoderStatus (*prepare_next_input_buffer)(GstVaapiBaseEncoder* encoder,
-                                             GstVaapiVideoBuffer *display_buf,
+                                             GstBuffer *display_buf,
                                              gboolean need_flush,
-                                             GstVaapiVideoBuffer **out_buf);
+                                             GstBuffer **out_buf);
 
   EncoderStatus (*render_frame)     (GstVaapiBaseEncoder *encoder,
                                      GstVaapiSurface *surface,
index 43fc19c..af2dd76 100644 (file)
@@ -104,8 +104,8 @@ gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder)
     ENCODER_CHECK_STATUS(priv->display,
                          ENCODER_DISPLAY_ERR,
                          "gst_vaapi_display_x11_new failed.");
-    priv->va_display = gst_vaapi_display_get_display(priv->display);
   }
+  priv->va_display = gst_vaapi_display_get_display(priv->display);
 
   if (encoder_class->initialize) {
     ret = encoder_class->initialize(encoder);
index a666aa4..b98ff47 100644 (file)
@@ -510,15 +510,15 @@ gst_vaapi_encoder_h264_frame_failed(
 static EncoderStatus
 gst_vaapi_encoder_h264_prepare_next_buffer(
     GstVaapiBaseEncoder* base,
-    GstVaapiVideoBuffer *display_buf,
+    GstBuffer *display_buf,
     gboolean need_flush,
-    GstVaapiVideoBuffer **out_buf
+    GstBuffer **out_buf
 )
 {
   EncoderStatus ret = ENCODER_NO_ERROR;
   GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
   GstVaapiEncoderH264Private *priv = encoder->priv;
-  GstVaapiVideoBuffer  *return_buf = NULL;
+  GstBuffer  *return_buf = NULL;
   //guint64 pts = 0;
 
   if (NULL == display_buf && g_queue_is_empty(priv->queued_buffers)) {
@@ -561,12 +561,12 @@ gst_vaapi_encoder_h264_prepare_next_buffer(
     return_buf = display_buf;
   } else {
     if (need_flush) {
-      return_buf = (GstVaapiVideoBuffer*)g_queue_pop_tail(priv->queued_buffers);
+      return_buf = (GstBuffer*)g_queue_pop_tail(priv->queued_buffers);
       priv->cur_slice_type = SLICE_TYPE_P;
       priv->cur_display_num = priv->gop_count - 1;
       ++priv->cur_decode_num;
     } else {
-      return_buf = (GstVaapiVideoBuffer*)g_queue_pop_head(priv->queued_buffers);
+      return_buf = (GstBuffer*)g_queue_pop_head(priv->queued_buffers);
       priv->cur_slice_type = SLICE_TYPE_B;
       priv->cur_display_num =
         priv->gop_count - 2 - g_queue_get_length(priv->queued_buffers);
index e6829e6..ae72fe0 100644 (file)
@@ -190,13 +190,12 @@ gst_vaapi_encode_buffer_loop(GstVaapiEncode *encode)
       gst_vaapi_encoder_get_encoded_buffer(
           encode->encoder,
           &buf);
-  if (encoder_ret != ENCODER_NO_ERROR) {
+  if (encoder_ret < ENCODER_NO_ERROR) {
     ENCODER_LOG_ERROR("get encoded buffer failed");
     return;
   }
   GST_VAAPI_ENCODE_IDLE_BUF_SIGNAL(encode);
 
-  ENCODER_ASSERT(buf);
   if (!buf)
     return;