]> git.sesse.net Git - ffmpeg/commitdiff
ffmpeg: Support copying unknown streams
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 20 May 2015 22:34:41 +0000 (00:34 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 21 May 2015 16:21:38 +0000 (18:21 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
ffmpeg.c
ffmpeg_opt.c

index a89ae399bfa1d04dc0b414f67713ef48933d7d63..da3ab911f121cb21d5870162d59137661fc3f1a7 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2822,6 +2822,7 @@ static int transcode_init(void)
                 enc_ctx->width  = dec_ctx->width;
                 enc_ctx->height = dec_ctx->height;
                 break;
+            case AVMEDIA_TYPE_UNKNOWN:
             case AVMEDIA_TYPE_DATA:
             case AVMEDIA_TYPE_ATTACHMENT:
                 break;
index d70318cdf3648404be42b4ff40235b3983e84165..8edc98865c7757ec364088d61505099e61036d5a 100644 (file)
@@ -112,6 +112,7 @@ static int input_sync;
 static int override_ffserver  = 0;
 static int input_stream_potentially_available = 0;
 static int ignore_unknown_streams = 0;
+static int copy_unknown_streams = 0;
 
 static void uninit_options(OptionsContext *o)
 {
@@ -1566,6 +1567,19 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int
     return ost;
 }
 
+static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
+{
+    OutputStream *ost;
+
+    ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
+    if (!ost->stream_copy) {
+        av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
+        exit_program(1);
+    }
+
+    return ost;
+}
+
 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
 {
     OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
@@ -2018,6 +2032,11 @@ loop_end:
                 case AVMEDIA_TYPE_SUBTITLE:   ost = new_subtitle_stream  (o, oc, src_idx); break;
                 case AVMEDIA_TYPE_DATA:       ost = new_data_stream      (o, oc, src_idx); break;
                 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
+                case AVMEDIA_TYPE_UNKNOWN:
+                    if (copy_unknown_streams) {
+                        ost = new_unknown_stream   (o, oc, src_idx);
+                        break;
+                    }
                 default:
                     av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
                            "Cannot map stream #%d:%d - unsupported type.\n",
@@ -2025,7 +2044,8 @@ loop_end:
                     if (!ignore_unknown_streams) {
                         av_log(NULL, AV_LOG_FATAL,
                                "If you want unsupported types ignored instead "
-                               "of failing, please use the -ignore_unknown option\n");
+                               "of failing, please use the -ignore_unknown option\n"
+                               "If you want them copied, please use -copy_unknown\n");
                         exit_program(1);
                     }
                 }
@@ -2864,6 +2884,8 @@ const OptionDef options[] = {
         "never overwrite output files" },
     { "ignore_unknown", OPT_BOOL,                                    {              &ignore_unknown_streams },
         "Ignore unknown stream types" },
+    { "copy_unknown",   OPT_BOOL | OPT_EXPERT,                       {              &copy_unknown_streams },
+        "Copy unknown stream types" },
     { "c",              HAS_ARG | OPT_STRING | OPT_SPEC |
                         OPT_INPUT | OPT_OUTPUT,                      { .off       = OFFSET(codec_names) },
         "codec name", "codec" },