GstFlowReturn
gst_writev_buffers (GstObject * sink, gint fd, GstPoll * fdset,
GstBuffer ** buffers, guint num_buffers, guint8 * mem_nums,
- guint total_mem_num, guint64 * total_written, guint64 * cur_pos)
+ guint total_mem_num, guint64 * bytes_written, guint64 skip)
{
struct iovec *vecs;
GstMapInfo *map_infos;
guint n_vecs = total_mem_num;
left = size;
+
+ if (skip) {
+ ret = skip;
+ errno = 0;
+ goto skip_first;
+ }
+
do {
#ifndef HAVE_WIN32
if (fdset != NULL) {
ret = gst_writev (fd, vecs, n_vecs, left);
if (ret > 0) {
- if (total_written)
- *total_written += ret;
- if (cur_pos)
- *cur_pos += ret;
+ if (bytes_written)
+ *bytes_written += ret;
}
+ skip_first:
+
if (ret == left)
break;
GstFlowReturn gst_writev_buffers (GstObject * sink, gint fd, GstPoll * fdset,
GstBuffer ** buffers, guint num_buffers,
guint8 * mem_nums, guint total_mem_num,
- guint64 * total_written, guint64 * cur_pos);
+ guint64 * bytes_written, guint64 skip);
G_END_DECLS
gst_fd_sink_render_buffers (GstFdSink * sink, GstBuffer ** buffers,
guint num_buffers, guint8 * mem_nums, guint total_mems)
{
- return gst_writev_buffers (GST_OBJECT_CAST (sink), sink->fd, sink->fdset,
- buffers, num_buffers, mem_nums, total_mems, &sink->bytes_written,
- &sink->current_pos);
+ GstFlowReturn ret;
+ guint64 skip = 0;
+
+ for (;;) {
+ guint64 bytes_written = 0;
+
+ ret = gst_writev_buffers (GST_OBJECT_CAST (sink), sink->fd, sink->fdset,
+ buffers, num_buffers, mem_nums, total_mems, &bytes_written, skip);
+
+ sink->bytes_written += bytes_written;
+ sink->current_pos += bytes_written;
+ skip += bytes_written;
+
+ if (!sink->unlock)
+ break;
+
+ ret = gst_base_sink_wait_preroll (GST_BASE_SINK (sink));
+ if (ret != GST_FLOW_OK)
+ return ret;
+ }
+
+ return ret;
}
static GstFlowReturn
GST_LOG_OBJECT (fdsink, "Flushing");
GST_OBJECT_LOCK (fdsink);
+ fdsink->unlock = TRUE;
gst_poll_set_flushing (fdsink->fdset, TRUE);
GST_OBJECT_UNLOCK (fdsink);
GST_LOG_OBJECT (fdsink, "No longer flushing");
GST_OBJECT_LOCK (fdsink);
+ fdsink->unlock = FALSE;
gst_poll_set_flushing (fdsink->fdset, FALSE);
GST_OBJECT_UNLOCK (fdsink);
num_buffers, total_mems, sink->current_pos);
return gst_writev_buffers (GST_OBJECT_CAST (sink), fileno (sink->file), NULL,
- buffers, num_buffers, mem_nums, total_mems, NULL, &sink->current_pos);
+ buffers, num_buffers, mem_nums, total_mems, &sink->current_pos, 0);
}
static GstFlowReturn