From cb9260dad79363a277fa1ba024cac85cf9195b69 Mon Sep 17 00:00:00 2001 From: Vyacheslav Valkovoy Date: Fri, 28 Aug 2015 12:25:13 +0300 Subject: [PATCH] Fixed media_streamer_push_packet API function Change-Id: Ifbc4ede884d7d9847e2cfdfea81ec45d4ec6f052 --- src/media_streamer_gst.c | 41 ++++++++++++++++++++++++++++++----------- src/media_streamer_node.c | 8 ++++++-- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index c2e0eba..aa2fb9c 100755 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -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); diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 187969e..03d077c 100755 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -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); + } } } -- 2.7.4