From: Sangchul Lee Date: Tue, 30 Mar 2021 08:31:01 +0000 (+0900) Subject: media_streamer_gst: Revise pull/push packet API X-Git-Tag: submit/tizen_6.0/20210402.080422~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F28%2F256328%2F1;p=platform%2Fcore%2Fapi%2Fmediastreamer.git media_streamer_gst: Revise pull/push packet API Logs are revised to clarify the situation. [Version] 0.1.138 [Issue type] Refactoring Change-Id: Iaa6e3750c8dce712e2905f51236cc9873b74eba4 Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 2171d83..3223089 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.137 +Version: 0.1.138 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer.c b/src/media_streamer.c index e12de32..9242feb 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -703,8 +703,6 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa ms_retvm_if(ms_node->type != MEDIA_STREAMER_NODE_TYPE_SRC, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Node type must be Src type for pushing packets."); ms_retvm_if(ms_node->subtype != MEDIA_STREAMER_NODE_SRC_TYPE_CUSTOM, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Source Node must be a custom type for pushing packets."); - ms_debug_fleave(); - return ms_element_push_packet(ms_node->gst_element, packet); } @@ -720,8 +718,6 @@ int media_streamer_node_pull_packet(media_streamer_node_h sink, media_packet_h * ms_retvm_if(ms_node->type != MEDIA_STREAMER_NODE_TYPE_SINK, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Node type must be Sink type for pulling packets."); ms_retvm_if(ms_node->subtype != MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Sink Node must be a custom type for pulling packets."); - ms_debug_fleave(); - return ms_element_pull_packet(ms_node->gst_element, packet); } diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index ce77f60..214dd82 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -2741,56 +2741,62 @@ int ms_element_push_packet(GstElement *src_element, media_packet_h packet) GstBuffer *buffer = NULL; GstFlowReturn gst_ret = GST_FLOW_OK; guchar *buffer_data = NULL; + GstMapInfo buff_info = GST_MAP_INFO_INIT; + guint64 pts = 0; + guint64 duration = 0; + guint64 size = 0; - ms_debug_fenter(); - - ms_retvm_if(src_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(src_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "src_element is NULL"); - if (packet == NULL) { - g_signal_emit_by_name(G_OBJECT(src_element), "end-of-stream", &gst_ret, NULL); - return MEDIA_STREAMER_ERROR_NONE; + if (!packet) { + ms_debug("packet is NULL"); + goto send_eos; } media_packet_get_buffer_data_ptr(packet, (void **)&buffer_data); + if (!buffer_data) { + ms_debug("buffer_data is NULL"); + goto send_eos; + } - 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; - } + media_packet_get_buffer_size(packet, &size); - 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); - } + buffer = gst_buffer_new_and_alloc(size); + if (!buffer) { + ms_error("failed to gst_buffer_new_and_alloc()"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } - media_packet_get_pts(packet, &pts); - GST_BUFFER_PTS(buffer) = pts; + 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_duration(packet, &duration); - GST_BUFFER_DURATION(buffer) = duration; + media_packet_get_pts(packet, &pts); + GST_BUFFER_PTS(buffer) = pts; - g_signal_emit_by_name(G_OBJECT(src_element), "push-buffer", buffer, &gst_ret, NULL); - gst_buffer_unref(buffer); + media_packet_get_duration(packet, &duration); + GST_BUFFER_DURATION(buffer) = duration; - } else { - g_signal_emit_by_name(G_OBJECT(src_element), "end-of-stream", &gst_ret, NULL); + g_signal_emit_by_name(G_OBJECT(src_element), "push-buffer", buffer, &gst_ret, NULL); + gst_buffer_unref(buffer); + if (gst_ret != GST_FLOW_OK) { + ms_error("failed to emit 'push-buffer' signal, gst_ret[%d]", gst_ret); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } - if (gst_ret != GST_FLOW_OK) - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ms_debug("emit 'push-buffer' signal done"); + return MEDIA_STREAMER_ERROR_NONE; - ms_debug_fleave(); +send_eos: + g_signal_emit_by_name(G_OBJECT(src_element), "end-of-stream", &gst_ret, NULL); + if (gst_ret != GST_FLOW_OK) { + ms_error("failed to emit 'end-of-stream' signal, gst_ret[%d]", gst_ret); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + ms_debug("emit 'end-of-stream' signal done"); return MEDIA_STREAMER_ERROR_NONE; } @@ -2803,45 +2809,47 @@ int ms_element_pull_packet(GstElement *sink_element, media_packet_h *packet) GstMapInfo map = {0,}; GstBuffer *buffer = NULL; - ms_debug_fenter(); - - ms_retvm_if(sink_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); - ms_retvm_if(packet == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(sink_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "sink_element is NULL"); + ms_retvm_if(packet == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "packet is NULL"); /* Retrieve the buffer */ g_signal_emit_by_name(sink_element, "pull-sample", &sample, NULL); - ms_retvm_if(sample == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Pull sample failed!"); + ms_retvm_if(sample == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "'pull-sample' failed!"); ret = ms_element_get_pad_fmt(sink_element, "sink", &fmt); - if (ret == MEDIA_STREAMER_ERROR_NONE) { - buffer = gst_sample_get_buffer(sample); - if (!buffer) { - ms_error("Failed to get buffer from sample"); - media_format_unref(fmt); - gst_sample_unref(sample); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - gst_buffer_map(buffer, &map, GST_MAP_READ); + if (ret != MEDIA_STREAMER_ERROR_NONE) + goto error; - buffer_res = (guint8 *) malloc(map.size * sizeof(guint8)); - if (buffer_res != NULL) { - memcpy(buffer_res, map.data, map.size); + buffer = gst_sample_get_buffer(sample); + if (!buffer) { + ms_error("failed to gst_sample_get_buffer()"); + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto error; + } - media_packet_create_from_external_memory(fmt, (void *)buffer_res, map.size, NULL, NULL, packet); - media_packet_set_pts(*packet, GST_BUFFER_PTS(buffer)); - media_packet_set_dts(*packet, GST_BUFFER_DTS(buffer)); - media_packet_set_pts(*packet, GST_BUFFER_DURATION(buffer)); - } else { - ms_error("Error allocation memory for packet data"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } + gst_buffer_map(buffer, &map, GST_MAP_READ); + + buffer_res = (guint8 *)malloc(map.size * sizeof(guint8)); + if (!buffer_res) { + ms_error("failed to malloc()"); gst_buffer_unmap(buffer, &map); + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto error; } - media_format_unref(fmt); - gst_sample_unref(sample); + memcpy(buffer_res, map.data, map.size); + media_packet_create_from_external_memory(fmt, (void *)buffer_res, map.size, NULL, NULL, packet); + media_packet_set_pts(*packet, GST_BUFFER_PTS(buffer)); + media_packet_set_dts(*packet, GST_BUFFER_DTS(buffer)); + media_packet_set_pts(*packet, GST_BUFFER_DURATION(buffer)); + gst_buffer_unmap(buffer, &map); - ms_debug_fleave(); + ms_debug("sample[%p, buffer:%p] packet[%p]", sample, buffer, packet); + +error: + if (fmt) + media_format_unref(fmt); + gst_sample_unref(sample); return ret; }