Improved FFmpeg error reports when audio stream failed to be allocated
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 19 Nov 2012 17:22:40 +0000 (17:22 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 19 Nov 2012 17:22:40 +0000 (17:22 +0000)
Also fixed crash using --debug-ffmpeg caused by BLI_vsnprintf modifies
va_list -- need to create copy of list if this list is gonna to be reused.

source/blender/blenkernel/intern/writeffmpeg.c
source/blender/imbuf/intern/util.c

index da9c919..7e73992 100644 (file)
@@ -599,12 +599,14 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex
 
 /* Prepare an audio stream for the output file */
 
-static AVStream *alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContext *of)
+static AVStream *alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContext *of, char *error, int error_size)
 {
        AVStream *st;
        AVCodecContext *c;
        AVCodec *codec;
 
+       error[0] = '\0';
+
        st = av_new_stream(of, 1);
        if (!st) return NULL;
 
@@ -626,6 +628,7 @@ static AVStream *alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContex
 
        if (avcodec_open(c, codec) < 0) {
                //XXX error("Couldn't initialize audio codec");
+               BLI_strncpy(error, IMB_ffmpeg_last_error(), error_size);
                return NULL;
        }
 
@@ -801,9 +804,12 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report
        }
 
        if (ffmpeg_audio_codec != CODEC_ID_NONE) {
-               audio_stream = alloc_audio_stream(rd, fmt->audio_codec, of);
+               audio_stream = alloc_audio_stream(rd, fmt->audio_codec, of, error, sizeof(error));
                if (!audio_stream) {
-                       BKE_report(reports, RPT_ERROR, "Error initializing audio stream");
+                       if (error[0])
+                               BKE_report(reports, RPT_ERROR, error);
+                       else
+                               BKE_report(reports, RPT_ERROR, "Error initializing audio stream");
                        av_dict_free(&opts);
                        return 0;
                }
index fe138a7..7cd4f47 100644 (file)
@@ -228,6 +228,10 @@ static int isqtime(const char *name)
 
 #ifdef WITH_FFMPEG
 
+#ifdef _MS_VER
+#define va_copy(dst, src) ((dst) = (src))
+#endif
+
 /* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wmissing-format-attribute"
@@ -237,7 +241,12 @@ static char ffmpeg_last_error[1024];
 static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_list arg)
 {
        if (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
-               size_t n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, arg);
+               size_t n;
+               va_list arg2;
+
+               va_copy(arg2, arg);
+
+               n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, arg2);
 
                /* strip trailing \n */
                ffmpeg_last_error[n - 1] = '\0';