Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3:Staging:C:DVD
gstreamer-plugins-good
gstreamer-multifilesink-do-atomic-file-writes.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gstreamer-multifilesink-do-atomic-file-writes.patch of Package gstreamer-plugins-good
From 023998dd76b449440d267d689d578ae3e7a1bdbd Mon Sep 17 00:00:00 2001 From: Tim-Philipp Mueller <tim@centricular.com> Date: Tue, 27 Sep 2016 10:23:38 +0100 Subject: [PATCH] Revert "multifilesink: streamline the file-switch code a bit" This reverts commit f1ceaab02f3f557e23b77b14771a575788f92bb4. This broke atomic file writes in "buffer" mode. It did make sure that any streamheaders are prepended to each file in buffer mode as well, but that's not really needed in practice, whereas atomic file writes are, so let's restore the status quo ante for now since this was primarily a code cleanup anyway, and if anyone needs to streamheaders in buffer mode too they can make a patch to implement that differently. Re-implementing the atomic writes in the element also seems way too much work. https://bugzilla.gnome.org/show_bug.cgi?id=766990 Index: gst-plugins-good-1.8.3/gst/multifile/gstmultifilesink.c =================================================================== --- gst-plugins-good-1.8.3.orig/gst/multifile/gstmultifilesink.c +++ gst-plugins-good-1.8.3/gst/multifile/gstmultifilesink.c @@ -581,8 +581,6 @@ gst_multi_file_sink_write_stream_headers if (sink->streamheaders == NULL) return TRUE; - GST_DEBUG_OBJECT (sink, "Writing stream headers"); - /* we want to write these at the beginning */ g_assert (sink->cur_file_size == 0); @@ -610,29 +608,29 @@ gst_multi_file_sink_write_buffer (GstMul GstBuffer * buffer) { GstMapInfo map; + gchar *filename; gboolean ret; + GError *error = NULL; gboolean first_file = TRUE; gst_buffer_map (buffer, &map, GST_MAP_READ); switch (multifilesink->next_file) { case GST_MULTI_FILE_SINK_NEXT_BUFFER: - if (multifilesink->files != NULL) - first_file = FALSE; - if (!gst_multi_file_sink_open_next_file (multifilesink)) - goto stdio_write_error; - if (first_file == FALSE) - gst_multi_file_sink_write_stream_headers (multifilesink); - GST_DEBUG_OBJECT (multifilesink, - "Writing buffer data (%" G_GSIZE_FORMAT " bytes) to new file", - map.size); - ret = fwrite (map.data, map.size, 1, multifilesink->file); - if (ret != 1) { - gst_multi_file_sink_close_file (multifilesink, NULL); - goto stdio_write_error; - } + gst_multi_file_sink_ensure_max_files (multifilesink); + + filename = g_strdup_printf (multifilesink->filename, + multifilesink->index); + ret = g_file_set_contents (filename, (char *) map.data, map.size, &error); + if (!ret) + goto write_error; + + multifilesink->files = g_slist_append (multifilesink->files, filename); + multifilesink->n_files += 1; + + gst_multi_file_sink_post_message (multifilesink, buffer, filename); + multifilesink->index++; - gst_multi_file_sink_close_file (multifilesink, buffer); break; case GST_MULTI_FILE_SINK_NEXT_DISCONT: if (GST_BUFFER_IS_DISCONT (buffer)) { @@ -779,6 +777,26 @@ gst_multi_file_sink_write_buffer (GstMul return GST_FLOW_OK; /* ERRORS */ +write_error: + { + switch (error->code) { + case G_FILE_ERROR_NOSPC:{ + GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, (NULL), + (NULL)); + break; + } + default:{ + GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, + ("Error while writing to file \"%s\".", filename), + ("%s", g_strerror (errno))); + } + } + g_error_free (error); + g_free (filename); + + gst_buffer_unmap (buffer, &map); + return GST_FLOW_ERROR; + } stdio_write_error: switch (errno) { case ENOSPC:
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor