identity: add eos-after property
[platform/upstream/gstreamer.git] / plugins / elements / gstfilesink.c
index 67135fc..c722759 100644 (file)
@@ -389,6 +389,7 @@ gst_file_sink_open_file (GstFileSink * sink)
     }
 
     sink->buffer = gst_buffer_list_new ();
+    sink->current_buffer_size = 0;
   }
 
   GST_DEBUG_OBJECT (sink, "opened file %s, seekable %d",
@@ -432,6 +433,7 @@ gst_file_sink_close_file (GstFileSink * sink)
     gst_buffer_list_unref (sink->buffer);
     sink->buffer = NULL;
   }
+  sink->current_buffer_size = 0;
 }
 
 static gboolean
@@ -450,7 +452,8 @@ gst_file_sink_query (GstBaseSink * bsink, GstQuery * query)
       switch (format) {
         case GST_FORMAT_DEFAULT:
         case GST_FORMAT_BYTES:
-          gst_query_set_position (query, GST_FORMAT_BYTES, self->current_pos);
+          gst_query_set_position (query, GST_FORMAT_BYTES,
+              self->current_pos + self->current_buffer_size);
           res = TRUE;
           break;
         default:
@@ -555,7 +558,8 @@ gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
       if (segment->format == GST_FORMAT_BYTES) {
         /* only try to seek and fail when we are going to a different
          * position */
-        if (filesink->current_pos != segment->start) {
+        if (filesink->current_pos + filesink->current_buffer_size !=
+            segment->start) {
           /* FIXME, the seek should be performed on the pos field, start/stop are
            * just boundaries for valid bytes offsets. We should also fill the file
            * with zeroes if the new position extends the current EOF (sparse streams
@@ -578,6 +582,11 @@ gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
         if (ftruncate (fileno (filesink->file), 0))
           goto truncate_failed;
       }
+      if (filesink->buffer) {
+        gst_buffer_list_unref (filesink->buffer);
+        filesink->buffer = gst_buffer_list_new ();
+        filesink->current_buffer_size = 0;
+      }
       break;
     case GST_EVENT_EOS:
       if (gst_file_sink_flush_buffer (filesink) != GST_FLOW_OK)
@@ -641,11 +650,12 @@ gst_file_sink_get_current_offset (GstFileSink * filesink, guint64 * p_pos)
 
 static GstFlowReturn
 gst_file_sink_render_buffers (GstFileSink * sink, GstBuffer ** buffers,
-    guint num_buffers, guint8 * mem_nums, guint total_mems)
+    guint num_buffers, guint8 * mem_nums, guint total_mems, gsize size)
 {
   GST_DEBUG_OBJECT (sink,
-      "writing %u buffers (%u memories) at position %" G_GUINT64_FORMAT,
-      num_buffers, total_mems, sink->current_pos);
+      "writing %u buffers (%u memories, %" G_GSIZE_FORMAT
+      " bytes) at position %" G_GUINT64_FORMAT, num_buffers, total_mems, size,
+      sink->current_pos);
 
   return gst_writev_buffers (GST_OBJECT_CAST (sink), fileno (sink->file), NULL,
       buffers, num_buffers, mem_nums, total_mems, &sink->current_pos, 0);
@@ -659,6 +669,7 @@ gst_file_sink_render_list_internal (GstFileSink * sink,
   GstBuffer **buffers;
   guint8 *mem_nums;
   guint total_mems;
+  gsize total_size = 0;
   guint i, num_buffers;
 
   num_buffers = gst_buffer_list_length (buffer_list);
@@ -672,11 +683,12 @@ gst_file_sink_render_list_internal (GstFileSink * sink,
     buffers[i] = gst_buffer_list_get (buffer_list, i);
     mem_nums[i] = gst_buffer_n_memory (buffers[i]);
     total_mems += mem_nums[i];
+    total_size += gst_buffer_get_size (buffers[i]);
   }
 
   flow =
       gst_file_sink_render_buffers (sink, buffers, num_buffers, mem_nums,
-      total_mems);
+      total_mems, total_size);
 
   return flow;
 
@@ -752,11 +764,18 @@ gst_file_sink_render_list (GstBaseSink * bsink, GstBufferList * buffer_list)
   gst_buffer_list_foreach (buffer_list, has_sync_after_buffer, &sync_after);
 
   if (sync_after || !sink->buffer) {
-    flow = gst_file_sink_render_list_internal (sink, buffer_list);
+    flow = gst_file_sink_flush_buffer (sink);
+    if (flow == GST_FLOW_OK)
+      flow = gst_file_sink_render_list_internal (sink, buffer_list);
   } else {
     guint size = 0;
     gst_buffer_list_foreach (buffer_list, accumulate_size, &size);
 
+    GST_DEBUG_OBJECT (sink,
+        "Queueing buffer list of %u bytes (%u buffers) at offset %"
+        G_GUINT64_FORMAT, size, num_buffers,
+        sink->current_pos + sink->current_buffer_size);
+
     for (i = 0; i < num_buffers; ++i)
       gst_buffer_list_add (sink->buffer,
           gst_buffer_ref (gst_buffer_list_get (buffer_list, i)));
@@ -801,8 +820,16 @@ gst_file_sink_render (GstBaseSink * sink, GstBuffer * buffer)
   n_mem = gst_buffer_n_memory (buffer);
 
   if (n_mem > 0 && (sync_after || !filesink->buffer)) {
-    flow = gst_file_sink_render_buffers (filesink, &buffer, 1, &n_mem, n_mem);
+    flow = gst_file_sink_flush_buffer (filesink);
+    if (flow == GST_FLOW_OK)
+      flow =
+          gst_file_sink_render_buffers (filesink, &buffer, 1, &n_mem, n_mem,
+          gst_buffer_get_size (buffer));
   } else if (n_mem > 0) {
+    GST_DEBUG_OBJECT (filesink,
+        "Queueing buffer of %" G_GSIZE_FORMAT " bytes at offset %"
+        G_GUINT64_FORMAT, gst_buffer_get_size (buffer),
+        filesink->current_pos + filesink->current_buffer_size);
 
     filesink->current_buffer_size += gst_buffer_get_size (buffer);
     gst_buffer_list_add (filesink->buffer, gst_buffer_ref (buffer));