Add unmap buffer in error case
[platform/core/multimedia/libmm-wfd.git] / src / mm_wfd_sink_util.c
old mode 100755 (executable)
new mode 100644 (file)
index f738f54..9093f63
 #include <stdio.h>
 #include "mm_wfd_sink_util.h"
 #include <tzplatform_config.h>
+#include "mm_wfd_sink_enum.h"
 
-#define DUMP_TS_DATA_PATH tzplatform_mkpath(TZ_SYS_VAR, "tmp/")
+#define DUMP_TS_DATA_PATH tzplatform_mkpath(TZ_SYS_VAR, "/tmp/")
+#define TS_DUMP_FILE_FORMAT "%s%s_%s.ts"
 
 static GstPadProbeReturn
 _mm_wfd_sink_util_dump(GstPad *pad, GstPadProbeInfo *info, gpointer u_data)
@@ -34,7 +36,9 @@ _mm_wfd_sink_util_dump(GstPad *pad, GstPadProbeInfo *info, gpointer u_data)
        FILE *f = NULL;
        char buf[256] = {0, };
        char path[256] = {0, };
-       GstElement * parent = NULL;
+       GstElement *parent = NULL;
+       gchar *padname = NULL;
+       gchar *elementname = NULL;
 
        parent = gst_pad_get_parent_element(pad);
        if (parent == NULL) {
@@ -42,24 +46,30 @@ _mm_wfd_sink_util_dump(GstPad *pad, GstPadProbeInfo *info, gpointer u_data)
                return GST_PAD_PROBE_OK;
        }
 
-       snprintf(path, sizeof(path), "%s%s_%s.ts", DUMP_TS_DATA_PATH, gst_element_get_name(parent), gst_pad_get_name(pad));
+       padname = gst_pad_get_name(pad);
+       elementname = gst_element_get_name(parent);
+       snprintf(path, sizeof(path), TS_DUMP_FILE_FORMAT, DUMP_TS_DATA_PATH, elementname, padname);
+       MMWFDSINK_FREEIF(padname);
+       MMWFDSINK_FREEIF(elementname);
        gst_object_unref(parent);
 
        if (info && info->type & GST_PAD_PROBE_TYPE_BUFFER) {
                GstMapInfo buf_info;
                GstBuffer *buffer = gst_pad_probe_info_get_buffer(info);
 
-               gst_buffer_map(buffer, &buf_info, GST_MAP_READ);
-
-               wfd_sink_debug("got buffer %p with size %d", buffer, buf_info.size);
-               data = (gint8 *)(buf_info.data);
-               size = buf_info.size;
                f = fopen(path, "a");
                if (f == NULL) {
                        strerror_r(errno, buf, sizeof(buf));
                        wfd_sink_error("failed to fopen! : %s", buf);
                        return GST_PAD_PROBE_OK;
                }
+
+               gst_buffer_map(buffer, &buf_info, GST_MAP_READ);
+
+               wfd_sink_debug("got buffer %p with size %d", buffer, buf_info.size);
+               data = (gint8 *)(buf_info.data);
+               size = buf_info.size;
+
                fwrite(data, size, 1, f);
                fclose(f);
                gst_buffer_unmap(buffer, &buf_info);
@@ -74,8 +84,8 @@ _mm_wfd_sink_util_pad_probe_cb(GstPad *pad, GstPadProbeInfo *info, gpointer u_da
        GstElement *parent = NULL;
 
        wfd_sink_return_val_if_fail(info &&
-                                               info->type != GST_PAD_PROBE_TYPE_INVALID,
-                                               GST_PAD_PROBE_DROP);
+                                                               info->type != GST_PAD_PROBE_TYPE_INVALID,
+                                                               GST_PAD_PROBE_DROP);
        wfd_sink_return_val_if_fail(pad, GST_PAD_PROBE_DROP);
 
        parent = (GstElement *)gst_object_get_parent(GST_OBJECT(pad));
@@ -88,30 +98,44 @@ _mm_wfd_sink_util_pad_probe_cb(GstPad *pad, GstPadProbeInfo *info, gpointer u_da
                GstBuffer *buffer = gst_pad_probe_info_get_buffer(info);
                /* show name and timestamp */
                wfd_sink_debug("BUFFER PROBE : %s:%s :  %u:%02u:%02u.%09u  (%"G_GSSIZE_FORMAT" bytes)\n",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)),
-                                       GST_STR_NULL(GST_PAD_NAME(pad)),
-                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
-                                       gst_buffer_get_size(buffer));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(parent)),
+                                               GST_STR_NULL(GST_PAD_NAME(pad)),
+                                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
+                                               gst_buffer_get_size(buffer));
        } else if (info->type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_UPSTREAM ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_FLUSH ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_BOTH) {
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_UPSTREAM ||
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_FLUSH ||
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_BOTH) {
                GstEvent *event = gst_pad_probe_info_get_event(info);
 
                /* show name and event type */
                wfd_sink_debug("EVENT PROBE : %s:%s :  %s\n",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)),
