Merge commit '811bd0784679dfcb4ed02043a37c92f9df10500e'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 6 Aug 2013 08:57:04 +0000 (10:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 6 Aug 2013 09:39:09 +0000 (11:39 +0200)
* commit '811bd0784679dfcb4ed02043a37c92f9df10500e':
  avconv: make input -ss accurate when transcoding

Conflicts:
Changelog
doc/ffmpeg.texi
ffmpeg.h
ffmpeg_filter.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
doc/ffmpeg.texi
ffmpeg.h
ffmpeg_filter.c
ffmpeg_opt.c

diff --cc Changelog
index 48f93c74a99a47632a9a59e95cd8085249d4705a,3b1d01e0b1ce532ace24fc3558702532b2793b10..c507b954d3f9e7c8208a87fc9ccc7477f3a2b055
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version 10:
 -- av_strnstr
 -- support ID3v2 tags in ASF files
 +version <next>
 +
 +- aecho filter
 +- perspective filter ported from libmpcodecs
 +- ffprobe -show_programs option
 +- compand filter
 +- RTMP seek support
++- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate
++  even when used as an input option. Previous behavior can be restored with
++  the -noaccurate_seek option.
 +
 +
 +version 2.0:
 +
 +- curves filter
  - reference-counting for AVFrame and AVPacket data
 -- avconv now fails when input options are used for output file
 +- ffmpeg now fails when input options are used for output file
    or vice versa
 -- new avconv options -filter_script and -filter_complex_script, which allow a
 +- support for Monkey's Audio versions from 3.93
 +- perms and aperms filters
 +- audio filtering support in ffplay
 +- 10% faster aac encoding on x86 and MIPS
 +- sine audio filter source
 +- WebP demuxing and decoding support
 +- new ffmpeg options -filter_script and -filter_complex_script, which allow a
    filtergraph description to be read from a file
 +- OpenCL support
 +- audio phaser filter
 +- separatefields filter
 +- libquvi demuxer
  - uniform options syntax across all filters
 +- telecine filter
  - new interlace filter
 -- JPEG 2000 decoder
 -- new asetpts filter (same as setpts, but for audio)
 -- new trim and atrim filters
 -- avconv -t and -ss (output-only) options are now sample-accurate when
 +- smptehdbars source
 +- inverse telecine filters (fieldmatch and decimate)
 +- colorbalance filter
 +- colorchannelmixer filter
 +- The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default at the next libavformat major bump.
 +- decent native animated GIF encoding
 +- asetrate filter
 +- interleave filter
 +- timeline editing with filters
 +- vidstabdetect and vidstabtransform filters for video stabilization using
 +  the vid.stab library
 +- astats filter
 +- trim and atrim filters
 +- ffmpeg -t and -ss (output-only) options are now sample-accurate when
    transcoding audio
  - Matroska muxer can now put the index at the beginning of the file.
 -- avconv -deinterlace option removed, the yadif filter should be used instead
 +- extractplanes filter
 +- avectorscope filter
 +- ADPCM DTK decoder
 +- ADP demuxer
 +- RSD demuxer
 +- RedSpark demuxer
 +- ADPCM IMA Radical decoder
 +- zmq filters
 +- DCT denoiser filter (dctdnoiz)
 +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
  - Apple Intermediate Codec decoder
  - Escape 130 video decoder
 +- FTP protocol support
 +- V4L2 output device
 +- 3D LUT filter (lut3d)
 +- SMPTE 302M audio encoder
  - support for slice multithreading in libavfilter
 +- Hald CLUT support (generation and filtering)
  - VC-1 interlaced B-frame support
  - support for WavPack muxing (raw and in Matroska)
 +- XVideo output device
 +- vignette filter
 +- True Audio (TTA) encoder
  - Go2Webinar decoder
 +- mcdeint filter ported from libmpcodecs
 +- sab filter ported from libmpcodecs
 +- ffprobe -show_chapters option
  - WavPack encoding through libwavpack
 -- Added the -n parameter to avconv
 -- RTMP seek support
 -- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
 -  even when used as an input option. Previous behavior can be restored with
 -  the -noaccurate_seek option.
 +- rotate filter
 +- spp filter ported from libmpcodecs
 +- libgme support
 +- psnr filter
  
  
 -version 9:
 -- av_basename and av_dirname
 -- adobe and limelight publisher authentication in RTMP
 +version 1.2:
 +
  - VDPAU hardware acceleration through normal hwaccel
  - SRTP support
 +- Error diffusion dither in Swscale
 +- Chained Ogg support
 +- Theora Midstream reconfiguration support
 +- EVRC decoder
 +- audio fade filter
 +- filtering audio with unknown channel layout
 +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 +  and treble audio filter
 +- improved showspectrum filter, with multichannel support and sox-like colors
 +- histogram filter
 +- tee muxer
 +- il filter ported from libmpcodecs
 +- support ID3v2 tags in ASF files
 +- encrypted TTA stream decoding support
 +- RF64 support in WAV muxer
 +- noise filter ported from libmpcodecs
 +- Subtitles character encoding conversion
 +- blend filter
 +- stereo3d filter ported from libmpcodecs
  
  
 -version 9_beta3:
 -- ashowinfo audio filter
 +version 1.1:
 +
 +- stream disposition information printing in ffprobe
 +- filter for loudness analysis following EBU R128
 +- Opus encoder using libopus
 +- ffprobe -select_streams option
 +- Pinnacle TARGA CineWave YUV16 decoder
 +- TAK demuxer, decoder and parser
 +- DTS-HD demuxer
 +- remove -same_quant, it hasn't worked for years
 +- FFM2 support
 +- X-Face image encoder and decoder
  - 24-bit FLAC encoding
 -- audio volume filter
 -- deprecated the avconv -vol option. the volume filter is to be used instead.
  - multi-channel ALAC encoding up to 7.1
 -- TAK demuxer, parser, and decoder
 -- adaptive frame-level multithreading for H.264
 -
 -
 -version 9_beta2:
  - metadata (INFO tag) support in WAV muxer
 +- subtitles raw text decoder
  - support for building DLLs using MSVC
 -- remove avserver daemon mode
 +- LVF demuxer
 +- ffescape tool
 +- metadata (info chunk) support in CAF muxer
 +- field filter ported from libmpcodecs
 +- AVR demuxer
 +- geq filter ported from libmpcodecs
 +- remove ffserver daemon mode
 +- AST muxer/demuxer
 +- new expansion syntax for drawtext
 +- BRender PIX image decoder
 +- ffprobe -show_entries option
 +- ffprobe -sections option
 +- ADPCM IMA Dialogic decoder
 +- BRSTM demuxer
 +- animated GIF decoder and demuxer
 +- PVF demuxer
 +- subtitles filter
 +- IRCAM muxer/demuxer
 +- Paris Audio File demuxer
 +- Virtual concatenation demuxer
 +- VobSub demuxer
 +- JSON captions for TED talks decoding support
 +- SOX Resampler support in libswresample
 +- aselect filter
 +- SGI RLE 8-bit decoder
 +- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 +- Silicon Graphics Movie demuxer
 +- apad filter
 +- Resolution & pixel format change support with multithreading for H.264
 +- documentation split into per-component manuals
 +- pp (postproc) filter ported from MPlayer
 +- NIST Sphere demuxer
 +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 +- Sony Wave64 muxer
 +- adobe and limelight publisher authentication in RTMP
 +- data: URI scheme
  - support building on the Plan 9 operating system
 -- ffv1: support version 1.3
 +- kerndeint filter ported from MPlayer
 +- histeq filter ported from VirtualDub
 +- Megalux Frame demuxer
 +- 012v decoder
 +- Improved AVC Intra decoding support
  
  
 -version 9_beta1:
 +version 1.0:
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 -- CDXL demuxer and decoder
 -- Apple ProRes encoder
 -- Sun Rasterfile Encoder
 -- remove libpostproc
 -- ID3v2 attached pictures reading and writing
 -- WMA Lossless decoder
 -- XBM encoder
 -- RealAudio Lossless decoder
 -- ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 -- add fps filter
 -- audio split filter
 -- audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
  - Indeo Audio decoder
  - channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
  - RTMPT protocol support
  - iLBC encoding/decoding via libilbc
  - Microsoft Screen 1 decoder
diff --cc doc/ffmpeg.texi
index 50b2c8b8f0a303a49c81fa1e3bb6bc3c0d905688,7e9b77e41d6bdbf6a6db415b0e370e6cf9dff439..a923f978672491310f9dbaa2de92b9ea887262f4
@@@ -272,9 -265,15 +272,15 @@@ Set the file size limit, expressed in b
  
  @item -ss @var{position} (@emph{input/output})
  When used as an input option (before @code{-i}), seeks in this input file to
- @var{position}. When used as an output option (before an output filename),
- decodes but discards input until the timestamps reach @var{position}. This is
- slower, but more accurate.
+ @var{position}. Note the in most formats it is not possible to seek exactly, so
 -@command{avconv} will seek to the closest seek point before @var{position}.
++@command{ffmpeg} will seek to the closest seek point before @var{position}.
+ When transcoding and @option{-accurate_seek} is enabled (the default), this
+ extra segment between the seek point and @var{position} will be decoded and
+ discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
+ will be preserved.
+ When used as an output option (before an output filename), decodes but discards
+ input until the timestamps reach @var{position}.
  
  @var{position} may be either in seconds or in @code{hh:mm:ss[.xxx]} form.
  
@@@ -1060,64 -840,13 +1066,70 @@@ This option is similar to @option{-filt
  its argument is the name of the file from which a complex filtergraph
  description is to be read.
  
+ @item -accurate_seek (@emph{input})
+ This option enables or disables accurate seeking in input files with the
+ @option{-ss} option. It is enabled by default, so seeking is accurate when
+ transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
+ e.g. when copying some streams and transcoding the others.
 +@item -override_ffserver (@emph{global})
 +Overrides the input specifications from ffserver. Using this option you can
 +map any input stream to ffserver and control many aspects of the encoding from
 +ffmpeg. Without this option ffmpeg will transmit to ffserver what is requested by
 +ffserver.
 +The option is intended for cases where features are needed that cannot be
 +specified to ffserver but can be to ffmpeg.
 +
  @end table
 +
 +As a special exception, you can use a bitmap subtitle stream as input: it
 +will be converted into a video with the same size as the largest video in
 +the file, or 720x576 if no video is present. Note that this is an
 +experimental and temporary solution. It will be removed once libavfilter has
 +proper support for subtitles.
 +
 +For example, to hardcode subtitles on top of a DVB-T recording stored in
 +MPEG-TS format, delaying the subtitles by 1 second:
 +@example
 +ffmpeg -i input.ts -filter_complex \
 +  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
 +  -sn -map '#0x2dc' output.mkv
 +@end example
 +(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video,
 +audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too)
 +
 +@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{presets} directory in the FFmpeg 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 ffmpeg searches for a file named @var{arg}.ffpreset in the
 +directories @file{$FFMPEG_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in
 +the datadir defined at configuration time (usually @file{PREFIX/share/ffmpeg})
 +or in a @file{ffpresets} folder along the executable on win32,
 +in that order. For example, if the argument is @code{libvpx-1080p}, it will
 +search for the file @file{libvpx-1080p.ffpreset}.
 +
 +If no such file is found, then ffmpeg 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 libvpx} and use @code{-vpre 1080p},
 +then it will search for the file @file{libvpx-1080p.ffpreset}.
  @c man end OPTIONS
  
  @chapter Tips
diff --cc ffmpeg.h
index 24e6d47d0bd86f54c1264ef1c35fb19784d2dfe5,2143c0fc798b4d7b2f10327a1e9568f3f43e0668..9b70eb2308500224c05cbf77e86f671510dd7b9c
+++ b/ffmpeg.h
@@@ -279,13 -236,13 +280,15 @@@ typedef struct InputFile 
      AVFormatContext *ctx;
      int eof_reached;      /* true if eof reached */
      int eagain;           /* true if last read attempt returned EAGAIN */
 -    int ist_index;        /* index of first stream in ist_table */
 +    int ist_index;        /* index of first stream in input_streams */
      int64_t ts_offset;
 -    int nb_streams;       /* number of stream that avconv is aware of; may be different
 +    int64_t last_ts;
+     int64_t start_time;   /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
 +    int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
                               from ctx.nb_streams if new streams appear during av_read_frame() */
 +    int nb_streams_warn;  /* number of streams that the user was warned of */
      int rate_emu;
+     int accurate_seek;
  
  #if HAVE_PTHREADS
      pthread_t thread;           /* thread reading from this file */
diff --cc ffmpeg_filter.c
index 1270ffb61514d8967c42e8fb3c245d7324c303de,704a1b09b7e5a7bdeee000794bed941c66b1d7b1..21b33432c4a05e30f7a47d942b584168c6f9cd73
@@@ -281,18 -180,13 +283,17 @@@ static int insert_trim(int64_t start_ti
      AVFilterGraph *graph = (*last_filter)->graph;
      AVFilterContext *ctx;
      const AVFilter *trim;
-     const char *name = ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO ? "trim" : "atrim";
-     char filter_name[128];
+     enum AVMediaType type = avfilter_pad_get_type((*last_filter)->output_pads, *pad_idx);
+     const char *name = (type == AVMEDIA_TYPE_VIDEO) ? "trim" : "atrim";
      int ret = 0;
  
-     if (of->recording_time == INT64_MAX && of->start_time == AV_NOPTS_VALUE)
+     if (duration == INT64_MAX && start_time == AV_NOPTS_VALUE)
          return 0;
  
-     if (of->start_time == AV_NOPTS_VALUE)
 +    // Use with duration and without output starttime is buggy with trim filters
++    if (start_time == AV_NOPTS_VALUE)
 +        return 0;
 +
      trim = avfilter_get_by_name(name);
      if (!trim) {
          av_log(NULL, AV_LOG_ERROR, "%s filter not present, cannot limit "
@@@ -513,28 -374,10 +516,31 @@@ static int configure_output_audio_filte
          pad_idx = 0;
      }
  
-     ret = insert_trim(ost, &last_filter, &pad_idx);
 +    if (audio_volume != 256 && 0) {
 +        char args[256];
 +
 +        snprintf(args, sizeof(args), "%f", audio_volume / 256.);
 +        AUTO_INSERT_FILTER("-vol", "volume", args);
 +    }
 +
 +    if (ost->apad && of->shortest) {
 +        char args[256];
 +        int i;
 +
 +        for (i=0; i<of->ctx->nb_streams; i++)
 +            if (of->ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 +                break;
 +
 +        if (i<of->ctx->nb_streams) {
 +            snprintf(args, sizeof(args), "%s", ost->apad);
 +            AUTO_INSERT_FILTER("-apad", "apad", args);
 +        }
 +    }
 +
+     snprintf(name, sizeof(name), "trim for output stream %d:%d",
+              ost->file_index, ost->index);
+     ret = insert_trim(of->start_time, of->recording_time,
+                       &last_filter, &pad_idx, name);
      if (ret < 0)
          return ret;
  
@@@ -615,23 -422,13 +621,24 @@@ static int configure_input_video_filter
      AVFilterContext *last_filter;
      const AVFilter *buffer_filt = avfilter_get_by_name("buffer");
      InputStream *ist = ifilter->ist;
+     InputFile     *f = input_files[ist->file_index];
      AVRational tb = ist->framerate.num ? av_inv_q(ist->framerate) :
                                           ist->st->time_base;
 +    AVRational fr = ist->framerate;
      AVRational sar;
 -    char args[255], name[255];
 +    AVBPrint args;
 +    char name[255];
-     int ret;
+     int ret, pad_idx = 0;
  
 +    if (!fr.num)
 +        fr = av_guess_frame_rate(input_files[ist->file_index]->ctx, ist->st, NULL);
 +
 +    if (ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 +        ret = sub2video_prepare(ist);
 +        if (ret < 0)
 +            return ret;
 +    }
 +
      sar = ist->st->sample_aspect_ratio.num ?
            ist->st->sample_aspect_ratio :
            ist->st->codec->sample_aspect_ratio;
          last_filter = setpts;
      }
  
 +    if (do_deinterlace) {
 +        AVFilterContext *yadif;
 +
 +        snprintf(name, sizeof(name), "deinterlace input from stream %d:%d",
 +                 ist->file_index, ist->st->index);
 +        if ((ret = avfilter_graph_create_filter(&yadif,
 +                                                avfilter_get_by_name("yadif"),
 +                                                name, "", NULL,
 +                                                fg->graph)) < 0)
 +            return ret;
 +
 +        if ((ret = avfilter_link(last_filter, 0, yadif, 0)) < 0)
 +            return ret;
 +
 +        last_filter = yadif;
 +    }
 +
+     snprintf(name, sizeof(name), "trim for input stream %d:%d",
+              ist->file_index, ist->st->index);
+     ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
+                       AV_NOPTS_VALUE : 0, INT64_MAX, &last_filter, &pad_idx, name);
+     if (ret < 0)
+         return ret;
      if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
          return ret;
      return 0;
@@@ -699,20 -478,16 +713,21 @@@ static int configure_input_audio_filter
      AVFilterContext *last_filter;
      const AVFilter *abuffer_filt = avfilter_get_by_name("abuffer");
      InputStream *ist = ifilter->ist;
 -    char args[255], name[255];
+     InputFile     *f = input_files[ist->file_index];
-     int ret;
 +    AVBPrint args;
 +    char name[255];
+     int ret, pad_idx = 0;
  
 -    snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
 -             ":channel_layout=0x%"PRIx64,
 +    av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC);
 +    av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
               1, ist->st->codec->sample_rate,
               ist->st->codec->sample_rate,
 -             av_get_sample_fmt_name(ist->st->codec->sample_fmt),
 -             ist->st->codec->channel_layout);
 +             av_get_sample_fmt_name(ist->st->codec->sample_fmt));
 +    if (ist->st->codec->channel_layout)
 +        av_bprintf(&args, ":channel_layout=0x%"PRIx64,
 +                   ist->st->codec->channel_layout);
 +    else
 +        av_bprintf(&args, ":channels=%d", ist->st->codec->channels);
      snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
               ist->file_index, ist->st->index);
  
          av_log(NULL, AV_LOG_WARNING, "-vol has been deprecated. Use the volume "
                 "audio filter instead.\n");
  
 -        snprintf(args, sizeof(args), "volume=%f", audio_volume / 256.0);
 -
 -        snprintf(name, sizeof(name), "graph %d volume for input stream %d:%d",
 -                 fg->index, ist->file_index, ist->st->index);
 -        ret = avfilter_graph_create_filter(&volume,
 -                                           avfilter_get_by_name("volume"),
 -                                           name, args, NULL, fg->graph);
 -        if (ret < 0)
 -            return ret;
 -
 -        ret = avfilter_link(last_filter, 0, volume, 0);
 -        if (ret < 0)
 -            return ret;
 -
 -        last_filter = volume;
 +        snprintf(args, sizeof(args), "%f", audio_volume / 256.);
 +        AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
      }
