Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 16 Aug 2011 21:47:35 +0000 (23:47 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 16 Aug 2011 21:47:35 +0000 (23:47 +0200)
* qatar/master:
  movenc: change AV_LOG_INFO to AV_LOG_WARNING for some warnings
  avconv: remove a write-only variable
  avconv: remove pointless parameter from new_*_stream().
  avconv: cosmetics, move code
  avconv: cosmetics -- move copy_chapters().
  avconv: cosmetics -- move parse_forced_key_frames().
  lavc: add audio flag to the 'b' option, deprecate 'ab'.
  avconv: rename sameq to same_quant
  doc/avconv: add forgotten end of chapter.
  Changelog: document avconv incompatibilities with ffmpeg.
  avconv: replace -vcodec/-acodec/-scodec with a better system.
  avconv: remove presets.
  svq3: propagate codec memory allocation failure in context init

Conflicts:
Changelog
avconv.c
libavcodec/options.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
avconv.c
doc/avconv.texi
ffmpeg.c
libavcodec/options.c
libavcodec/svq3.c
libavformat/movenc.c
tests/codec-regression.sh
tests/lavf-regression.sh

diff --cc Changelog
+++ b/Changelog
@@@ -1,19 -1,72 +1,52 @@@
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 +version next:
  
 -version <next>:
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
++- added avconv, which is almost the same for now, except
+ for a few incompatible changes in the options, which will hopefully make them
+ easier to use. The changes are:
+     * -newvideo/-newaudio/-newsubtitle are gone, because they were redundant and
+       worked in a nonstandard way. -map is sufficient to add streams to output
+       files.
+     * -map now has slightly different and more powerful syntax.
+         + it's possible to specify stream type. E.g. -map 0:a:2 means 'third
+           audio stream'.
+         + omitting the stream index now maps all the streams of the given
+           type, not just the first. E.g. -map 0:s maps all the subtitle streams.
+         + colons (':') are used to separate file index/stream type/stream
+           index. Comma (',') is used to separate the sync stream. This is done
+           for consistency with other options.
+         + since -map can now match multiple streams, negative mappings were
+           introduced. Negative mappings disable some streams from an already
+           defined map. E.g. '-map 0 -map -0:a:1' means 'map everything except
+           for the second audio stream'.
+     * -vcodec/-acodec/-scodec are replaced by -c (or -codec), which
+       allows to precisely specify target stream(s) consistently with other
+       options. E.g. '-c:v libx264' sets the codec for all video streams,
+       '-c:a:0 libvorbis' sets the codec for the first audio stream and '-c
+       copy' copies all the streams.
+     * It is now possible to precisely specify which stream should an AVOption
+       apply to. See the manual for detailed explanation.
+     * -map_chapters now takes only an input file index and applies to the next
+       output file. This is consistent with how all the other options work.
+     * -map_metadata now takes only an input metadata specifier and applies to
+       the next output file. Output metadata specifier is now part of the option
+       name, similarly to the AVOptions/map/codec feature above.
+     * Presets in avconv are disabled, because only libx264 used them and
+       presets for libx264 can now be specified using a private option
+       '-preset <presetname>'.
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 +version 0.8:
  
  
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 -
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
diff --cc avconv.c
+++ b/avconv.c
@@@ -194,11 -179,7 +192,7 @@@ static int do_hex_dump = 0
  static int do_pkt_dump = 0;
  static int do_psnr = 0;
  static int do_pass = 0;
 -static char *pass_logfilename_prefix = NULL;
 +static const char *pass_logfilename_prefix;
- 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;
@@@ -1761,10 -1608,10 +1668,10 @@@ static int output_packet(InputStream *i
                          case AVMEDIA_TYPE_VIDEO:
  #if CONFIG_AVFILTER
                              if (ost->picref->video && !ost->frame_aspect_ratio)
 -                                ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
 +                                ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
  #endif
                              do_video_out(os, ost, ist, &picture, &frame_size,
-                                          same_quality ? quality : ost->st->codec->global_quality);
+                                          same_quant ? quality : ost->st->codec->global_quality);
                              if (vstats_filename && frame_size)
                                  do_video_stats(os, ost, frame_size);
                              break;
@@@ -3250,18 -2978,14 +3130,18 @@@ static int opt_input_file(const char *o
          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(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
              if(audio_disable)
                  st->discard= AVDISCARD_ALL;
              break;
          case AVMEDIA_TYPE_VIDEO:
-             ist->dec= avcodec_find_decoder_by_name(video_codec_name);
 +            if(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
              rfps      = ic->streams[i]->r_frame_rate.num;
              rfps_base = ic->streams[i]->r_frame_rate.den;
              if (dec->lowres) {
          case AVMEDIA_TYPE_DATA:
              break;
          case AVMEDIA_TYPE_SUBTITLE:
-             ist->dec = avcodec_find_decoder_by_name(subtitle_codec_name);
 +            if(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
              if(subtitle_disable)
                  st->discard = AVDISCARD_ALL;
              break;
@@@ -3632,7 -3352,80 +3511,81 @@@ static int opt_streamid(const char *opt
      return 0;
  }
  
 -static int read_avserver_streams(AVFormatContext *s, const char *filename)
+ static int copy_chapters(int infile, int outfile)
+ {
+     AVFormatContext *is = input_files[infile].ctx;
+     AVFormatContext *os = output_files[outfile];
+     int i;
+     for (i = 0; i < is->nb_chapters; i++) {
+         AVChapter *in_ch = is->chapters[i], *out_ch;
+         int64_t ts_off   = av_rescale_q(start_time - input_files[infile].ts_offset,
+                                       AV_TIME_BASE_Q, in_ch->time_base);
+         int64_t rt       = (recording_time == INT64_MAX) ? INT64_MAX :
+                            av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
+         if (in_ch->end < ts_off)
+             continue;
+         if (rt != INT64_MAX && in_ch->start > rt + ts_off)
+             break;
+         out_ch = av_mallocz(sizeof(AVChapter));
+         if (!out_ch)
+             return AVERROR(ENOMEM);
+         out_ch->id        = in_ch->id;
+         out_ch->time_base = in_ch->time_base;
+         out_ch->start     = FFMAX(0,  in_ch->start - ts_off);
+         out_ch->end       = FFMIN(rt, in_ch->end   - ts_off);
+         if (metadata_chapters_autocopy)
+             av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
+         os->nb_chapters++;
+         os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
+         if (!os->chapters)
+             return AVERROR(ENOMEM);
+         os->chapters[os->nb_chapters - 1] = out_ch;
+     }
+     return 0;
+ }
 -        st->info = NULL;
++static int read_ffserver_streams(AVFormatContext *s, const char *filename)
+ {
+     int i, err;
+     AVFormatContext *ic = NULL;
+     err = avformat_open_input(&ic, filename, NULL, NULL);
+     if (err < 0)
+         return err;
+     /* copy stream format */
+     for(i=0;i<ic->nb_streams;i++) {
+         AVStream *st;
+         OutputStream *ost;
+         AVCodec *codec;
+         codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
+         ost   = new_output_stream(s, codec->type);
+         st    = ost->st;
+         // FIXME: a more elegant solution is needed
+         memcpy(st, ic->streams[i], sizeof(AVStream));
 -static void opt_output_file(const char *filename)
++        st->info = av_malloc(sizeof(*st->info));
++        memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
+         avcodec_copy_context(st->codec, ic->streams[i]->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);
+     }
+     av_close_input_file(ic);
+     return 0;
+ }
 +static int opt_output_file(const char *opt, const char *filename)
  {
      AVFormatContext *oc;
      int i, err;
@@@ -4216,58 -4017,6 +4171,20 @@@ static int opt_bsf(const char *opt, con
      return 0;
  }
  
- static int opt_preset(const char *opt, const char *arg)
- {
-     FILE *f=NULL;
-     char filename[1000], tmp[1000], tmp2[1000], line[1000];
-     char *codec_name = *opt == 'v' ? video_codec_name :
-                        *opt == 'a' ? audio_codec_name :
-                                      subtitle_codec_name;
-     if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
-         fprintf(stderr, "File for preset '%s' not found\n", arg);
-         exit_program(1);
-     }
-     while(!feof(f)){
-         int e= fscanf(f, "%999[^\n]\n", line) - 1;
-         if(line[0] == '#' && !e)
-             continue;
-         e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
-         if(e){
-             fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
-             exit_program(1);
-         }
-         if (!strcmp(tmp, "acodec") ||
-             !strcmp(tmp, "vcodec") ||
-             !strcmp(tmp, "scodec") ||
-             !strcmp(tmp, "dcodec")) {
-             opt_codec(tmp, tmp2);
-         }else if(opt_default(tmp, tmp2) < 0){
-             fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
-             exit_program(1);
-         }
-     }
-     fclose(f);
-     return 0;
- }
 +static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
 +{
 +}
 +
 +static int opt_passlogfile(const char *opt, const char *arg)
 +{
 +    pass_logfilename_prefix = arg;
 +#if CONFIG_LIBX264_ENCODER
 +    return opt_default("passlogfile", arg);
 +#else
 +    return 0;
 +#endif
 +}
 +
  static const OptionDef options[] = {
      /* main options */
  #include "cmdutils_common_opts.h"
      { "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_codec}, "force video codec ('copy' to copy stream)", "codec" },
+     { "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},
+     { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
        "use same quantizer as source (implies VBR)" },
      { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
 -    { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
 +    { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
      { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
        "deinterlace pictures" },
      { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
diff --cc doc/avconv.texi
Simple merge
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -4449,12 -4301,12 +4449,12 @@@ 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" },
 +    { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_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)" },
++    { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, "use same quantizer as source (implies VBR)" },
++    { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, "use same quantizer as source (implies VBR)" },
      { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
 -    { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
 +    { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
      { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
        "deinterlace pictures" },
      { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
@@@ -70,8 -70,8 +70,8 @@@ static const AVOption *opt_find(void *o
  #define AV_CODEC_DEFAULT_BITRATE 200*1000
  
  static const AVOption options[]={
- {"b", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, V|E},
 -{"b", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, V|A|E},
 -{"ab", "this option is deprecated, use b", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, A|E},
++{"b", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE }, INT_MIN, INT_MAX, A|V|E},
 +{"ab", "set bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, {.dbl = 64*1000 }, INT_MIN, INT_MAX, A|E},
  {"bt", "set video bitrate tolerance (in bits/s)", OFFSET(bit_rate_tolerance), FF_OPT_TYPE_INT, {.dbl = AV_CODEC_DEFAULT_BITRATE*20 }, 1, INT_MAX, V|E},
  {"flags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, {.dbl = DEFAULT }, 0, UINT_MAX, V|A|E|D, "flags"},
  {"mv4", "use four motion vector by macroblock (mpeg4)", 0, FF_OPT_TYPE_CONST, {.dbl = CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, "flags"},
Simple merge
Simple merge
Simple merge
Simple merge