-                                       GST_STR_NULL(GST_PAD_NAME(pad)),
-                                       GST_EVENT_TYPE_NAME(event));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(parent)),
+                                               GST_STR_NULL(GST_PAD_NAME(pad)),
+                                               GST_EVENT_TYPE_NAME(event));
 
                if (GST_EVENT_TYPE(event) == GST_EVENT_SEGMENT) {
                        const GstSegment *segment = NULL;
                        gst_event_parse_segment(event, &segment);
-                       if (segment)
+                       if (segment) {
                                wfd_sink_debug("NEWSEGMENT : %" GST_TIME_FORMAT
-                                                       " -- %"  GST_TIME_FORMAT ", time %" GST_TIME_FORMAT " \n",
-                                                       GST_TIME_ARGS(segment->start), GST_TIME_ARGS(segment->stop),
-                                                       GST_TIME_ARGS(segment->time));
+                                                               " -- %"  GST_TIME_FORMAT ", time %" GST_TIME_FORMAT " \n",
+                                                               GST_TIME_ARGS(segment->start), GST_TIME_ARGS(segment->stop),
+                                                               GST_TIME_ARGS(segment->time));
+
+                               wfd_sink_debug("NEWSEGMENT : flags[%d] rate[%d] applied_rate[%d] foramt[%d] base[%lld] offset[%lld] position[%lld] duration[%lld]",
+                                                               segment->flags, segment->rate, segment->applied_rate, segment->format, segment->base, segment->offset, segment->position, segment->duration);
+
+                       }
+               } else if (GST_EVENT_TYPE(event) == GST_EVENT_CAPS) {
+                       GstCaps *caps;
+                       gchar *caps_string = NULL;
+
+                       gst_event_parse_caps(event, &caps);
+                       caps_string = gst_caps_to_string(caps);
+
+                       wfd_sink_debug("caps: %s", caps_string);
+                       g_free(caps_string);
                }
        }
 
@@ -137,7 +161,7 @@ mm_wfd_sink_util_add_pad_probe(GstPad *pad, GstElement *element, const gchar *pa
        if (probe_pad) {
                wfd_sink_debug("add pad(%s) probe", GST_STR_NULL(GST_PAD_NAME(probe_pad)));
                gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_DATA_BOTH,
-                                       _mm_wfd_sink_util_pad_probe_cb, (gpointer)NULL, NULL);
+                                                       _mm_wfd_sink_util_pad_probe_cb, (gpointer)NULL, NULL);
                gst_object_unref(probe_pad);
        }
 }
@@ -151,6 +175,14 @@ mm_wfd_sink_util_add_pad_probe_for_data_dump(GstElement *element, const gchar *p
                probe_pad = gst_element_get_static_pad(element, pad_name);
 
        if (probe_pad) {
+               char file_path[256] = {0, };
+               gchar *elementname = NULL;
+
+               elementname = gst_element_get_name(element);
+               snprintf(file_path, sizeof(file_path), TS_DUMP_FILE_FORMAT, DUMP_TS_DATA_PATH, elementname, pad_name);
+               MMWFDSINK_FREEIF(elementname);
+               remove(file_path);
+
                wfd_sink_debug("add pad(%s) probe", GST_STR_NULL(GST_PAD_NAME(probe_pad)));
                gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_BUFFER, _mm_wfd_sink_util_dump, (gpointer)NULL, NULL);
                gst_object_unref(probe_pad);
@@ -176,8 +208,8 @@ _mm_wfd_sink_util_check_first_buffer_cb(GstPad *pad, GstPadProbeInfo *info, gpoi
        buffer = gst_pad_probe_info_get_buffer(info);
 
        wfd_sink_debug("FIRST BUFFER PROBE : %s:%s :  %u:%02u:%02u.%09u (%"G_GSSIZE_FORMAT" bytes)\n",
-                               GST_STR_NULL(GST_ELEMENT_NAME(parent)), GST_STR_NULL(GST_PAD_NAME(pad)),
-                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)), gst_buffer_get_size(buffer));
+                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)), GST_STR_NULL(GST_PAD_NAME(pad)),
+                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)), gst_buffer_get_size(buffer));
 
        if (probe_id && *probe_id > 0) {
                wfd_sink_debug("remove buffer probe[%d]\n", *probe_id);
@@ -216,7 +248,7 @@ mm_wfd_sink_util_add_pad_probe_for_checking_first_buffer(GstPad *pad, GstElement
 
                *probe_id = gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_BUFFER, _mm_wfd_sink_util_check_first_buffer_cb, (gpointer)probe_id, NULL);
                wfd_sink_debug("add pad(%s) probe, %d",
-                                       GST_STR_NULL(GST_PAD_NAME(probe_pad)), *probe_id);
+                                               GST_STR_NULL(GST_PAD_NAME(probe_pad)), *probe_id);
 
                gst_object_unref(probe_pad);
        }