waylandsink : Add video dump properties for debugging 31/111231/2 accepted/tizen/common/20170206.124347 accepted/tizen/common/20170210.170625 accepted/tizen/ivi/20170214.010741 accepted/tizen/mobile/20170214.010522 accepted/tizen/tv/20170214.010625 accepted/tizen/wearable/20170214.010703 submit/tizen/20170206.043356 submit/tizen/20170210.083202
authorHyunil <hyunil46.park@samsung.com>
Fri, 20 Jan 2017 03:16:05 +0000 (12:16 +0900)
committerHyunil <hyunil46.park@samsung.com>
Fri, 20 Jan 2017 07:19:27 +0000 (16:19 +0900)
Change-Id: I5373b2980206fb5916e561b418c6ed34022b7878
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
ext/wayland/gstwaylandsink.c
ext/wayland/gstwaylandsink.h
ext/wayland/wldisplay.c
ext/wayland/wldisplay.h
ext/wayland/wlshmallocator.c
ext/wayland/wlshmallocator.h

index 221eda3..74b8f34 100755 (executable)
@@ -148,6 +148,8 @@ enum
   PROP_0,
   PROP_DISPLAY,
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+  PROP_DUMP_VIDEO,
+  PROP_DUMP_COUNT,
   PROP_SIGNAL_HANDOFFS,
   PROP_USE_GAPLESS,
   PROP_KEEP_CAMERA_PREVIEW,
@@ -173,7 +175,6 @@ enum
   PROP_ALIGN_HEIGHT
 #endif
 };
-int dump__cnt = 0;
 
 GST_DEBUG_CATEGORY (gstwayland_debug);
 #define GST_CAT_DEFAULT gstwayland_debug
@@ -283,6 +284,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
   gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_wayland_sink_event);
 #endif
 
