}
}
+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);
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;
}