waylandsink : support making flush buffer by using MMVideoBuffer of last buffer
authorHyunil <hyunil46.park@samsung.com>
Fri, 13 Jan 2017 11:12:01 +0000 (20:12 +0900)
committerHyunil <hyunil46.park@samsung.com>
Mon, 16 Jan 2017 07:53:19 +0000 (16:53 +0900)
Sometimes, there is no video data when flush request is set, we need to use last buffer

Change-Id: I786c298b7096ff55ed6c4c21612347139b54484b
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
ext/wayland/gstwaylandsink.c

index 060400c..221eda3 100755 (executable)
@@ -705,13 +705,41 @@ gst_wayland_sink_add_mm_video_buf_info (GstWlDisplay * display,
   }
 }
 
+static MMVideoBuffer *
+gst_wayland_sink_get_mm_video_buf (GstBuffer * buffer)
+{
+  GstMemory *mem;
+  GstMapInfo mem_info = GST_MAP_INFO_INIT;
+  MMVideoBuffer *mm_video_buf = NULL;
+
+  g_return_val_if_fail (buffer != NULL, NULL);
+  FUNCTION;
+
+  mem = gst_buffer_peek_memory (buffer, 1);
+  gst_memory_map (mem, &mem_info, GST_MAP_READ);
+  mm_video_buf = (MMVideoBuffer *) mem_info.data;
+  gst_memory_unmap (mem, &mem_info);
+
+  if (mm_video_buf == NULL) {
+    GST_WARNING ("mm_video_buf of gstbuffer(@%p) is NULL.", buffer);
+    return NULL;
+  }
+
+  if (mm_video_buf->type != MM_VIDEO_BUFFER_TYPE_TBM_BO) {
+    GST_ERROR ("Buffer type is not TBM");
+    return NULL;
+  }
+  GST_DEBUG ("TBM bo %p %p", mm_video_buf->handle.bo[0],
+      mm_video_buf->handle.bo[1]);
+
+  return mm_video_buf;
+}
+
 static int
 gst_wayland_sink_get_mm_video_buf_info (GstWaylandSink * sink,
     GstBuffer * buffer)
 {
   GstWlDisplay *display;
-  GstMemory *mem;
-  GstMapInfo mem_info = GST_MAP_INFO_INIT;
   MMVideoBuffer *mm_video_buf = NULL;
 
   g_return_val_if_fail (sink != NULL, FALSE);
@@ -721,38 +749,35 @@ gst_wayland_sink_get_mm_video_buf_info (GstWaylandSink * sink,
   display = sink->display;
   g_return_val_if_fail (sink->display != NULL, FALSE);
 
-  mem = gst_buffer_peek_memory (buffer, 1);
-  gst_memory_map (mem, &mem_info, GST_MAP_READ);
-  mm_video_buf = (MMVideoBuffer *) mem_info.data;
-  gst_memory_unmap (mem, &mem_info);
+  /* get MMVideoBuffer from buffer */
+  mm_video_buf = gst_wayland_sink_get_mm_video_buf (buffer);
+  g_return_val_if_fail (mm_video_buf != NULL, FALSE);
 
-  if (mm_video_buf == NULL) {
-    GST_WARNING ("mm_video_buf is NULL. Skip rendering");
-    return FALSE;
-  }
   /* assign mm_video_buf info */
-  if (mm_video_buf->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
-    GST_DEBUG ("TBM bo %p %p", mm_video_buf->handle.bo[0],
-        mm_video_buf->handle.bo[1]);
-    display->native_video_size = 0;
-    display->flush_request = 0;
-    display->flush_request = mm_video_buf->flush_request;
-    GST_DEBUG ("flush_request value is %d", display->flush_request);
+  display->native_video_size = 0;
+  display->flush_request = 0;
+  display->flush_request = mm_video_buf->flush_request;
+  GST_DEBUG ("flush_request value is %d", display->flush_request);
 #ifdef USE_WL_FLUSH_BUFFER
-    if (gst_wayland_sink_need_to_make_flush_buffer (sink)) {
-      if (!gst_wayland_sink_copy_mm_video_buf_info_to_flush (display,
-              mm_video_buf)) {
-        GST_ERROR ("cat not copy mm_video_buf info to flush");
-        return FALSE;
-      }
-    } else
+  if (gst_wayland_sink_need_to_make_flush_buffer (sink)) {
+    /* Sometimes there isn't video data in MMVideoBuffer from buffer
+       when flush_request is true */
+    if (mm_video_buf->flush_request && !mm_video_buf->size[0]
+        && sink->last_buffer) {
+      /* get MMVideoBuffer from last buffer */
+      mm_video_buf = gst_wayland_sink_get_mm_video_buf (sink->last_buffer);
+      g_return_val_if_fail (mm_video_buf != NULL, FALSE);
+    }
+    if (!gst_wayland_sink_copy_mm_video_buf_info_to_flush (display,
+            mm_video_buf)) {
+      GST_ERROR ("cat not copy mm_video_buf info to flush");
+      return FALSE;
+    }
+  } else
 #endif
-      /* normal routine */
-      gst_wayland_sink_add_mm_video_buf_info (display, mm_video_buf);
-  } else {
-    GST_ERROR ("Buffer type is not TBM");
-    return FALSE;
-  }
+    /* normal routine */
+    gst_wayland_sink_add_mm_video_buf_info (display, mm_video_buf);
+
   return TRUE;
 }