diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c index 26fa1ea910..d2ad8b594d 100644 --- a/plugins/elements/gstfilesink.c +++ b/plugins/elements/gstfilesink.c @@ -102,6 +102,44 @@ enum PROP_LAST }; +/* Copy of glib's g_fopen due to win32 libc/cross-DLL brokenness: we can't + * use the 'file pointer' opened in glib (and returned from this function) + * in this library, as they may have unrelated C runtimes. */ +FILE * +gst_fopen (const gchar * filename, const gchar * mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + wchar_t *wmode; + FILE *retval; + int save_errno; + + if (wfilename == NULL) { + errno = EINVAL; + return NULL; + } + + wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL); + + if (wmode == NULL) { + g_free (wfilename); + errno = EINVAL; + return NULL; + } + + retval = _wfopen (wfilename, wmode); + save_errno = errno; + + g_free (wfilename); + g_free (wmode); + + errno = save_errno; + return retval; +#else + return fopen (filename, mode); +#endif +} + static void gst_file_sink_dispose (GObject * object); static void gst_file_sink_set_property (GObject * object, guint prop_id, @@ -334,13 +372,10 @@ gst_file_sink_open_file (GstFileSink * sink) if (sink->filename == NULL || sink->filename[0] == '\0') goto no_filename; - /* FIXME, can we use g_fopen here? some people say that the FILE object is - * local to the .so that performed the fopen call, which would not be us when - * we use g_fopen. */ if (sink->append) - sink->file = fopen (sink->filename, "ab"); + sink->file = gst_fopen (sink->filename, "ab"); else - sink->file = fopen (sink->filename, "wb"); + sink->file = gst_fopen (sink->filename, "wb"); if (sink->file == NULL) goto open_failed;