support raw-buffer directly converted to surface in vaapiconvert
authorWind Yuan <feng.yuan@intel.com>
Thu, 24 Nov 2011 08:35:09 +0000 (03:35 -0500)
committerZhong Cong <congx.zhong@intel.com>
Tue, 5 Feb 2013 07:37:09 +0000 (15:37 +0800)
gst-libs/gst/vaapi/gstvaapiimage.c
gst-libs/gst/vaapi/gstvaapiimage.h
gst/vaapi/gstvaapiupload.c
gst/vaapiencode/gstvaapibaseencoder.c
gst/vaapiencode/gstvaapih264encode.c
gst/vaapiencode/gstvaapih264encoder.c

index 65d79a5..9d4c1a7 100644 (file)
@@ -1303,3 +1303,49 @@ gst_vaapi_image_update_from_raw(
 
     return success;
 }
+
+gboolean
+gst_vaapi_convert_buffer_to_image(
+    GstVaapiImage *image,
+    GstBuffer *inbuf) // inbuf : I420
+{
+  GstVaapiImagePrivate *priv;
+  guint width, height;
+  guint row, column;
+  GstVaapiImageFormat format;
+  guint8 *y_src, *u_src, *v_src;
+  guint8 *y_dest, *u_dest, *v_dest;
+
+  priv = image->priv;
+  gst_vaapi_image_get_size(image, &width, &height);
+  format = gst_vaapi_image_get_format(image);
+  gst_vaapi_image_map(image);
+
+  y_src = GST_BUFFER_DATA(inbuf);
+  u_src = y_src + width*height;
+  v_src = u_src + (width/2)*(height/2);
+
+  y_dest = priv->image_data + priv->image.offsets[0];
+  u_dest = priv->image_data + priv->image.offsets[1];
+  v_dest = priv->image_data + priv->image.offsets[2];
+
+  if (format == GST_VAAPI_IMAGE_NV12) {
+    for (row = 0; row < height; row++) {
+      memcpy(y_dest, y_src, width);
+      y_src += width;
+      y_dest += priv->image.pitches[0];
+    }
+    for (row = 0; row < height/2; row++) {
+      for (column = 0; column < width/2; column++) {
+        u_dest[column*2] = u_src[column];
+        u_dest[column*2+1] = v_src[column];
+      }
+      u_src += width/2;
+      v_src += width/2;
+      u_dest += priv->image.pitches[1];
+    }
+  }
+  gst_vaapi_image_unmap(image);
+  return TRUE;
+}
+
index d0c3cf3..0c1e477 100644 (file)
@@ -204,6 +204,10 @@ gst_vaapi_image_update_from_raw(
     GstVaapiRectangle *rect
 );
 
+gboolean
+gst_vaapi_convert_buffer_to_image(GstVaapiImage *image, GstBuffer *buffer);
+
+
 G_END_DECLS
 
 #endif /* GST_VAAPI_IMAGE_H */
index 88b43a5..7863bf9 100644 (file)
@@ -619,12 +619,11 @@ gst_vaapiupload_negotiate_buffers(
     if (!gst_vaapiupload_ensure_surface_pool(upload, outcaps))
         return FALSE;
 
-    gst_vaapiupload_ensure_direct_rendering_caps(upload, incaps);
+    if (convert->direct_rendering)
+        gst_vaapiupload_ensure_direct_rendering_caps(upload, incaps);
     dr = MIN(upload->direct_rendering, upload->direct_rendering_caps);
     if (upload->direct_rendering != dr) {
         upload->direct_rendering = dr;
-        GST_DEBUG("direct-rendering level: %d", dr);
-    }
     return TRUE;
 }
 
index f04a084..93ab55f 100644 (file)
@@ -521,7 +521,7 @@ gst_vaapi_base_encoder_encode_default(GstVaapiEncoder* encoder, GstVaapiDisplay
       GST_BUFFER_TIMESTAMP(video_buffer) = GST_BUFFER_TIMESTAMP(raw_pic);
       GST_BUFFER_DURATION(video_buffer) = GST_BUFFER_DURATION(raw_pic);
     }
-  }else {
+  } else {
     base_prv->need_flush = TRUE;
   }
 
