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;
}
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;
}