X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=plugins%2Felements%2Fgstfdsink.c;h=f4eb10073537ca0942ab96b1b9dda07da7b5578c;hb=748687fc30001b3bca0218ae909ee31f75f24e00;hp=012feafe527b9191848d7da095c1db5a9cf1d176;hpb=dc73245edded2000bf3e489e7262319635989f97;p=platform%2Fupstream%2Fgstreamer.git diff --git a/plugins/elements/gstfdsink.c b/plugins/elements/gstfdsink.c index 012feaf..f4eb100 100644 --- a/plugins/elements/gstfdsink.c +++ b/plugins/elements/gstfdsink.c @@ -68,6 +68,15 @@ #define off_t guint64 #endif +#ifdef __BIONIC__ /* Android */ +#undef lseek +#define lseek lseek64 +#undef fstat +#define fstat fstat64 +#undef off_t +#define off_t guint64 +#endif + static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -137,8 +146,7 @@ gst_fd_sink_class_init (GstFdSinkClass * klass) "Filedescriptor Sink", "Sink/File", "Write data to a file descriptor", "Erik Walthinsen "); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&sinktemplate)); + gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_fd_sink_render); gstbasesink_class->render_list = GST_DEBUG_FUNCPTR (gst_fd_sink_render_list); @@ -235,9 +243,28 @@ static GstFlowReturn 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 @@ -279,107 +306,22 @@ no_data: } static GstFlowReturn -gst_fd_sink_render (GstBaseSink * sink, GstBuffer * buffer) +gst_fd_sink_render (GstBaseSink * bsink, GstBuffer * buffer) { - GstFdSink *fdsink; - GstMapInfo info; - guint8 *ptr; - gsize left; - gint written; - -#ifndef HAVE_WIN32 - gint retval; -#endif - - fdsink = GST_FD_SINK (sink); - - g_return_val_if_fail (fdsink->fd >= 0, GST_FLOW_ERROR); - - gst_buffer_map (buffer, &info, GST_MAP_READ); - - ptr = info.data; - left = info.size; - -again: -#ifndef HAVE_WIN32 - do { - GST_DEBUG_OBJECT (fdsink, "going into select, have %" G_GSIZE_FORMAT - " bytes to write", info.size); - retval = gst_poll_wait (fdsink->fdset, GST_CLOCK_TIME_NONE); - } while (retval == -1 && (errno == EINTR || errno == EAGAIN)); - - if (retval == -1) { - if (errno == EBUSY) - goto stopped; - else - goto select_error; - } -#endif - - GST_DEBUG_OBJECT (fdsink, "writing %" G_GSIZE_FORMAT " bytes to" - " file descriptor %d", info.size, fdsink->fd); - - written = write (fdsink->fd, ptr, left); - - /* check for errors */ - if (G_UNLIKELY (written < 0)) { - /* try to write again on non-fatal errors */ - if (errno == EAGAIN || errno == EINTR) - goto again; - - /* else go to our error handler */ - goto write_error; - } - - /* all is fine when we get here */ - left -= written; - ptr += written; - fdsink->bytes_written += written; - fdsink->current_pos += written; - - GST_DEBUG_OBJECT (fdsink, "wrote %d bytes, %" G_GSIZE_FORMAT " left", written, - left); + GstFlowReturn flow; + GstFdSink *sink; + guint8 n_mem; - /* short write, select and try to write the remainder */ - if (G_UNLIKELY (left > 0)) - goto again; + sink = GST_FD_SINK_CAST (bsink); - gst_buffer_unmap (buffer, &info); + n_mem = gst_buffer_n_memory (buffer); - return GST_FLOW_OK; + if (n_mem > 0) + flow = gst_fd_sink_render_buffers (sink, &buffer, 1, &n_mem, n_mem); + else + flow = GST_FLOW_OK; -#ifndef HAVE_WIN32 -select_error: - { - GST_ELEMENT_ERROR (fdsink, RESOURCE, READ, (NULL), - ("select on file descriptor: %s.", g_strerror (errno))); - GST_DEBUG_OBJECT (fdsink, "Error during select"); - gst_buffer_unmap (buffer, &info); - return GST_FLOW_ERROR; - } -stopped: - { - GST_DEBUG_OBJECT (fdsink, "Select stopped"); - gst_buffer_unmap (buffer, &info); - return GST_FLOW_FLUSHING; - } -#endif - -write_error: - { - switch (errno) { - case ENOSPC: - GST_ELEMENT_ERROR (fdsink, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL)); - break; - default:{ - GST_ELEMENT_ERROR (fdsink, RESOURCE, WRITE, (NULL), - ("Error while writing to file descriptor %d: %s", - fdsink->fd, g_strerror (errno))); - } - } - gst_buffer_unmap (buffer, &info); - return GST_FLOW_ERROR; - } + return flow; } static gboolean @@ -480,6 +422,7 @@ gst_fd_sink_unlock (GstBaseSink * basesink) GST_LOG_OBJECT (fdsink, "Flushing"); GST_OBJECT_LOCK (fdsink); + fdsink->unlock = TRUE; gst_poll_set_flushing (fdsink->fdset, TRUE); GST_OBJECT_UNLOCK (fdsink); @@ -493,6 +436,7 @@ gst_fd_sink_unlock_stop (GstBaseSink * basesink) 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);