The new option doesn't depend on its placement wrt -new* options (which
don't exist anymore) and works in a similar way as per-stream AVOptions.

Breaks presets for now. But only libx264 uses them anyway and it now
has the 'preset' private option, so presets in avconv serve no purpose.
---
 avconv.c        |  273 ++++++++++++++++++++-----------------------------------
 doc/avconv.texi |   85 +++++++----------
 2 files changed, 133 insertions(+), 225 deletions(-)

diff --git a/avconv.c b/avconv.c
index 24e4fb5..a9f2e66 100644
--- a/avconv.c
+++ b/avconv.c
@@ -109,6 +109,8 @@ static int nb_output_files = 0;
 static StreamMap *stream_maps = NULL;
 static int nb_stream_maps;
 
+static AVDictionary *codec_names;
+
 /* first item specifies output metadata, second is input */
 static MetadataMap (*meta_data_maps)[2] = NULL;
 static int nb_meta_data_maps;
@@ -135,7 +137,6 @@ static uint16_t *inter_matrix = NULL;
 static const char *video_rc_override_string=NULL;
 static int video_disable = 0;
 static int video_discard = 0;
-static char *video_codec_name = NULL;
 static unsigned int video_codec_tag = 0;
 static char *video_language = NULL;
 static int same_quality = 0;
@@ -154,17 +155,14 @@ static int audio_sample_rate = 0;
 static float audio_qscale = QSCALE_NONE;
 static int audio_disable = 0;
 static int audio_channels = 0;
-static char  *audio_codec_name = NULL;
 static unsigned int audio_codec_tag = 0;
 static char *audio_language = NULL;
 
 static int subtitle_disable = 0;
-static char *subtitle_codec_name = NULL;
 static char *subtitle_language = NULL;
 static unsigned int subtitle_codec_tag = 0;
 
 static int data_disable = 0;
-static char *data_codec_name = NULL;
 static unsigned int data_codec_tag = 0;
 
 static float mux_preload= 0.5;
@@ -181,10 +179,6 @@ static int do_pkt_dump = 0;
 static int do_psnr = 0;
 static int do_pass = 0;
 static char *pass_logfilename_prefix = NULL;
-static int audio_stream_copy = 0;
-static int video_stream_copy = 0;
-static int subtitle_stream_copy = 0;
-static int data_stream_copy = 0;
 static int video_sync_method= -1;
 static int audio_sync_method= 0;
 static float audio_drift_threshold= 0.1;
@@ -469,11 +463,6 @@ static int exit_program(int ret)
     av_freep(&input_streams);
     av_freep(&input_files);
 
-    av_free(video_codec_name);
-    av_free(audio_codec_name);
-    av_free(subtitle_codec_name);
-    av_free(data_codec_name);
-
     uninit_opts();
     av_free(audio_buf);
     av_free(audio_out);
@@ -647,7 +636,59 @@ static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
     }
 }
 
