static GstFlowReturn gst_multi_file_src_create (GstPushSrc * src, GstBuffer ** buffer) { GstMultiFileSrc *multifilesrc; gsize size; gchar *data; gchar *filename; GstBuffer *buf; gboolean ret; GError *error = NULL; multifilesrc = GST_MULTI_FILE_SRC (src); filename = gst_multi_file_src_get_filename (multifilesrc); GST_DEBUG_OBJECT (multifilesrc, "reading from file \"%s\".", filename); ret = g_file_get_contents (filename, &data, &size, &error); if (!ret) { if (multifilesrc->successful_read) { /* If we've read at least one buffer successfully, not finding the * next file is EOS. */ g_free (filename); if (error != NULL) g_error_free (error); return GST_FLOW_UNEXPECTED; } else { goto handle_error; } } multifilesrc->successful_read = TRUE; multifilesrc->index++; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = (unsigned char *) data; GST_BUFFER_MALLOCDATA (buf) = GST_BUFFER_DATA (buf); GST_BUFFER_SIZE (buf) = size; GST_BUFFER_OFFSET (buf) = multifilesrc->offset; GST_BUFFER_OFFSET_END (buf) = multifilesrc->offset + size; multifilesrc->offset += size; gst_buffer_set_caps (buf, multifilesrc->caps); GST_DEBUG_OBJECT (multifilesrc, "read file \"%s\".", filename); g_free (filename); *buffer = buf; return GST_FLOW_OK; handle_error: { if (error != NULL) { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", error->message)); g_error_free (error); } else { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", g_strerror (errno))); } g_free (filename); return GST_FLOW_ERROR; } }
static GstFlowReturn gst_multi_file_src_create (GstPushSrc * src, GstBuffer ** buffer) { GstMultiFileSrc *multifilesrc; gsize size; gchar *data; gchar *filename; GstBuffer *buf; gboolean ret; GError *error = NULL; multifilesrc = GST_MULTI_FILE_SRC (src); if (multifilesrc->index < multifilesrc->start_index) { multifilesrc->index = multifilesrc->start_index; } filename = gst_multi_file_src_get_filename (multifilesrc); GST_DEBUG_OBJECT (multifilesrc, "reading from file \"%s\".", filename); ret = g_file_get_contents (filename, &data, &size, &error); if (!ret) { if (multifilesrc->successful_read) { /* If we've read at least one buffer successfully, not finding the * next file is EOS. */ g_free (filename); if (error != NULL) g_error_free (error); if (multifilesrc->loop) { error = NULL; multifilesrc->index = multifilesrc->start_index; filename = gst_multi_file_src_get_filename (multifilesrc); ret = g_file_get_contents (filename, &data, &size, &error); if (!ret) { g_free (filename); if (error != NULL) g_error_free (error); return GST_FLOW_EOS; } } else { return GST_FLOW_EOS; } } else { goto handle_error; } } multifilesrc->successful_read = TRUE; multifilesrc->index++; if (multifilesrc->stop_index != -1 && multifilesrc->index >= multifilesrc->stop_index) { multifilesrc->index = multifilesrc->start_index; } buf = gst_buffer_new (); gst_buffer_append_memory (buf, gst_memory_new_wrapped (0, data, size, 0, size, data, g_free)); GST_BUFFER_OFFSET (buf) = multifilesrc->offset; GST_BUFFER_OFFSET_END (buf) = multifilesrc->offset + size; multifilesrc->offset += size; GST_DEBUG_OBJECT (multifilesrc, "read file \"%s\".", filename); g_free (filename); *buffer = buf; return GST_FLOW_OK; handle_error: { if (error != NULL) { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", error->message)); g_error_free (error); } else { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", g_strerror (errno))); } g_free (filename); return GST_FLOW_ERROR; } }