@@ -746,7 +746,7 @@ base_query_encoding_status(GstVaapiBaseEncoder *base_encoder,
   VASurfaceID surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(buffer_surface);
   VADisplay va_dpy = gst_vaapi_display_get_display(display);
 
-  ENCODER_ASSERT(coded_pics && *coded_pics == NULL);
+  ENCODER_ASSERT(coded_pics);
   VAAPI_UNUSED_ARG(has_coded_data);
 
   /* lock display */
index 69b9989..d90e3c4 100644 (file)
@@ -61,6 +61,7 @@ enum {
     H264_PROP_INIT_QP,
     H264_PROP_MIN_QP,
     H264_PROP_SLICE_NUM,
+    H264_PROP_B_FRAME_NUM,
 };
 
 
@@ -154,6 +155,14 @@ gst_h264encode_class_init(GstH264EncodeClass *klass)
               200,
               1,
               G_PARAM_READWRITE));
+    g_object_class_install_property (object_class, H264_PROP_B_FRAME_NUM,
+          g_param_spec_uint ("b-frame-num",
+              "B frams num",
+              "B frams num",
+              0,
+              10,
+              0,
+              G_PARAM_READWRITE));
 
 }
 
@@ -227,6 +236,11 @@ gst_h264encode_set_property(GObject *object, guint prop_id,
     }
       break;
 
+    case H264_PROP_B_FRAME_NUM: {
+      h264encoder->b_frame_num= g_value_get_uint(value);
+    }
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -270,6 +284,10 @@ gst_h264encode_get_property (GObject * object, guint prop_id,
       g_value_set_uint (value, h264encoder->slice_num);
       break;
 
+    case H264_PROP_B_FRAME_NUM:
+      g_value_set_uint (value, h264encoder->b_frame_num);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
index 4d7a039..c49d40a 100644 (file)
@@ -680,8 +680,7 @@ gst_h264_encoder_prepare_next_buffer(GstVaapiBaseEncoder* encoder,
   GstH264EncoderPrivate *h264_prv = GST_H264_ENCODER_GET_PRIVATE(h264_encoder);
   GstVaapiVideoBuffer  *return_buf = NULL;
   GstVaapiVideoBuffer  *tmp_next_buf = NULL;
-  guint64 pts = 0;
-  guint32 cts = 0;
+  //guint64 pts = 0;
 
   if (NULL == display_buf && g_queue_is_empty(h264_prv->queued_buffers)) {
     ret = ENCODER_BUFFER_EMPTY;
@@ -736,6 +735,7 @@ gst_h264_encoder_prepare_next_buffer(GstVaapiBaseEncoder* encoder,
 end:
   *out_buf = return_buf;
   /* calculate cts/pts/dts */
+#if 0
   if (return_buf) {
     pts = GST_BUFFER_TIMESTAMP(return_buf);
     tmp_next_buf = (GstVaapiVideoBuffer*)g_queue_peek_head(h264_prv->queued_buffers);
@@ -744,13 +744,17 @@ end:
     } else if (SLICE_TYPE_B == h264_prv->cur_slice_type) {
       GST_BUFFER_TIMESTAMP(return_buf) = h264_prv->last_decode_time;
     }
-    cts = (pts + h264_prv->default_cts_offset - GST_BUFFER_TIMESTAMP(return_buf));
-    ENCODER_ASSERT(cts < 0x80000000);
-    if (cts > 0x80000000) {
-      cts = 0;
+
+    pts += h264_prv->default_cts_offset;
+    if ((gint64)(pts - GST_BUFFER_TIMESTAMP(return_buf)) < 0) {
+      pts = GST_BUFFER_TIMESTAMP(return_buf);
     }
-    GST_BUFFER_OFFSET_END(return_buf) = cts;
+
+    GST_BUFFER_OFFSET_END(return_buf) = pts;
+    GST_BUFFER_TIMESTAMP(return_buf) = pts;
   }
+#endif
+
   return ret;
 }
 
@@ -1048,6 +1052,14 @@ h264_recreate_pic_param(GstH264Encoder *h264_encoder,
   pic_h264.pic_fields.bits.transform_8x8_mode_flag = 1;
   pic_h264.pic_fields.bits.deblocking_filter_control_present_flag = 1;
 
+  char *frame_type = "I";
+  if (h264_prv->cur_slice_type == SLICE_TYPE_P)
+    frame_type = "P";
+  if (h264_prv->cur_slice_type == SLICE_TYPE_B)
+    frame_type = "B";
+  ENCODER_LOG_INFO("type:%s, frame_num:%d, display_num:%d\n",
+         frame_type, pic_h264.frame_num, pic_h264.CurrPic.TopFieldOrderCnt);
+
   if (VA_INVALID_ID != h264_prv->pic_parameter) { /* share the same pic_parameter*/
     vaDestroyBuffer(va_dpy, h264_prv->pic_parameter);
     h264_prv->pic_parameter = VA_INVALID_ID;