videoconvert: Support I420 to SN12 converting on exynos target 49/223149/2 accepted/tizen/unified/20200130.214736 submit/tizen/20200128.053924 submit/tizen/20200130.052510
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 23 Jan 2020 09:18:14 +0000 (18:18 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 28 Jan 2020 01:58:48 +0000 (10:58 +0900)
[Version] 1.12.2-7
[Profile] Common
[Issue Type] Improvement

Change-Id: If23c5c4d51a018b7bc6446e9584940a87ed26edb
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
gst-libs/gst/allocators/gsttizenmemory.c
gst-libs/gst/allocators/gsttizenmemory.h
gst-libs/gst/video/video-converter.c
packaging/gst-plugins-base.spec

index 16d6b64..d85fdba 100644 (file)
@@ -99,6 +99,7 @@ _tizen_video_mem_new (GstAllocator * allocator, GstMemory * parent, GstVideoInfo
   for (i = 0; i < sinfo.num_planes; i++) {
     GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i) = sinfo.planes[i].stride;
     GST_VIDEO_INFO_PLANE_OFFSET (vinfo, i) = sinfo.planes[i].offset;
+    GST_DEBUG ("tbm surface plane[%d] %p", i, sinfo.planes[i].ptr);
   }
   GST_VIDEO_INFO_SIZE (vinfo) = sinfo.size;
 
@@ -419,39 +420,101 @@ gboolean
 gst_tizen_video_memory_map (GstVideoMeta * meta, guint plane, GstMapInfo * info,
     gpointer * data, gint * stride, GstMapFlags flags)
 {
-  gint err;
-  tbm_surface_info_s surface_info;
+  int tbm_ret = TBM_SURFACE_ERROR_NONE;
+  gboolean mapped = FALSE;
   GstBuffer *buffer = meta->buffer;
   GstTizenMemory *vmem =
       (GstTizenMemory *) gst_buffer_get_memory (buffer, 0);
 
   g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (((GstMemory *) vmem)->allocator), FALSE);
 
-  err = tbm_surface_map (vmem->surface, TBM_SURF_OPTION_WRITE|TBM_SURF_OPTION_READ, &surface_info);
-  if (err == TBM_SURFACE_ERROR_NONE) {
-    if (surface_info.num_planes > plane) {
-      *data = surface_info.planes[plane].ptr;
-      *stride = surface_info.planes[plane].stride;
-      GST_DEBUG ("_video_memory_map -> plane : %d, data : %p, stride : %d",
-          plane, *data, *stride);
-    } else {
-      GST_ERROR_OBJECT (meta, "invalid format");
-      return FALSE;
+  g_mutex_lock (&vmem->lock);
+
+  if (vmem->video_memory_map[plane]) {
+    GST_ERROR ("plane [%d] is already mapped", plane);
+    goto _VIDEO_MEMORY_MAP_DONE;
+  }
+
+  if (vmem->video_memory_map_count == 0) {
+    tbm_ret = tbm_surface_map (vmem->surface,
+      TBM_SURF_OPTION_WRITE | TBM_SURF_OPTION_READ,
+      &vmem->surface_info);
+    if (tbm_ret != TBM_SURFACE_ERROR_NONE) {
+      GST_ERROR ("tbm_surface_map for %p failed, 0x%x", vmem->surface, tbm_ret);
+      goto _VIDEO_MEMORY_MAP_DONE;
+    }
+  }
+
+  if (plane >= vmem->surface_info.num_planes) {
+    GST_ERROR ("invalid plane index %d (num plane %d)",
+      plane, vmem->surface_info.num_planes);
+
+    if (vmem->video_memory_map_count == 0) {
+      GST_ERROR ("unmap surface %p", vmem->surface);
+      tbm_surface_unmap (vmem->surface);
     }
+
+    goto _VIDEO_MEMORY_MAP_DONE;
   }
-  return TRUE;
+
+  *data = vmem->surface_info.planes[plane].ptr;
+  *stride = vmem->surface_info.planes[plane].stride;
+
+  GST_DEBUG ("mapped plane : %d, data : %p, stride : %d",
+      plane, *data, *stride);
+
+  vmem->video_memory_map[plane] = TRUE;
+  vmem->video_memory_map_count++;
+
+  mapped = TRUE;
+
+_VIDEO_MEMORY_MAP_DONE:
+  g_mutex_unlock (&vmem->lock);
+
+  return mapped;
 }
 
 gboolean
 gst_tizen_video_memory_unmap (GstVideoMeta * meta, guint plane, GstMapInfo * info)
 {
+  int tbm_ret = TBM_SURFACE_ERROR_NONE;
+  gboolean unmapped = FALSE;
   GstBuffer *buffer = meta->buffer;
   GstTizenMemory *vmem =
       (GstTizenMemory *) gst_buffer_get_memory (buffer, 0);
 
   g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (((GstMemory *) vmem)->allocator), FALSE);
 
-  tbm_surface_unmap (vmem->surface);
-  GST_DEBUG ("_video_memory_unmap -> plane : %d", plane);
-  return TRUE;
+  g_mutex_lock (&vmem->lock);
+
+  if (vmem->video_memory_map[plane] == FALSE) {
+    GST_ERROR ("plane [%d] is already unmapped", plane);
+    goto _VIDEO_MEMORY_UNMAP_DONE;
+  }
+
+  if (vmem->video_memory_map_count - 1 > 0) {
+    GST_DEBUG ("[plane %d] skip unmap surface %p", plane, vmem->surface);
+    unmapped = TRUE;
+    goto _VIDEO_MEMORY_UNMAP_DONE;
+  }
+
+  tbm_ret = tbm_surface_unmap (vmem->surface);
+  if (tbm_ret != TBM_SURFACE_ERROR_NONE) {
+    GST_ERROR ("tbm_surface_unmap %p failed, 0x%x", vmem->surface, tbm_ret);
+    goto _VIDEO_MEMORY_UNMAP_DONE;
+  }
+
+  unmapped = TRUE;
+
+  GST_DEBUG ("[plane %d] unmap surface %p done", plane, vmem->surface);
+
+_VIDEO_MEMORY_UNMAP_DONE:
+  if (unmapped == TRUE) {
+    vmem->video_memory_map[plane] = FALSE;
+    vmem->video_memory_map_count--;
+  }
+
+  g_mutex_unlock (&vmem->lock);
+
+  return unmapped;
 }
index 095b428..5a08337 100644 (file)
@@ -53,10 +53,13 @@ struct _GstTizenMemory
   GstMemory                 mem;
 
   tbm_surface_h             surface;
+  tbm_surface_info_s        surface_info;
   GstVideoInfo              *info;
 
   /* <protected> */
   GMutex                    lock;
+  gboolean                  video_memory_map[GST_VIDEO_MAX_PLANES];
+  gint                      video_memory_map_count;
 
   /* <private> */
   GDestroyNotify            notify;
index a01c493..4aa97d4 100644 (file)
@@ -5803,6 +5803,8 @@ convert_I420_SN12 (GstVideoConverter * convert, const GstVideoFrame * src,
   mY = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
   mUV = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
 
+  GST_DEBUG_OBJECT (convert, "%dx%d, Y %p, UV %p", width, height, mY, mUV);
+
   for (i = 0; i < GST_ROUND_DOWN_2 (height); i += 2) {
     GET_LINE_OFFSETS (interlaced, i, l1, l2);
 
index 9e9b680..a20f10e 100644 (file)
@@ -5,7 +5,7 @@
 
 Name:           gst-plugins-base
 Version:        1.12.2
-Release:        6
+Release:        7
 License:        LGPL-2.0+
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 Url:            http://gstreamer.freedesktop.org/