+  g_object_class_install_property (gobject_class, PROP_DUMP_VIDEO,
+      g_param_spec_boolean ("dump-video", "dump raw video buffer",
+          "Dump raw video buffer", FALSE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_DUMP_COUNT,
+      g_param_spec_uint ("dump-video-count", "dump video count",
+          "Dump video count", 1, G_MAXUINT, DEFAULT_DUMP_COUNT,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_property (gobject_class, PROP_DISPLAY,
       g_param_spec_string ("display", "Wayland Display name", "Wayland "
           "display name to connect to, if not supplied via the GstContext",
@@ -455,27 +466,44 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
 #endif
 }
 
-#ifdef DUMP_BUFFER
-int
-__write_rawdata (const char *file, const void *data, unsigned int size)
+static void
+gst_wayland_sink_dump_raw_video (GstWaylandSink * sink, GstBuffer * buffer,
+    guint dump_count, guint dump_total)
 {
-  FILE *fp;
+  GstMemory *mem;
+  GstMapInfo mem_info = GST_MAP_INFO_INIT;
+  gpointer data;
+  gint ret, size;
+  gchar file_name[128];
 
-  fp = fopen (file, "wb");
-  if (fp == NULL)
-    return -1;
+  g_return_if_fail (sink != NULL);
+  g_return_if_fail (buffer != NULL);
+
+  if (dump_count > dump_total)
+    return;
 
-  fwrite ((char *) data, sizeof (char), size, fp);
-  fclose (fp);
+  size = GST_VIDEO_INFO_SIZE (&sink->video_info);
+  mem = gst_buffer_peek_memory (buffer, 0);
+  gst_memory_map (mem, &mem_info, GST_MAP_READ);
+
+  data = mem_info.data;
+  snprintf (file_name, sizeof(file_name), "/tmp/WLSINK_OUT_DUMP_%2.2d.dump", dump_count);
+  ret = gst_wl_fwrite_data (file_name, data, size);
+  if (ret) {
+    GST_ERROR ("_write_rawdata() failed");
+  }
 
-  return 0;
+  GST_LOG ("DUMP IMAGE %d, size (%d)", dump_count, size);
+  gst_memory_unmap (mem, &mem_info);
 }
-#endif
+
 static void
 gst_wayland_sink_init (GstWaylandSink * sink)
 {
   FUNCTION;
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+  sink->dump_video = FALSE;
+  sink->total_dump = DEFAULT_DUMP_COUNT;
   sink->signal_handoffs = FALSE;
   sink->request_camera_flush_buf = FALSE;
   sink->keep_camera_preview = FALSE;
@@ -809,6 +837,12 @@ gst_wayland_sink_get_property (GObject * object,
       GST_OBJECT_UNLOCK (sink);
       break;
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+    case PROP_DUMP_VIDEO:
+      g_value_set_boolean (value, sink->dump_video);
+      break;
+    case PROP_DUMP_COUNT:
+      g_value_set_uint (value, sink->total_dump);
+      break;
     case PROP_KEEP_CAMERA_PREVIEW:
       g_value_set_boolean (value, sink->keep_camera_preview);
       break;
@@ -899,6 +933,18 @@ gst_wayland_sink_set_property (GObject * object,
       GST_OBJECT_UNLOCK (sink);
       break;
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+    case PROP_DUMP_VIDEO:
+      sink->dump_video = g_value_get_boolean (value);
+      if (sink->display) {
+        sink->display->dump_video = sink->dump_video;
+        GST_LOG ("Dump video set (%d):", sink->dump_video);
+      }
+      break;
+    case PROP_DUMP_COUNT:
+      sink->total_dump = g_value_get_uint (value);
+      if (sink->display)
+        sink->display->total_dump = sink->total_dump;
+      break;
     case PROP_SIGNAL_HANDOFFS:
       sink->signal_handoffs = g_value_get_boolean (value);
       GST_LOG ("set signal_handoffs(%d)", sink->signal_handoffs);
@@ -1871,26 +1917,11 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
     GST_LOG_OBJECT (sink, "buffer %p has a wl_buffer from our display, " "writing directly", buffer);   //buffer is from our  pool and have wl_buffer
     GST_LOG ("wl_buffer (%p)", wlbuffer->wlbuffer);
     to_render = buffer;
-#ifdef DUMP_BUFFER
-    GstMemory *mem;
-    GstMapInfo mem_info = GST_MAP_INFO_INIT;
-    int size = GST_VIDEO_INFO_SIZE (&sink->video_info);
-    mem = gst_buffer_peek_memory (to_render, 0);
-    gst_memory_map (mem, &mem_info, GST_MAP_READ);
-    void *data;
-    data = mem_info.data;
-    int ret;
-    char file_name[128];
-
-    sprintf (file_name, "/home/owner/DUMP/_WLSINK_OUT_DUMP_%2.2d.dump",
-        dump__cnt++);
-    ret = __write_rawdata (file_name, data, size);
-    if (ret) {
-      GST_ERROR ("_write_rawdata() failed");
-    }
-    GST_LOG ("DUMP IMAGE %d, size (%d)", dump__cnt, size);
-    gst_memory_unmap (mem, &mem_info);
-#endif
+
+    if (sink->dump_video)
+      gst_wayland_sink_dump_raw_video (sink, to_render,
+          sink->display->dump_count++, sink->total_dump);
+
   } else {
     GstMemory *mem;
     struct wl_buffer *wbuf = NULL;
index 2a1f6aa..2a2e868 100644 (file)
@@ -57,6 +57,7 @@ enum
 
 #define DEF_DISPLAY_FLIP            FLIP_NONE
 #define DEF_DISPLAY_GEOMETRY_METHOD         DISP_GEO_METHOD_LETTER_BOX
+#define DEFAULT_DUMP_COUNT 10
 #endif
 
 typedef struct _GstWaylandSink GstWaylandSink;
@@ -81,6 +82,7 @@ struct _GstWaylandSink
   GstBuffer *last_buffer;
 
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+  gboolean dump_video;
   gboolean signal_handoffs;
   gboolean request_camera_flush_buf;
   gboolean keep_camera_preview;
@@ -88,6 +90,7 @@ struct _GstWaylandSink
   gboolean visible;
   gboolean follow_parent_transform;
   gboolean USE_TBM;
+  guint total_dump;
   guint rotate_angle;
   guint display_geometry_method;
   guint flip;
index b46f9cc..d5a5816 100644 (file)
@@ -82,6 +82,7 @@ gst_wl_display_init (GstWlDisplay * self)
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
   self->tbm_bo_idx = 0;
   self->wl_surface_id = -1;
+  self->dump_count = 1;
 #endif
 }
 
index 68a0996..05bd30e 100644 (file)
@@ -95,6 +95,9 @@ struct _GstWlDisplay
   tbm_bufmgr flush_tbm_bufmgr;
   int flush_request;
 #endif
+  gboolean dump_video;
+  guint total_dump;
+  guint dump_count;
 
   gboolean is_native_format;    /*SN12, ST12 */
   void *bo[NV_BUF_PLANE_NUM];
index 855be00..27e61a6 100644 (file)
 #include <sys/mman.h>
 #include <sys/types.h>
 
-#ifdef DUMP_BUFFER
-int dump_cnt = 0;
-int _write_rawdata (const char *file, const void *data, unsigned int size);
-#endif
-
 GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
 #define GST_CAT_DEFAULT gstwayland_debug
 
 G_DEFINE_TYPE (GstWlShmAllocator, gst_wl_shm_allocator, GST_TYPE_ALLOCATOR);
 
+gint
+gst_wl_fwrite_data (gchar * file, gpointer data, guint size)
+{
+  FILE *fp;
+
+  fp = fopen (file, "wb");
+  if (fp == NULL)
+    return -1;
+
+  fwrite ((gchar *) data, sizeof (gchar), size, fp);
+  fclose (fp);
+
+  return 0;
+}
+
+static void
+gst_wl_tbm_dump_native_raw_video (gpointer bo, guint size, guint dump_count,
+    guint dump_total)
+{
+  tbm_bo_handle virtual_addr;
+  gint ret;
+  gchar file_name[128];
+  gchar err_str[256];
+  g_return_if_fail (bo != NULL);
+
+  if (dump_count > dump_total)
+    return;
+
+  virtual_addr = tbm_bo_get_handle (bo, TBM_DEVICE_CPU);
+  if (!virtual_addr.ptr) {
+    strerror_r (errno, err_str, sizeof (err_str));
+    GST_ERROR ("get tbm bo handle failed: %s (%d)", err_str, (errno));
+    return;
+  }
+
+  snprintf (file_name, sizeof (file_name), "/tmp/WLSINK_OUT_DUMP_%2.2d.dump",
+      dump_count);
+  ret = gst_wl_fwrite_data (file_name, virtual_addr.ptr, size);
+  if (ret) {
+    GST_ERROR ("_write_rawdata() failed");
+  }
+
+}
+
 static GstMemory *
 gst_wl_shm_allocator_alloc (GstAllocator * allocator, gsize size,
     GstAllocationParams * params)
@@ -256,10 +295,7 @@ gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
   if (display->USE_TBM) {
     tbm_surface_info_s ts_info;
     int num_bo;
-#ifdef DUMP_BUFFER
-    tbm_bo_handle virtual_addr;
-    void *data;
-#endif
+
     if (display->is_native_format == TRUE) {
       width = GST_VIDEO_INFO_WIDTH (info);
       height = GST_VIDEO_INFO_HEIGHT (info);
@@ -268,24 +304,10 @@ gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
       GST_LOG ("format %s, width(%d), height(%d), size(%d)",
           gst_wl_tbm_format_to_string (format), width, height, size);
 
-#ifdef DUMP_BUFFER
-      virtual_addr = tbm_bo_get_handle (display->bo[0], TBM_DEVICE_CPU);
-      if (!virtual_addr.ptr) {
-        GST_ERROR ("get tbm bo handle failed: %s", strerror (errno));
-        return FALSE;
-      }
-      data = virtual_addr.ptr;
-      int ret;
-      char file_name[128];
-      if (dump_cnt < 60) {
-        sprintf (file_name, "/home/owner/WLSINK_OUT_DUMP_%2.2d.dump",
-            dump_cnt++);
-        ret = _write_rawdata (file_name, virtual_addr.ptr, size);
-        if (ret) {
-          GST_ERROR ("_write_rawdata() failed");
-        }
-      }
-#endif
+      if (display->dump_video)
+        gst_wl_tbm_dump_native_raw_video (display->bo[0], size,
+            display->dump_count++, display->total_dump);
+
       GST_LOG ("TBM bo %p %p", display->bo[0], display->bo[1]);
       GST_LOG ("stride_width[0]: %d stride_height[0]:%d",
           display->stride_width[0], display->stride_height[0]);
@@ -331,22 +353,10 @@ gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
       GST_DEBUG_OBJECT (mem->allocator, "Creating wl_buffer of size %"
           G_GSSIZE_FORMAT " (%d x %d, stride %d)", size, width, height, stride);
 
-#ifdef DUMP_BUFFER
-      virtual_addr = tbm_bo_get_handle (shm_mem->tbm_bo_ptr, TBM_DEVICE_CPU);
-      if (!virtual_addr.ptr) {
-        GST_ERROR ("get tbm bo handle failed: %s", strerror (errno));
-        return FALSE;
-      }
-      data = virtual_addr.ptr;
-      int ret;
-      char file_name[128];
-      GST_LOG ("DUMP %d ", dump_cnt);
-      sprintf (file_name, "/home/owner/WLSINK_OUT_DUMP_%2.2d.dump", dump_cnt++);
-      ret = _write_rawdata (file_name, virtual_addr.ptr, size);
-      if (ret) {
-        GST_ERROR ("_write_rawdata() failed");
-      }
-#endif
+      if (display->dump_video)
+        gst_wl_tbm_dump_native_raw_video (shm_mem->tbm_bo_ptr, size,
+            display->dump_count++, display->total_dump);
+
       ts_info.width = width;
       ts_info.height = height;
       ts_info.format = format;
@@ -423,20 +433,3 @@ gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
   return wbuffer;
 #endif
 }
-
-#ifdef DUMP_BUFFER
-int
-_write_rawdata (const char *file, const void *data, unsigned int size)
-{
-  FILE *fp;
-
-  fp = fopen (file, "wb");
-  if (fp == NULL)
-    return -1;
-
-  fwrite ((char *) data, sizeof (char), size, fp);
-  fclose (fp);
-
-  return 0;
-}
-#endif
index 4fd8507..3dd9dfa 100644 (file)
@@ -72,5 +72,8 @@ gboolean gst_is_wl_shm_memory (GstMemory * mem);
 struct wl_buffer *gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem,
     GstWlDisplay * display, const GstVideoInfo * info);
 
+#ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
+gint gst_wl_fwrite_data (gchar * file, gpointer data, guint size);
+#endif
 G_END_DECLS
 #endif /* __GST_WL_SHM_ALLOCATOR_H__ */