-static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, 
AVCodec *codec)
+static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
+{
+    const char *codec_string = encoder ? "encoder" : "decoder";
+    AVCodec *codec;
+
+    if(!name)
+        return CODEC_ID_NONE;
+    codec = encoder ?
+        avcodec_find_encoder_by_name(name) :
+        avcodec_find_decoder_by_name(name);
+    if(!codec) {
+        fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
+        exit_program(1);
+    }
+    if(codec->type != type) {
+        fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
+        exit_program(1);
+    }
+    return codec->id;
+}
+
+static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum 
AVMediaType type, AVDictionary *codec_names)
+{
+    AVDictionaryEntry *e = NULL;
+    char *codec_name = NULL;
+    int ret;
+
+    while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
+        char *p = strchr(e->key, ':');
+
+        if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
+            codec_name = e->value;
+        else if (ret < 0)
+            exit_program(1);
+    }
+
+    if (!codec_name) {
+        if (s->oformat) {
+            st->codec->codec_id = av_guess_codec(s->oformat, NULL, 
s->filename, NULL, type);
+            return avcodec_find_encoder(st->codec->codec_id);
+        }
+    } else if (!strcmp(codec_name, "copy"))
+        st->stream_copy = 1;
+    else {
+        st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat 
== NULL);
+        return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
+                            avcodec_find_decoder_by_name(codec_name);
+    }
+
+    return NULL;
+}
+
+static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, enum 
AVMediaType type)
 {
     OutputStream *ost;
     AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? 
streamid_map[oc->nb_streams] : 0);
@@ -672,13 +713,14 @@ static OutputStream *new_output_stream(AVFormatContext 
*oc, int file_idx, AVCode
     ost->file_index = file_idx;
     ost->index = idx;
     ost->st    = st;
-    ost->enc   = codec;
-    if (codec) {
-        st->codec->codec_type = codec->type;
-        ost->opts  = filter_codec_opts(codec_opts, codec->id, oc, st);
+    st->codec->codec_type = type;
+    ost->enc = choose_codec(oc, st, type, codec_names);
+    if (ost->enc) {
+        ost->opts  = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
     }
 
-    avcodec_get_context_defaults3(st->codec, codec);
+    avcodec_get_context_defaults3(st->codec, ost->enc);
+    st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() 
sets type to unknown for stream copy
 
     ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
     return ost;
@@ -700,7 +742,7 @@ static int read_avserver_streams(AVFormatContext *s, const 
char *filename)
         AVCodec *codec;
 
         codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
-        ost   = new_output_stream(s, nb_output_files, codec);
+        ost   = new_output_stream(s, nb_output_files, codec->type);
         st    = ost->st;
 
         // FIXME: a more elegant solution is needed
@@ -708,17 +750,10 @@ static int read_avserver_streams(AVFormatContext *s, 
const char *filename)
         st->info = NULL;
         avcodec_copy_context(st->codec, ic->streams[i]->codec);
 
-        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
-            if (audio_stream_copy) {
-                st->stream_copy = 1;
-            } else
-                choose_sample_fmt(st, codec);
-        } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
-            if (video_stream_copy) {
-                st->stream_copy = 1;
-            } else
-                choose_pixel_fmt(st, codec);
-        }
+        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
+            choose_sample_fmt(st, codec);
+        else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && 
!st->stream_copy)
+            choose_pixel_fmt(st, codec);
 
         if(st->codec->flags & CODEC_FLAG_BITEXACT)
             nopts = 1;
@@ -2728,36 +2763,9 @@ static int opt_audio_channels(const char *opt, const 
char *arg)
     return 0;
 }
 
-static int opt_codec(int *pstream_copy, char **pcodec_name,
-                      int codec_type, const char *arg)
-{
-    av_freep(pcodec_name);
-    if (!strcmp(arg, "copy")) {
-        *pstream_copy = 1;
-    } else {
-        *pcodec_name = av_strdup(arg);
-    }
-    return 0;
-}
-
-static int opt_audio_codec(const char *opt, const char *arg)
-{
-    return opt_codec(&audio_stream_copy, &audio_codec_name, 
AVMEDIA_TYPE_AUDIO, arg);
-}
-
-static int opt_video_codec(const char *opt, const char *arg)
-{
-    return opt_codec(&video_stream_copy, &video_codec_name, 
AVMEDIA_TYPE_VIDEO, arg);
-}
-
-static int opt_subtitle_codec(const char *opt, const char *arg)
+static int opt_codec(const char *opt, const char *arg)
 {
-    return opt_codec(&subtitle_stream_copy, &subtitle_codec_name, 
AVMEDIA_TYPE_SUBTITLE, arg);
-}
-
-static int opt_data_codec(const char *opt, const char *arg)
-{
-    return opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, 
arg);
+    return av_dict_set(&codec_names, opt, arg, 0);
 }
 
 static int opt_codec_tag(const char *opt, const char *arg)
@@ -2926,26 +2934,6 @@ static int opt_input_ts_offset(const char *opt, const 
char *arg)
     return 0;
 }
 
-static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
-{
-    const char *codec_string = encoder ? "encoder" : "decoder";
-    AVCodec *codec;
-
-    if(!name)
-        return CODEC_ID_NONE;
-    codec = encoder ?
-        avcodec_find_encoder_by_name(name) :
-        avcodec_find_decoder_by_name(name);
-    if(!codec) {
-        fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
-        exit_program(1);
-    }
-    if(codec->type != type) {
-        fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
-        exit_program(1);
-    }
-    return codec->id;
-}
 
 static int opt_input_file(const char *opt, const char *filename)
 {
@@ -2996,12 +2984,6 @@ static int opt_input_file(const char *opt, const char 
*filename)
     if (frame_pix_fmt != PIX_FMT_NONE)
         av_dict_set(&format_opts, "pixel_format", 
av_get_pix_fmt_name(frame_pix_fmt), 0);
 
-    ic->video_codec_id   =
-        find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0);
-    ic->audio_codec_id   =
-        find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0);
-    ic->subtitle_codec_id=
-        find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
     ic->flags |= AVFMT_FLAG_NONBLOCK;
 
     /* open the input file with generic libav function */
