filesink: Remove buffer, deprecate line-buffer mode and don't use fflush()
authorSebastian Dröge <sebastian@centricular.com>
Tue, 14 Aug 2018 07:58:26 +0000 (10:58 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 14 Aug 2018 10:56:08 +0000 (13:56 +0300)
fflush() has no effect because we use writev() directly, so fsync()
should be used instead which is actually flushing the kernel-side
buffers.

As a next step, a non-line-buffered buffering mode is to be added.

https://bugzilla.gnome.org/show_bug.cgi?id=794173

plugins/elements/gstfilesink.c
plugins/elements/gstfilesink.h

index 58ae8d1..7fa1f36 100644 (file)
@@ -86,7 +86,8 @@ gst_file_sink_buffer_mode_get_type (void)
   static const GEnumValue buffer_mode[] = {
     {GST_FILE_SINK_BUFFER_MODE_DEFAULT, "Default buffering", "default"},
     {GST_FILE_SINK_BUFFER_MODE_FULL, "Fully buffered", "full"},
-    {GST_FILE_SINK_BUFFER_MODE_LINE, "Line buffered", "line"},
+    {GST_FILE_SINK_BUFFER_MODE_LINE, "Line buffered (deprecated, like full)",
+        "line"},
     {GST_FILE_SINK_BUFFER_MODE_UNBUFFERED, "Unbuffered", "unbuffered"},
     {0, NULL, NULL},
   };
@@ -255,7 +256,6 @@ gst_file_sink_init (GstFileSink * filesink)
   filesink->current_pos = 0;
   filesink->buffer_mode = DEFAULT_BUFFER_MODE;
   filesink->buffer_size = DEFAULT_BUFFER_SIZE;
-  filesink->buffer = NULL;
   filesink->append = FALSE;
 
   gst_base_sink_set_sync (GST_BASE_SINK (filesink), FALSE);
@@ -272,9 +272,6 @@ gst_file_sink_dispose (GObject * object)
   sink->uri = NULL;
   g_free (sink->filename);
   sink->filename = NULL;
-  g_free (sink->buffer);
-  sink->buffer = NULL;
-  sink->buffer_size = 0;
 }
 
 static gboolean
@@ -365,8 +362,6 @@ gst_file_sink_get_property (GObject * object, guint prop_id, GValue * value,
 static gboolean
 gst_file_sink_open_file (GstFileSink * sink)
 {
-  gint mode;
-
   /* open the file */
   if (sink->filename == NULL || sink->filename[0] == '\0')
     goto no_filename;
@@ -378,36 +373,6 @@ gst_file_sink_open_file (GstFileSink * sink)
   if (sink->file == NULL)
     goto open_failed;
 
-  /* see if we are asked to perform a specific kind of buffering */
-  if ((mode = sink->buffer_mode) != -1) {
-    guint buffer_size;
-
-    /* free previous buffer if any */
-    g_free (sink->buffer);
-
-    if (mode == _IONBF) {
-      /* no buffering */
-      sink->buffer = NULL;
-      buffer_size = 0;
-    } else {
-      /* allocate buffer */
-      sink->buffer = g_malloc (sink->buffer_size);
-      buffer_size = sink->buffer_size;
-    }
-    /* Cygwin does not have __fbufsize, android adds it in API 23 */
-#if defined(HAVE_STDIO_EXT_H) && (!defined(__CYGWIN__) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 23))
-    GST_DEBUG_OBJECT (sink, "change buffer size %u to %u, mode %d",
-        (guint) __fbufsize (sink->file), buffer_size, mode);
-#else
-    GST_DEBUG_OBJECT (sink, "change buffer size to %u, mode %d",
-        sink->buffer_size, mode);
-#endif
-    if (setvbuf (sink->file, sink->buffer, mode, buffer_size) != 0) {
-      GST_WARNING_OBJECT (sink, "warning: setvbuf failed: %s",
-          g_strerror (errno));
-    }
-  }
-
   sink->current_pos = 0;
   /* try to seek in the file to figure out if it is seekable */
   sink->seekable = gst_file_sink_do_seek (sink, 0);
@@ -443,9 +408,6 @@ gst_file_sink_close_file (GstFileSink * sink)
 
     GST_DEBUG_OBJECT (sink, "closed file");
     sink->file = NULL;
-
-    g_free (sink->buffer);
-    sink->buffer = NULL;
   }
 }
 
@@ -515,9 +477,6 @@ gst_file_sink_do_seek (GstFileSink * filesink, guint64 new_offset)
   GST_DEBUG_OBJECT (filesink, "Seeking to offset %" G_GUINT64_FORMAT
       " using " __GST_STDIO_SEEK_FUNCTION, new_offset);
 
-  if (fflush (filesink->file))
-    goto flush_failed;
-
 #ifdef HAVE_FSEEKO
   if (fseeko (filesink->file, (off_t) new_offset, SEEK_SET) != 0)
     goto seek_failed;
@@ -537,11 +496,6 @@ gst_file_sink_do_seek (GstFileSink * filesink, guint64 new_offset)
   return TRUE;
 
   /* ERRORS */
-flush_failed:
-  {
-    GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
-    return FALSE;
-  }
 seek_failed:
   {
     GST_DEBUG_OBJECT (filesink, "Seeking failed: %s", g_strerror (errno));
@@ -591,13 +545,9 @@ gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
       if (filesink->current_pos != 0 && filesink->seekable) {
         gst_file_sink_do_seek (filesink, 0);
         if (ftruncate (fileno (filesink->file), 0))
-          goto flush_failed;
+          goto truncate_failed;
       }
       break;
-    case GST_EVENT_EOS:
-      if (fflush (filesink->file))
-        goto flush_failed;
-      break;
     default:
       break;
   }
@@ -613,7 +563,7 @@ seek_failed:
     gst_event_unref (event);
     return FALSE;
   }
-flush_failed:
+truncate_failed:
   {
     GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
         (_("Error while writing to file \"%s\"."), filesink->filename),
@@ -631,10 +581,6 @@ gst_file_sink_get_current_offset (GstFileSink * filesink, guint64 * p_pos)
 #ifdef HAVE_FTELLO
   ret = ftello (filesink->file);
 #elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
-  if (fflush (filesink->file)) {
-    GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
-    /* ignore and continue */
-  }
   ret = lseek (fileno (filesink->file), 0, SEEK_CUR);
 #else
   ret = (off_t) ftell (filesink->file);
@@ -691,7 +637,7 @@ gst_file_sink_render_list (GstBaseSink * bsink, GstBufferList * buffer_list)
       total_mems);
 
   if (flow == GST_FLOW_OK && sync_after) {
-    if (fflush (sink->file) || fsync (fileno (sink->file))) {
+    if (fsync (fileno (sink->file))) {
       GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
           (_("Error while writing to file \"%s\"."), sink->filename),
           ("%s", g_strerror (errno)));
@@ -726,7 +672,7 @@ gst_file_sink_render (GstBaseSink * sink, GstBuffer * buffer)
 
   if (flow == GST_FLOW_OK &&
       GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_SYNC_AFTER)) {
-    if (fflush (filesink->file) || fsync (fileno (filesink->file))) {
+    if (fsync (fileno (filesink->file))) {
       GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
           (_("Error while writing to file \"%s\"."), filesink->filename),
           ("%s", g_strerror (errno)));
index 6e3897c..99718a3 100644 (file)
@@ -80,7 +80,6 @@ struct _GstFileSink {
 
   gint    buffer_mode;
   guint   buffer_size;
-  gchar  *buffer;
 
   gboolean append;
 };