+     snprintf(name, sizeof(name), "trim for input stream %d:%d",
+              ist->file_index, ist->st->index);
+     ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
+                       AV_NOPTS_VALUE : 0, INT64_MAX, &last_filter, &pad_idx, name);
+     if (ret < 0)
+         return ret;
      if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
          return ret;
  
diff --cc ffmpeg_opt.c
index 65f3df92f9d223bc9f88242f176fc22f9bb3ff61,f14d7f1c6263a6eb252c2b420fc7c947423f48d0..07ad8190a8aafb0d4f078704c94b11b24e283742
@@@ -138,18 -112,12 +138,19 @@@ static void init_options(OptionsContex
  {
      memset(o, 0, sizeof(*o));
  
 +    if (!is_input && recording_time != INT64_MAX) {
 +        o->recording_time = recording_time;
 +        av_log(NULL, AV_LOG_WARNING,
 +                "-t is not an input option, keeping it for the next output;"
 +                " consider fixing your command line.\n");
 +    } else
 +        o->recording_time = INT64_MAX;
 +    o->stop_time = INT64_MAX;
      o->mux_max_delay  = 0.7;
      o->start_time     = AV_NOPTS_VALUE;
 -    o->recording_time = INT64_MAX;
      o->limit_filesize = UINT64_MAX;
      o->chapters_input_file = INT_MAX;
+     o->accurate_seek  = 1;
  }
  
  /* return a copy of the input with the stream specifiers removed from the keys */