support B frames
authorWind Yuan <feng.yuan@intel.com>
Mon, 28 Nov 2011 06:17:52 +0000 (01:17 -0500)
committerZhong Cong <congx.zhong@intel.com>
Tue, 5 Feb 2013 07:37:11 +0000 (15:37 +0800)
gst/vaapiencode/gstvaapih264encoder.c

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;