@@ -3036,6 +3018,10 @@ static int opt_input_file(const char *opt, const char 
*filename)
         opt_programid=0;
     }
 
+    /* apply forced codec ids */
+    for (i = 0; i < ic->nb_streams; i++)
+        choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, 
codec_names);
+
     /* Set AVCodecContext options for avformat_find_stream_info */
     opts = setup_find_stream_info_opts(ic, codec_opts);
     orig_nb_streams = ic->nb_streams;
@@ -3083,14 +3069,14 @@ static int opt_input_file(const char *opt, const char 
*filename)
         if (i < nb_ts_scale)
             ist->ts_scale = ts_scale[i];
 
+        ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
+
         switch (dec->codec_type) {
         case AVMEDIA_TYPE_AUDIO:
-            ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
             if(audio_disable)
                 st->discard= AVDISCARD_ALL;
             break;
         case AVMEDIA_TYPE_VIDEO:
-            ist->dec = avcodec_find_decoder_by_name(video_codec_name);
             rfps      = ic->streams[i]->r_frame_rate.num;
             rfps_base = ic->streams[i]->r_frame_rate.den;
             if (dec->lowres) {
@@ -3118,7 +3104,6 @@ static int opt_input_file(const char *opt, const char 
*filename)
         case AVMEDIA_TYPE_DATA:
             break;
         case AVMEDIA_TYPE_SUBTITLE:
-            ist->dec = avcodec_find_decoder_by_name(subtitle_codec_name);
             if(subtitle_disable)
                 st->discard = AVDISCARD_ALL;
             break;
@@ -3152,9 +3137,7 @@ static int opt_input_file(const char *opt, const char 
*filename)
     for (i = 0; i < orig_nb_streams; i++)
         av_dict_free(&opts[i]);
     av_freep(&opts);
-    av_freep(&video_codec_name);
-    av_freep(&audio_codec_name);
-    av_freep(&subtitle_codec_name);
+    av_dict_free(&codec_names);
     uninit_opts();
     init_opts();
     return 0;
@@ -3165,22 +3148,10 @@ static OutputStream *new_video_stream(AVFormatContext 
*oc, int file_idx)
     AVStream *st;
     OutputStream *ost;
     AVCodecContext *video_enc;
-    enum CodecID codec_id = CODEC_ID_NONE;
-    AVCodec *codec= NULL;
-
-    if(!video_stream_copy){
-        if (video_codec_name) {
-            codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 
1);
-            codec = avcodec_find_encoder_by_name(video_codec_name);
-        } else {
-            codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, 
AVMEDIA_TYPE_VIDEO);
-            codec = avcodec_find_encoder(codec_id);
-        }
-    }
 
-    ost = new_output_stream(oc, file_idx, codec);
+    ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_VIDEO);
     st  = ost->st;
