Fixed media_streamer_push_packet API function 36/47036/1 tizen_3.0.m1_mobile tizen_3.0.m1_tv accepted/tizen/mobile/20150831.102359 accepted/tizen/tv/20150831.102426 accepted/tizen/wearable/20150831.102438 submit/tizen/20150831.085424 submit/tizen_common/20151023.083358 submit/tizen_common/20151026.085049 tizen_3.0.m1_mobile_release tizen_3.0.m1_tv_release
authorVyacheslav Valkovoy <v.valkovoy@samsung.com>
Fri, 28 Aug 2015 09:25:13 +0000 (12:25 +0300)
committerVyacheslav Valkovoy <v.valkovoy@samsung.com>
Fri, 28 Aug 2015 09:26:01 +0000 (12:26 +0300)
Change-Id: Ifbc4ede884d7d9847e2cfdfea81ec45d4ec6f052

src/media_streamer_gst.c
src/media_streamer_node.c

index c2e0eba..aa2fb9c 100755 (executable)
@@ -1252,12 +1252,9 @@ int __ms_element_set_fmt(media_streamer_node_s *node, const char *pad_name, medi
 
 int __ms_element_push_packet(GstElement *src_element, media_packet_h packet)
 {
-       GstBuffer *buffer;
+       GstBuffer *buffer = NULL;
        GstFlowReturn gst_ret = GST_FLOW_OK;
-       guint64 pts = 0;
-       guint64 duration = 0;
        guchar *buffer_data = NULL;
-       guint64 size  = 0;
 
        ms_retvm_if(src_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
@@ -1266,17 +1263,39 @@ int __ms_element_push_packet(GstElement *src_element, media_packet_h packet)
                return MEDIA_STREAMER_ERROR_NONE;
        }
 
-       media_packet_get_buffer_size(packet, &size);
        media_packet_get_buffer_data_ptr(packet, (void **)&buffer_data);
-       media_packet_get_pts(packet, &pts);
-       media_packet_get_duration(packet, &duration);
 
-       buffer = gst_buffer_new_wrapped(buffer_data, size);
+       if(buffer_data != NULL) {
+               GstMapInfo buff_info = GST_MAP_INFO_INIT;
+               guint64 pts = 0;
+               guint64 duration = 0;
+               guint64 size  = 0;
+
+               media_packet_get_buffer_size(packet, &size);
+
+               buffer = gst_buffer_new_and_alloc (size);
+               if (!buffer) {
+                       ms_error("Failed to allocate memory for push buffer");
+                       return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+               }
+
+               if (gst_buffer_map (buffer, &buff_info, GST_MAP_READWRITE)) {
+                       memcpy (buff_info.data, buffer_data, size);
+                       buff_info.size = size;
+                       gst_buffer_unmap (buffer, &buff_info);
+               }
+
+               media_packet_get_pts(packet, &pts);
+               GST_BUFFER_PTS(buffer) = pts;
+
+               media_packet_get_duration(packet, &duration);
+               GST_BUFFER_DURATION(buffer) = duration;
 
-       GST_BUFFER_PTS(buffer) = pts;
-       GST_BUFFER_DURATION(buffer) = duration;
+               g_signal_emit_by_name(G_OBJECT(src_element), "push-buffer", buffer, &gst_ret, NULL);
 
-       g_signal_emit_by_name(G_OBJECT(src_element), "push-buffer", buffer, &gst_ret, NULL);
+        } else {
+                g_signal_emit_by_name(G_OBJECT(src_element), "end-of-stream", &gst_ret, NULL);
+        }
 
        gst_buffer_unref(buffer);
 
index 187969e..03d077c 100755 (executable)
@@ -332,7 +332,9 @@ static void __ms_sink_new_buffer_cb(GstElement *sink, gpointer *data)
                media_streamer_sink_data_ready_cb data_ready_cb =
                                (media_streamer_sink_data_ready_cb) sink_callbacks->data_ready_cb.callback;
 
-               data_ready_cb((media_streamer_node_h)ms_sink, sink_callbacks->data_ready_cb.user_data);
+               if (data_ready_cb) {
+                       data_ready_cb((media_streamer_node_h)ms_sink, sink_callbacks->data_ready_cb.user_data);
+               }
        }
 }
 
@@ -348,7 +350,9 @@ static void sink_eos(GstElement *sink, gpointer *data)
                media_streamer_sink_eos_cb eos_cb =
                                (media_streamer_sink_eos_cb) sink_callbacks->eos_cb.callback;
 
-               eos_cb((media_streamer_node_h)ms_sink, sink_callbacks->eos_cb.user_data);
+               if (eos_cb) {
+                       eos_cb((media_streamer_node_h)ms_sink, sink_callbacks->eos_cb.user_data);
+               }
        }
 }