encoder: h264 support multiple slices
authorWind Yuan <feng.yuan@intel.com>
Thu, 1 Nov 2012 07:27:32 +0000 (15:27 +0800)
committerZhong Cong <congx.zhong@intel.com>
Tue, 5 Feb 2013 07:37:12 +0000 (15:37 +0800)
gst-libs/gst/vaapi/gstvaapibaseencoder.c

index 56240cd..e491d86 100644 (file)
@@ -379,6 +379,7 @@ base_query_encoding_status(
   ENCODER_RELEASE_DISPLAY_LOCK(display);
 
   while (buf_list != NULL) {
+      GstBuffer *new_data = NULL;
       if (priv->frame_notify_flag && base_class->notify_frame) {
         base_class->notify_frame(base_encoder,
                                  buf_list->buf,
@@ -386,18 +387,28 @@ base_query_encoding_status(
       }
 
       if (base_class->copy_coded_frame) {
-        ret_buffer = base_class->copy_coded_frame(
+        new_data = base_class->copy_coded_frame(
             base_encoder,
             buf_list->buf,
             buf_list->size,
             coded_buf);
       } else {
-        ret_buffer = gst_vaapi_base_encoder_copy_buffer_default(
+        new_data = gst_vaapi_base_encoder_copy_buffer_default(
             base_encoder,
             buf_list->buf,
             buf_list->size,
             coded_buf);
       }
+
+      if (!ret_buffer)
+        ret_buffer = new_data;
+      else if (new_data)
+        ret_buffer = gst_buffer_join(ret_buffer, new_data);
+      buf_list = (VACodedBufferSegment*)buf_list->next;
+      has_coded_data = TRUE;
+  }
+
+  if (ret_buffer) {
       GST_BUFFER_TIMESTAMP(ret_buffer) = GST_BUFFER_TIMESTAMP(surface_buffer);
       GST_BUFFER_DURATION(ret_buffer) = GST_BUFFER_DURATION(surface_buffer);
       if (!is_key) {
@@ -406,11 +417,8 @@ base_query_encoding_status(
       GST_BUFFER_OFFSET_END(ret_buffer) =
           GST_BUFFER_OFFSET_END(surface_buffer);
       *coded_pics = g_list_append(*coded_pics, ret_buffer);
-      buf_list = (VACodedBufferSegment*)buf_list->next;
-      ENCODER_ASSERT(NULL == buf_list);
-      has_coded_data = TRUE;
-      FPS_CALCULATION(vaapiencode);
   }
+  FPS_CALCULATION(vaapiencode);
 
 #if SHARE_CODED_BUF
   if (!has_coded_data)