static const GstElementDetails gst_multi_file_sink_details =
GST_ELEMENT_DETAILS ("Multi-File Sink",
"Sink/File",
- "Write stream to a file",
+ "Write buffers to a sequentially named set of files",
"David Schleef <ds@schleef.org>");
enum
gstbasesink_class->get_times = NULL;
gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_multi_file_sink_render);
-
- if (sizeof (off_t) < 8) {
- GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT,
- sizeof (off_t));
- }
}
static void
}
}
-#ifdef G_OS_UNIX
-# define __GST_STDIO_SEEK_FUNCTION "lseek"
-#else
-# define __GST_STDIO_SEEK_FUNCTION "fseek"
-#endif
-
static gchar *
gst_multi_file_sink_get_filename (GstMultiFileSink * multifilesink)
{
GstMultiFileSink *multifilesink;
guint size;
gchar *filename;
- FILE *file;
+ gboolean ret;
+ GError *error = NULL;
size = GST_BUFFER_SIZE (buffer);
filename = gst_multi_file_sink_get_filename (multifilesink);
- file = fopen (filename, "wb");
- if (!file) {
- goto handle_error;
- }
-
- g_free (filename);
-
- if (size > 0 && GST_BUFFER_DATA (buffer) != NULL) {
- if (fwrite (GST_BUFFER_DATA (buffer), size, 1, file) != 1)
- goto handle_error;
+ ret = g_file_set_contents (filename, (char *) GST_BUFFER_DATA (buffer),
+ size, &error);
+ if (ret) {
+ multifilesink->index++;
+ g_free (filename);
+ return GST_FLOW_OK;
}
- multifilesink->index++;
-
- fclose (file);
-
- return GST_FLOW_OK;
-
-handle_error:
- {
- switch (errno) {
- case ENOSPC:{
- GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, (NULL),
- (NULL));
- break;
- }
- default:{
- GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE,
- ("Error while writing to file \"%s\".", multifilesink->filename),
- ("%s", g_strerror (errno)));
- }
+ 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)));
}
- return GST_FLOW_ERROR;
}
+ g_error_free (error);
+ g_free (filename);
+
+ return GST_FLOW_ERROR;
}
static const GstElementDetails gst_multi_file_src_details =
GST_ELEMENT_DETAILS ("Multi-File Source",
"Source/File",
- "Read stream from files",
+ "Read a sequentially named set of files into buffers",
"David Schleef <ds@schleef.org>");
enum
{
GstMultiFileSrc *multifilesrc;
guint size;
+ gchar *data;
gchar *filename;
- FILE *file;
GstBuffer *buf;
- int ret;
+ gboolean ret;
+ GError *error = NULL;
multifilesrc = GST_MULTI_FILE_SRC (src);
GST_DEBUG_OBJECT (multifilesrc, "reading from file \"%s\".", filename);
- file = fopen (filename, "rb");
- if (!file) {
+ ret = g_file_get_contents (filename, &data, &size, &error);
+ if (!ret) {
if (multifilesrc->successful_read) {
/* If we've read at least one buffer successfully, not finding the
* next file is EOS. */
}
}
- fseek (file, 0, SEEK_END);
- size = ftell (file);
- fseek (file, 0, SEEK_SET);
-
- buf = gst_buffer_new_and_alloc (size);
-
- ret = fread (GST_BUFFER_DATA (buf), size, 1, file);
- if (ret < 1) {
- goto handle_error;
- }
-
multifilesrc->successful_read = TRUE;
multifilesrc->index++;
+ buf = gst_buffer_new ();
+ GST_BUFFER_DATA (buf) = (unsigned char *) data;
GST_BUFFER_SIZE (buf) = size;
GST_BUFFER_OFFSET (buf) = multifilesrc->offset;
GST_BUFFER_OFFSET_END (buf) = multifilesrc->offset + size;
GST_DEBUG_OBJECT (multifilesrc, "read file \"%s\".", filename);
- fclose (file);
g_free (filename);
*buffer = buf;
return GST_FLOW_OK;
gst_element_set_state (pipeline, GST_STATE_NULL);
}
+gchar *
+g_mkdtemp (const gchar * template)
+{
+ gchar *s;
+ gchar *tmpdir;
+
+ s = g_strdup (template);
+ tmpdir = mkdtemp (s);
+ if (tmpdir == NULL) {
+ g_free (s);
+ }
+ return tmpdir;
+}
+
GST_START_TEST (test_multifilesink)
{
GstElement *pipeline;
+ GstElement *mfs;
int i;
+ const gchar *tmpdir;
+ gchar *my_tmpdir;
+ gchar *template;
+ gchar *mfs_pattern;
- g_mkdir ("tmpdir", 0700);
+ tmpdir = g_get_tmp_dir ();
+ template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL);
+ my_tmpdir = g_mkdtemp (template);
+ fail_if (my_tmpdir == NULL);
pipeline =
gst_parse_launch
- ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink location=tmpdir/%05d",
+ ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink",
NULL);
fail_if (pipeline == NULL);
+ mfs = gst_bin_get_by_name (GST_BIN (pipeline), "multifilesink0");
+ fail_if (mfs == NULL);
+ mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL);
+ g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL);
run_pipeline (pipeline);
gst_object_unref (pipeline);
for (i = 0; i < 10; i++) {
- char s[20];
+ char *s;
- sprintf (s, "tmpdir/%05d", i);
+ s = g_strdup_printf (mfs_pattern, i);
fail_if (g_remove (s) != 0);
+ g_free (s);
}
- fail_if (g_remove ("tmpdir") != 0);
+ fail_if (g_remove (my_tmpdir) != 0);
+ g_free (mfs_pattern);
+ g_free (my_tmpdir);
+ g_free (template);
}
GST_END_TEST;
GST_START_TEST (test_multifilesrc)
{
GstElement *pipeline;
+ GstElement *mfs;
int i;
+ const gchar *tmpdir;
+ gchar *my_tmpdir;
+ gchar *template;
+ gchar *mfs_pattern;
- g_mkdir ("tmpdir", 0700);
+ tmpdir = g_get_tmp_dir ();
+ template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL);
+ my_tmpdir = g_mkdtemp (template);
+ fail_if (my_tmpdir == NULL);
pipeline =
gst_parse_launch
- ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink location=tmpdir/%05d",
+ ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink",
NULL);
fail_if (pipeline == NULL);
+ mfs = gst_bin_get_by_name (GST_BIN (pipeline), "multifilesink0");
+ fail_if (mfs == NULL);
+ mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL);
+ g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL);
run_pipeline (pipeline);
gst_object_unref (pipeline);
pipeline =
gst_parse_launch
- ("multifilesrc location=tmpdir/%05d ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=10/1 ! fakesink",
+ ("multifilesrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=10/1 ! fakesink",
NULL);
fail_if (pipeline == NULL);
+ mfs = gst_bin_get_by_name (GST_BIN (pipeline), "multifilesrc0");
+ fail_if (mfs == NULL);
+ mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL);
+ g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL);
run_pipeline (pipeline);
gst_object_unref (pipeline);
for (i = 0; i < 10; i++) {
- char s[20];
+ char *s;
- sprintf (s, "tmpdir/%05d", i);
+ s = g_strdup_printf (mfs_pattern, i);
fail_if (g_remove (s) != 0);
+ g_free (s);
}
- fail_if (g_remove ("tmpdir") != 0);
+ fail_if (g_remove (my_tmpdir) != 0);
+ g_free (mfs_pattern);
+ g_free (my_tmpdir);
+ g_free (template);
}
GST_END_TEST;