-    if (!video_stream_copy) {
+    if (!st->stream_copy) {
         ost->frame_aspect_ratio = frame_aspect_ratio;
         frame_aspect_ratio = 0;
 #if CONFIG_AVFILTER
@@ -3203,9 +3174,7 @@ static OutputStream *new_video_stream(AVFormatContext 
*oc, int file_idx)
         video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
 
-    video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
-    if (video_stream_copy) {
-        st->stream_copy = 1;
+    if (st->stream_copy) {
         video_enc->sample_aspect_ratio =
         st->sample_aspect_ratio = 
av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
     } else {
@@ -3214,7 +3183,6 @@ static OutputStream *new_video_stream(AVFormatContext 
*oc, int file_idx)
 
         if (frame_rate.num)
             ost->frame_rate = frame_rate;
-        video_enc->codec_id = codec_id;
 
         video_enc->width = frame_width;
         video_enc->height = frame_height;
@@ -3285,9 +3253,7 @@ static OutputStream *new_video_stream(AVFormatContext 
*oc, int file_idx)
 
     /* reset some key parameters */
     video_disable = 0;
-    av_freep(&video_codec_name);
     av_freep(&forced_key_frames);
-    video_stream_copy = 0;
     frame_pix_fmt = PIX_FMT_NONE;
     return ost;
 }
@@ -3296,20 +3262,9 @@ static OutputStream *new_audio_stream(AVFormatContext 
*oc, int file_idx)
 {
     AVStream *st;
     OutputStream *ost;
-    AVCodec *codec= NULL;
     AVCodecContext *audio_enc;
-    enum CodecID codec_id = CODEC_ID_NONE;
 
-    if(!audio_stream_copy){
-        if (audio_codec_name) {
-            codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 
1);
-            codec = avcodec_find_encoder_by_name(audio_codec_name);
-        } else {
-            codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, 
AVMEDIA_TYPE_AUDIO);
-            codec = avcodec_find_encoder(codec_id);
-        }
-    }
-    ost = new_output_stream(oc, file_idx, codec);
+    ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_AUDIO);
     st  = ost->st;
 
     ost->bitstream_filters = audio_bitstream_filters;
@@ -3326,11 +3281,7 @@ static OutputStream *new_audio_stream(AVFormatContext 
*oc, int file_idx)
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
         audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
-    if (audio_stream_copy) {
-        st->stream_copy = 1;
-    } else {
-        audio_enc->codec_id = codec_id;
-
+    if (!st->stream_copy) {
         if (audio_qscale > QSCALE_NONE) {
             audio_enc->flags |= CODEC_FLAG_QSCALE;
             audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
@@ -3349,8 +3300,6 @@ static OutputStream *new_audio_stream(AVFormatContext 
*oc, int file_idx)
 
     /* reset some key parameters */
     audio_disable = 0;
-    av_freep(&audio_codec_name);
-    audio_stream_copy = 0;
 
     return ost;
 }
@@ -3361,29 +3310,22 @@ static OutputStream *new_data_stream(AVFormatContext 
*oc, int file_idx)
     OutputStream *ost;
     AVCodecContext *data_enc;
 
-    ost = new_output_stream(oc, file_idx, NULL);
+    ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_DATA);
     st  = ost->st;
     data_enc = st->codec;
-    if (!data_stream_copy) {
+    if (!st->stream_copy) {
         fprintf(stderr, "Data stream encoding not supported yet (only 
streamcopy)\n");
         exit_program(1);
     }
 
-    data_enc->codec_type = AVMEDIA_TYPE_DATA;
-
     if (data_codec_tag)
         data_enc->codec_tag= data_codec_tag;
 
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
         data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
-    if (data_stream_copy) {
-        st->stream_copy = 1;
-    }
 
     data_disable = 0;
-    av_freep(&data_codec_name);
-    data_stream_copy = 0;
     return ost;
 }
 
@@ -3391,20 +3333,9 @@ static OutputStream *new_subtitle_stream(AVFormatContext 
*oc, int file_idx)
 {
     AVStream *st;
     OutputStream *ost;
-    AVCodec *codec=NULL;
     AVCodecContext *subtitle_enc;
-    enum CodecID codec_id = CODEC_ID_NONE;
 
-    if(!subtitle_stream_copy){
-        if (subtitle_codec_name) {
-            codec_id = find_codec_or_die(subtitle_codec_name, 
AVMEDIA_TYPE_SUBTITLE, 1);
-            codec = avcodec_find_encoder_by_name(subtitle_codec_name);
-        } else {
-            codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, 
AVMEDIA_TYPE_SUBTITLE);
-            codec = avcodec_find_encoder(codec_id);
-        }
-    }
-    ost = new_output_stream(oc, file_idx, codec);
+    ost = new_output_stream(oc, file_idx, AVMEDIA_TYPE_SUBTITLE);
     st  = ost->st;
     subtitle_enc = st->codec;
 
@@ -3419,11 +3350,6 @@ static OutputStream *new_subtitle_stream(AVFormatContext 
*oc, int file_idx)
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
         subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
-    if (subtitle_stream_copy) {
-        st->stream_copy = 1;
-    } else {
-        subtitle_enc->codec_id = codec_id;
-    }
 
     if (subtitle_language) {
         av_dict_set(&st->metadata, "language", subtitle_language, 0);
@@ -3431,8 +3357,6 @@ static OutputStream *new_subtitle_stream(AVFormatContext 
*oc, int file_idx)
     }
 
     subtitle_disable = 0;
-    av_freep(&subtitle_codec_name);
-    subtitle_stream_copy = 0;
     return ost;
 }
 
@@ -3711,6 +3635,8 @@ static void opt_output_file(const char *filename)
     metadata_streams_autocopy  = 1;
     metadata_chapters_autocopy = 1;
 
+    av_dict_free(&codec_names);
+
     av_freep(&forced_key_frames);
     uninit_opts();
     init_opts();
@@ -3918,8 +3844,8 @@ static int opt_target(const char *opt, const char *arg)
     }
 
     if(!strcmp(arg, "vcd")) {
-        opt_video_codec("vcodec", "mpeg1video");
-        opt_audio_codec("vcodec", "mp2");
+        opt_codec("c:v", "mpeg1video");
+        opt_codec("c:a", "mp2");
         opt_format("f", "vcd");
 
         opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
@@ -3946,8 +3872,8 @@ static int opt_target(const char *opt, const char *arg)
         mux_preload= (36000+3*1200) / 90000.0; //0.44
     } else if(!strcmp(arg, "svcd")) {
 
-        opt_video_codec("vcodec", "mpeg2video");
-        opt_audio_codec("acodec", "mp2");
+        opt_codec("c:v", "mpeg2video");
+        opt_codec("c:a", "mp2");
         opt_format("f", "svcd");
 
         opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
@@ -3968,8 +3894,8 @@ static int opt_target(const char *opt, const char *arg)
 
     } else if(!strcmp(arg, "dvd")) {
 
-        opt_video_codec("vcodec", "mpeg2video");
-        opt_audio_codec("vcodec", "ac3");
+        opt_codec("c:v", "mpeg2video");
+        opt_codec("c:a", "ac3");
         opt_format("f", "dvd");
 
         opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
@@ -4045,6 +3971,7 @@ static int opt_bsf(const char *opt, const char *arg)
     return 0;
 }
 
