avconv: fix a segfault on -c copy with -filter_complex.
authorAnton Khirnov <anton@khirnov.net>
Sat, 21 Apr 2012 05:03:06 +0000 (07:03 +0200)
committerAnton Khirnov <anton@khirnov.net>
Tue, 24 Apr 2012 04:30:02 +0000 (06:30 +0200)
avconv.c

index e441fff..6c3a01f 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -2612,7 +2612,11 @@ static int transcode_init(void)
         }
 
         if (ost->stream_copy) {
         }
 
         if (ost->stream_copy) {
-            uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
+            uint64_t extra_size;
+
+            av_assert0(ist && !ost->filter);
+
+            extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
 
             if (extra_size > INT_MAX) {
                 return AVERROR(EINVAL);
 
             if (extra_size > INT_MAX) {
                 return AVERROR(EINVAL);
@@ -4194,6 +4198,13 @@ static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
 
     ofilter->ost      = ost;
 
 
     ofilter->ost      = ost;
 
+    if (ost->stream_copy) {
+        av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
+               "which is fed from a complex filtergraph. Filtering and streamcopy "
+               "cannot be used together.\n", ost->file_index, ost->index);
+        exit_program(1);
+    }
+
     if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
         av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
         exit_program(1);
     if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
         av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
         exit_program(1);