[FFmpeg-devel] [PATCH] ffmpeg: Support copying unknown streams

Michael Niedermayer michaelni at gmx.at
Thu May 21 17:17:26 CEST 2015


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 ffmpeg.c     |    1 +
 ffmpeg_opt.c |   24 +++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index a89ae39..da3ab91 100644
--- 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;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index d70318c..8edc988 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -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" },
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list