+#if 0
 static int opt_preset(const char *opt, const char *arg)
 {
     FILE *f=NULL;
@@ -4085,6 +4012,7 @@ static int opt_preset(const char *opt, const char *arg)
 
     return 0;
 }
+#endif
 
 static const OptionDef options[] = {
     /* main options */
@@ -4092,6 +4020,8 @@ static const OptionDef options[] = {
     { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
     { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
     { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
+    { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
+    { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream 
mapping", "file.stream[:syncfile.syncstream]" },
     { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set 
metadata information of outfile from infile",
       "outfile[,metadata]:infile[,metadata]" },
@@ -4145,7 +4075,6 @@ static const OptionDef options[] = {
     { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, 
{(void*)&video_discard}, "discard threshold", "n" },
     { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use 
fixed video quantizer scale (VBR)", "q" },
     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, 
{(void*)opt_video_rc_override_string}, "rate control override for specific 
intervals", "override" },
-    { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video 
codec ('copy' to copy stream)", "codec" },
     { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, 
{(void*)opt_me_threshold}, "motion estimaton threshold",  "threshold" },
     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
       "use same quantizer as source (implies VBR)" },
@@ -4176,7 +4105,6 @@ static const OptionDef options[] = {
     { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling 
rate (in Hz)", "rate" },
     { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of 
audio channels", "channels" },
     { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
-    { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio 
codec ('copy' to copy stream)", "codec" },
     { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force 
audio tag/fourcc", "fourcc/tag" },
     { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change 
audio volume (256=normal)" , "volume" }, //
     { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, 
"set the ISO 639 language code (3 letters) of the current audio stream" , 
"code" },
@@ -4184,7 +4112,6 @@ static const OptionDef options[] = {
 
     /* subtitle options */
     { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable 
subtitle" },
-    { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force 
subtitle codec ('copy' to copy stream)", "codec" },
     { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void 
*)&subtitle_language}, "set the ISO 639 language code (3 letters) of the 
current subtitle stream" , "code" },
     { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, 
"force subtitle tag/fourcc", "fourcc/tag" },
 
@@ -4199,12 +4126,10 @@ static const OptionDef options[] = {
     { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", 
"bitstream_filter" },
     { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", 
"bitstream_filter" },
 
-    { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the 
audio options to the indicated preset", "preset" },
-    { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the 
video options to the indicated preset", "preset" },
-    { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set 
the subtitle options to the indicated preset", "preset" },
-    { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from 
indicated preset file", "filename" },
-    /* data codec support */
-    { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec 
('copy' to copy stream)", "codec" },
+//    { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set 
the audio options to the indicated preset", "preset" },
+//    { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set 
the video options to the indicated preset", "preset" },
+//    { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set 
the subtitle options to the indicated preset", "preset" },
+//    { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from 
indicated preset file", "filename" },
 
     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, 
{(void*)opt_default}, "generic catch all option", "" },
     { NULL, },
diff --git a/doc/avconv.texi b/doc/avconv.texi
index 1f4bd7a..eb6a79e 100644
--- a/doc/avconv.texi
+++ b/doc/avconv.texi
@@ -97,6 +97,33 @@ input file name
 @item -y
 Overwrite output files.
 
+@item -c[:@var{stream_type}][:@var{stream_index}] @var{codec}
+Select an encoder (when used before an output file) or a decoder (when used
+before an input file) for one or more streams. @var{codec} is the name of a
+decoder/encoder or a special value @code{copy} (output only) to indicate that
+the stream is not to be reencoded.
+
+@var{stream_type} may be 'v' for video, 'a' for audio, 's' for subtitle and 'd'
+for data streams.  @var{stream_index} is a global zero-based stream index if
+@var{stream_type} isn't given, otherwise it counts only streams of the given
+type. If @var{stream_index} is omitted, this option applies to all streams of
+the given type or all streams of any type if @var{stream_type} is missing as
+well (note that this only makes sense when all streams are of the same type or
+@var{codec} is @code{copy}).
+
+For example
+@example
+avconv -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
+@end example
+encodes all video streams with libx264 and copies all audio streams.
+
+For each stream, the last matching @code{c} option is applied, so
+@example
+avconv -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
+@end example
+will copy all the streams except the second video, which will be encoded with
+libx264, and the 138th audio, which will be encoded with libvorbis.
+
 @item -t @var{duration}
 Restrict the transcoded/captured video sequence
 to the duration specified in seconds.
@@ -159,8 +186,6 @@ avconv -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
 @item -dframes @var{number}
 Set the number of data frames to record.
 
-@item -scodec @var{codec}
-Force subtitle codec ('copy' to copy stream).
 
 @item -slang @var{code}
 Set the ISO 639 language code (3 letters) of the current subtitle stream.
@@ -281,9 +306,6 @@ avconv -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k 
-bufsize 1835k out.m
 It is of little use elsewise.
 @item -bufsize @var{size}
 Set video buffer verifier buffer size (in bits).
-@item -vcodec @var{codec}
-Force video codec to @var{codec}. Use the @code{copy} special value to
-tell that the raw codec data must be copied as is.
 @item -sameq
 Use same quantizer as source (implies VBR).
 
@@ -296,8 +318,8 @@ at the exact requested bitrate.
 On pass 1, you may just deactivate audio and set output to null,
 examples for Windows and Unix:
 @example
-avconv -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y NUL
-avconv -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y /dev/null
+avconv -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
+avconv -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
 @end example
 
 @item -passlogfile @var{prefix}
@@ -541,7 +563,7 @@ Show QP histogram.
 @item -vbsf @var{bitstream_filter}
 Bitstream filters available are "dump_extra", "remove_extra", "noise", 
"h264_mp4toannexb", "imxdump", "mjpegadump", "mjpeg2jpeg".
 @example
-avconv -i h264.mp4 -vcodec copy -vbsf h264_mp4toannexb -an out.h264
+avconv -i h264.mp4 -c:v copy -vbsf h264_mp4toannexb -an out.h264
 @end example
 @item -force_key_frames @var{time}[,@var{time}...]
 Force key frames at the specified timestamps, more precisely at the first
@@ -570,9 +592,6 @@ this option only makes sense for audio grabbing devices and 
raw demuxers
 and is mapped to the corresponding demuxer options.
 @item -an
 Disable audio recording.
-@item -acodec @var{codec}
-Force audio codec to @var{codec}. Use the @code{copy} special value to
-specify that the raw codec data must be copied as is.
 @item -alang @var{code}
 Set the ISO 639 language code (3 letters) of the current audio stream.
 @end table
@@ -611,8 +630,6 @@ Bitstream filters available are "dump_extra", 
"remove_extra", "noise", "mp3comp"
 @section Subtitle options:
 
 @table @option
-@item -scodec @var{codec}
-Force subtitle codec ('copy' to copy stream).
 @item -slang @var{code}
 Set the ISO 639 language code (3 letters) of the current subtitle stream.
 @item -sn
@@ -620,7 +637,7 @@ Disable subtitle recording.
 @item -sbsf @var{bitstream_filter}
 Bitstream filters available are "mov2textsub", "text2movsub".
 @example
-avconv -i file.mov -an -vn -sbsf mov2textsub -scodec copy -f rawvideo sub.txt
+avconv -i file.mov -an -vn -sbsf mov2textsub -c:s copy -f rawvideo sub.txt
 @end example
 @end table
 
@@ -674,7 +691,7 @@ For example, to select the stream with index 2 from input 
file
 index 6 from input @file{b.mov} (specified by the identifier "1:6"),
 and copy them to the output file @file{out.mov}:
 @example
-avconv -i a.mov -i b.mov -vcodec copy -acodec copy -map 0:2 -map 1:6 out.mov
+avconv -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
 @end example
 
 To select all video and the third audio stream from an input file:
@@ -777,40 +794,6 @@ avconv -i infile -streamid 0:33 -streamid 1:36 out.ts
 @end example
 @end table
 
-@section Preset files
-
-A preset file contains a sequence of @var{option}=@var{value} pairs,
-one for each line, specifying a sequence of options which would be
-awkward to specify on the command line. Lines starting with the hash
-('#') character are ignored and are used to provide comments. Check
-the @file{ffpresets} directory in the Libav source tree for examples.
-
-Preset files are specified with the @code{vpre}, @code{apre},
-@code{spre}, and @code{fpre} options. The @code{fpre} option takes the
-filename of the preset instead of a preset name as input and can be
-used for any kind of codec. For the @code{vpre}, @code{apre}, and
-@code{spre} options, the options specified in a preset file are
-applied to the currently selected codec of the same type as the preset
-option.
-
-The argument passed to the @code{vpre}, @code{apre}, and @code{spre}
-preset options identifies the preset file to use according to the
-following rules:
-
-First avconv searches for a file named @var{arg}.ffpreset in the
-directories @file{$av_DATADIR} (if set), and @file{$HOME/.avconv}, and in
-the datadir defined at configuration time (usually @file{PREFIX/share/avconv})
-in that order. For example, if the argument is @code{libx264-max}, it will
-search for the file @file{libx264-max.ffpreset}.
-
-If no such file is found, then avconv will search for a file named
-@var{codec_name}-@var{arg}.ffpreset in the above-mentioned
-directories, where @var{codec_name} is the name of the codec to which
-the preset file options will be applied. For example, if you select
-the video codec with @code{-vcodec libx264} and use @code{-vpre max},
-then it will search for the file @file{libx264-max.ffpreset}.
-@c man end
-
 @chapter Tips
 @c man begin TIPS
 
@@ -970,7 +953,7 @@ stream, in the order of the definition of output streams.
 You can transcode decrypted VOBs:
 
 @example
-avconv -i snatch_1.vob -f avi -vcodec mpeg4 -b 800k -g 300 -bf 2 -acodec 
libmp3lame -ab 128k snatch.avi
+avconv -i snatch_1.vob -f avi -c:v mpeg4 -b 800k -g 300 -bf 2 -c:v libmp3lame 
-ab 128k snatch.avi
 @end example
 
 This is a typical DVD ripping example; the input is a VOB file, the
@@ -1014,7 +997,7 @@ only formats accepting a normal integer are suitable.
 You can put many streams of the same type in the output:
 
 @example
-avconv -i test1.avi -i test2.avi -map 0.3 -map 0.2 -map 0.1 -map 0.0 -vcodec 
copy -acodec copy -vcodec copy -acodec copy test12.nut
+avconv -i test1.avi -i test2.avi -map 0.3 -map 0.2 -map 0.1 -map 0.0 -c copy 
test12.nut
 @end example
 
 The resulting output file @file{test12.avi} will contain first four streams 
from
-- 
1.7.5.4

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to