Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 6 May 2012 19:31:08 +0000 (21:31 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 6 May 2012 19:53:19 +0000 (21:53 +0200)
* qatar/master: (28 commits)
  dfa: use more meaningful return codes
  eatgv: check vector_bits
  eatgv: check motion vectors
  Mark a number of variables only used in av_dlog() calls as av_unused.
  dvdec: drop const qualifier from variable to eliminate a warning
  avcodec: Improve comment for thread_safe_callbacks to avoid misinterpretation.
  tests/utils: don't ignore the return value of fwrite()
  lavfi/formats: use sizeof(var) instead of sizeof(type).
  lavfi: remove avfilter_default_config_input_link() declaration
  lavfi: always enable the scale filter and depend on sws.
  vf_split: support user-specifiable number of outputs.
  avconv: remove stray useless comment.
  mpegmux: add stuffing to avoid incomplete PCM frames
  rtsp: avoid const warnings from strtol() call
  avserver: check return value of ftruncate()
  lagarith: make offset array type unsigned
  dfa: add some checks to ensure that decoder won't write past frame end
  aacps: NEON optimisations
  aacps: align some arrays
  aacps: move some loops to function pointers
  ...

Conflicts:
configure
doc/filters.texi
libavcodec/dfa.c
libavcodec/eatgv.c
libavfilter/Makefile
libavfilter/allfilters.c
libavfilter/avfilter.h
libavfilter/formats.c
libavfilter/vf_split.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
25 files changed:
1  2 
configure
doc/filters.texi
ffmpeg.c
ffserver.c
libavcodec/Makefile
libavcodec/aacps.c
libavcodec/aacps.h
libavcodec/aacps_tablegen.c
libavcodec/aacps_tablegen.h
libavcodec/avcodec.h
libavcodec/dfa.c
libavcodec/dvdec.c
libavcodec/eatgv.c
libavcodec/lagarith.c
libavcodec/wmalosslessdec.c
libavfilter/Makefile
libavfilter/allfilters.c
libavfilter/formats.c
libavfilter/vf_split.c
libavformat/mov.c
libavformat/mpegenc.c
libavformat/nsvdec.c
libavformat/rtpdec_h264.c
libavformat/rtsp.c
tests/utils.c

diff --cc configure
+++ b/configure
@@@ -1697,17 -1534,16 +1697,18 @@@ yadif_filter_deps="gpl
  
  # libraries
  avdevice_deps="avcodec avformat"
+ avfilter_deps="swscale"
  avformat_deps="avcodec"
 +postproc_deps="gpl"
  
  # programs
 -avconv_deps="avcodec avfilter avformat avresample swscale"
 -avplay_deps="avcodec avformat swscale sdl"
 -avplay_select="rdft"
 -avprobe_deps="avcodec avformat"
 -avserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer !shared"
 -avserver_extralibs='$ldl'
 +ffplay_deps="avcodec avformat swscale swresample sdl"
 +ffplay_select="buffersink_filter rdft"
 +ffprobe_deps="avcodec avformat"
 +ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 +ffserver_extralibs='$ldl'
 +ffmpeg_deps="avcodec avfilter avformat swscale swresample"
 +ffmpeg_select="buffersink_filter"
  
  doc_deps="texi2html"
  
@@@ -2735,113 -1668,17 +2735,121 @@@ faster due to better use of the memory 
  
  @section split
  
- Pass on the input video to two outputs. Both outputs are identical to
- the input video.
+ Split input video into several identical outputs.
+ The filter accepts a single parameter which specifies the number of outputs. If
+ unspecified, it defaults to 2.
+ For example
+ @example
 -avconv -i INPUT -filter_complex split=5 OUTPUT
++ffmpeg -i INPUT -filter_complex split=5 OUTPUT
+ @end example
+ will create 5 copies of the input video.
  
 +For example:
 +@example
 +[in] split [splitout1][splitout2];
 +[splitout1] crop=100:100:0:0    [cropout];
 +[splitout2] pad=200:200:100:100 [padout];
 +@end example
 +
 +will create two separate outputs from the same input, one cropped and
 +one padded.
 +
 +@section super2xsai
 +
 +Scale the input by 2x and smooth using the Super2xSaI (Scale and
 +Interpolate) pixel art scaling algorithm.
 +
 +Useful for enlarging pixel art images without reducing sharpness.
 +
 +@section swapuv
 +Swap U & V plane.
 +
 +@section thumbnail
 +Select the most representative frame in a given sequence of consecutive frames.
 +
 +It accepts as argument the frames batch size to analyze (default @var{N}=100);
 +in a set of @var{N} frames, the filter will pick one of them, and then handle
 +the next batch of @var{N} frames until the end.
 +
 +Since the filter keeps track of the whole frames sequence, a bigger @var{N}
 +value will result in a higher memory usage, so a high value is not recommended.
 +
 +The following example extract one picture each 50 frames:
 +@example
 +thumbnail=50
 +@end example
 +
 +Complete example of a thumbnail creation with @command{ffmpeg}:
 +@example
 +ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png
 +@end example
 +
 +@section tile
 +
 +Tile several successive frames together.
 +
 +It accepts as argument the tile size (i.e. the number of lines and columns)
 +in the form "@var{w}x@var{h}".
 +
 +For example, produce 8×8 PNG tiles of all keyframes (@option{-skip_frame
 +nokey}) in a movie:
 +@example
 +ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png
 +@end example
 +The @option{-vsync 0} is necessary to prevent @command{ffmpeg} from
 +duplicating each output frame to accomodate the originally detected frame
 +rate.
 +
 +@section tinterlace
 +
 +Perform various types of temporal field interlacing.
 +
 +Frames are counted starting from 1, so the first input frame is
 +considered odd.
 +
 +This filter accepts a single parameter specifying the mode. Available
 +modes are:
 +
 +@table @samp
 +@item merge, 0
 +Move odd frames into the upper field, even into the lower field,
 +generating a double height frame at half framerate.
 +
 +@item drop_odd, 1
 +Only output even frames, odd frames are dropped, generating a frame with
 +unchanged height at half framerate.
 +
 +@item drop_even, 2
 +Only output odd frames, even frames are dropped, generating a frame with
 +unchanged height at half framerate.
 +
 +@item pad, 3
 +Expand each frame to full height, but pad alternate lines with black,
 +generating a frame with double height at the same input framerate.
 +
 +@item interleave_top, 4
 +Interleave the upper field from odd frames with the lower field from
 +even frames, generating a frame with unchanged height at half framerate.
 +
 +@item interleave_bottom, 5
 +Interleave the lower field from odd frames with the upper field from
 +even frames, generating a frame with unchanged height at half framerate.
 +
 +@item interlacex2, 6
 +Double frame rate with unchanged height. Frames are inserted each
 +containing the second temporal field from the previous input frame and
 +the first temporal field from the next input frame. This mode relies on
 +the top_field_first flag. Useful for interlaced video displays with no
 +field synchronisation.
 +@end table
 +
 +Numeric values are deprecated but are accepted for backward
 +compatibility reasons.
 +
 +Default mode is @code{merge}.
 +
  @section transpose
  
  Transpose rows with columns in the input video and optionally flip it.
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -728,10 -598,8 +728,9 @@@ static int configure_video_filters(Filt
      InputStream  *ist = fg->inputs[0]->ist;
      OutputStream *ost = fg->outputs[0]->ost;
      AVFilterContext *last_filter, *filter;
-     /** filter graph containing all filters including input & output */
      AVCodecContext *codec = ost->st->codec;
 -    SinkContext sink_ctx = { .pix_fmts = choose_pixel_fmts(ost) };
 +    enum PixelFormat *pix_fmts = choose_pixel_fmts(ost);
 +    AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
      AVRational sample_aspect_ratio;
      char args[255];
      int ret;
diff --cc ffserver.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -63,10 -63,8 +63,10 @@@ static int decode_tsw1(GetByteContext *
  
      segments = bytestream2_get_le32(gb);
      offset   = bytestream2_get_le32(gb);
 +    if (segments == 0 && offset == frame_end - frame)
 +        return 0; // skip frame
      if (frame_end - frame <= offset)
-         return -1;
+         return AVERROR_INVALIDDATA;
      frame += offset;
      while (segments--) {
          if (bytestream2_get_bytes_left(gb) < 2)
@@@ -149,8 -147,8 +149,8 @@@ static int decode_dds1(GetByteContext *
              bitbuf = bytestream2_get_le16u(gb);
              mask = 1;
          }
 -        if (frame_end - frame < 2)
 +        if (frame_end - frame < width + 2)
-             return -1;
+             return AVERROR_INVALIDDATA;
          if (bitbuf & mask) {
              v = bytestream2_get_le16(gb);
              offset = (v & 0x1FFF) << 2;
@@@ -233,17 -234,17 +236,19 @@@ static int decode_wdlt(GetByteContext *
  
      while (lines--) {
          if (bytestream2_get_bytes_left(gb) < 2)
-             return -1;
+             return AVERROR_INVALIDDATA;
          segments = bytestream2_get_le16u(gb);
          while ((segments & 0xC000) == 0xC000) {
+             unsigned skip_lines = -(int16_t)segments;
              unsigned delta = -((int16_t)segments * width);
-             if (frame_end - frame <= delta)
-                 return -1;
+             if (frame_end - frame <= delta || y + lines + skip_lines > height)
+                 return AVERROR_INVALIDDATA;
              frame    += delta;
+             y        += skip_lines;
              segments = bytestream2_get_le16(gb);
          }
 +        if (frame_end <= frame)
 +            return -1;
          if (segments & 0x8000) {
              frame[width - 1] = segments & 0xFF;
              segments = bytestream2_get_le16(gb);
Simple merge
@@@ -212,14 -210,15 +212,17 @@@ static int tgv_decode_inter(TgvContext 
          int src_stride;
  
          if (vector < num_mvs) {
-             unsigned offset =
-                 (y*4 + s->mv_codebook[vector][1])*s->last_frame.linesize[0] +
-                  x*4 + s->mv_codebook[vector][0];
+             int mx = x * 4 + s->mv_codebook[vector][0];
+             int my = y * 4 + s->mv_codebook[vector][1];
  
-             src_stride = s->last_frame.linesize[0];
-             if (offset >= last_frame_size - (3*src_stride+3))
+             if (   mx < 0 || mx + 4 > s->avctx->width
 -                || my < 0 || my + 4 > s->avctx->height)
++                || my < 0 || my + 4 > s->avctx->height) {
++                av_log(s->avctx, AV_LOG_ERROR, "MV %d %d out of picture\n", mx, my);
                  continue;
-             src = s->last_frame.data[0] + offset;
++            }
+             src = s->last_frame.data[0] + mx + my * s->last_frame.linesize[0];
+             src_stride = s->last_frame.linesize[0];
          }else{
              int offset = vector - num_mvs;
              if (offset<num_blocks_raw)
Simple merge
Simple merge
@@@ -1,18 -1,8 +1,17 @@@
 +include $(SUBDIR)../config.mak
 +
  NAME = avfilter
- FFLIBS = avutil
+ FFLIBS = avutil swscale
 -FFLIBS-$(CONFIG_MOVIE_FILTER) += avformat avcodec
  
 -HEADERS = avfilter.h avfiltergraph.h buffersrc.h version.h vsrc_buffer.h
 +FFLIBS-$(CONFIG_ACONVERT_FILTER)             += swresample
 +FFLIBS-$(CONFIG_AMOVIE_FILTER)               += avformat avcodec
 +FFLIBS-$(CONFIG_ARESAMPLE_FILTER)            += swresample
 +FFLIBS-$(CONFIG_MOVIE_FILTER)                += avformat avcodec
 +FFLIBS-$(CONFIG_PAN_FILTER)                  += swresample
- FFLIBS-$(CONFIG_REMOVELOGO_FILTER)           += swscale avformat avcodec
- FFLIBS-$(CONFIG_SCALE_FILTER)                += swscale
++FFLIBS-$(CONFIG_REMOVELOGO_FILTER)           += avformat avcodec
 +FFLIBS-$(CONFIG_MP_FILTER)                   += avcodec postproc
 +
 +HEADERS = asrc_abuffer.h avcodec.h avfilter.h avfiltergraph.h buffersink.h buffersrc.h version.h vsrc_buffer.h
  
  OBJS = allfilters.o                                                     \
         avfilter.o                                                       \
         defaults.o                                                       \
         drawutils.o                                                      \
         formats.o                                                        \
 +       graphdump.o                                                      \
         graphparser.o                                                    \
 -       vsrc_buffer.o
 +       src_buffer.o                                                     \
 +       transform.o                                                      \
+        vf_scale.o                                                       \
  
 +OBJS-$(CONFIG_AVCODEC)                       += avcodec.o
 +OBJS-$(CONFIG_AVFORMAT)                      += lavfutils.o
 +OBJS-$(CONFIG_SWSCALE)                       += lswsutils.o
 +
 +OBJS-$(CONFIG_ACONVERT_FILTER)               += af_aconvert.o
 +OBJS-$(CONFIG_AFORMAT_FILTER)                += af_aformat.o
 +OBJS-$(CONFIG_AMERGE_FILTER)                 += af_amerge.o
  OBJS-$(CONFIG_ANULL_FILTER)                  += af_anull.o
 +OBJS-$(CONFIG_ARESAMPLE_FILTER)              += af_aresample.o
 +OBJS-$(CONFIG_ASHOWINFO_FILTER)              += af_ashowinfo.o
 +OBJS-$(CONFIG_ASPLIT_FILTER)                 += af_asplit.o
 +OBJS-$(CONFIG_ASTREAMSYNC_FILTER)            += af_astreamsync.o
 +OBJS-$(CONFIG_EARWAX_FILTER)                 += af_earwax.o
 +OBJS-$(CONFIG_PAN_FILTER)                    += af_pan.o
 +OBJS-$(CONFIG_SILENCEDETECT_FILTER)          += af_silencedetect.o
 +OBJS-$(CONFIG_VOLUME_FILTER)                 += af_volume.o
  
 +OBJS-$(CONFIG_AEVALSRC_FILTER)               += asrc_aevalsrc.o
 +OBJS-$(CONFIG_AMOVIE_FILTER)                 += src_movie.o
  OBJS-$(CONFIG_ANULLSRC_FILTER)               += asrc_anullsrc.o
  
 +OBJS-$(CONFIG_ABUFFERSINK_FILTER)            += sink_buffer.o
  OBJS-$(CONFIG_ANULLSINK_FILTER)              += asink_anullsink.o
  
 +OBJS-$(CONFIG_ASS_FILTER)                    += vf_ass.o
 +OBJS-$(CONFIG_BBOX_FILTER)                   += bbox.o vf_bbox.o
 +OBJS-$(CONFIG_BLACKDETECT_FILTER)            += vf_blackdetect.o
  OBJS-$(CONFIG_BLACKFRAME_FILTER)             += vf_blackframe.o
  OBJS-$(CONFIG_BOXBLUR_FILTER)                += vf_boxblur.o
 +OBJS-$(CONFIG_COLORMATRIX_FILTER)            += vf_colormatrix.o
  OBJS-$(CONFIG_COPY_FILTER)                   += vf_copy.o
  OBJS-$(CONFIG_CROP_FILTER)                   += vf_crop.o
  OBJS-$(CONFIG_CROPDETECT_FILTER)             += vf_cropdetect.o
@@@ -82,11 -46,8 +82,10 @@@ OBJS-$(CONFIG_OCV_FILTER
  OBJS-$(CONFIG_OVERLAY_FILTER)                += vf_overlay.o
  OBJS-$(CONFIG_PAD_FILTER)                    += vf_pad.o
  OBJS-$(CONFIG_PIXDESCTEST_FILTER)            += vf_pixdesctest.o
- OBJS-$(CONFIG_SCALE_FILTER)                  += vf_scale.o
 +OBJS-$(CONFIG_REMOVELOGO_FILTER)             += bbox.o lswsutils.o lavfutils.o vf_removelogo.o
  OBJS-$(CONFIG_SELECT_FILTER)                 += vf_select.o
  OBJS-$(CONFIG_SETDAR_FILTER)                 += vf_aspect.o
 +OBJS-$(CONFIG_SETFIELD_FILTER)               += vf_setfield.o
  OBJS-$(CONFIG_SETPTS_FILTER)                 += vf_setpts.o
  OBJS-$(CONFIG_SETSAR_FILTER)                 += vf_aspect.o
  OBJS-$(CONFIG_SETTB_FILTER)                  += vf_settb.o
@@@ -88,11 -66,8 +88,10 @@@ void avfilter_register_all(void
      REGISTER_FILTER (OVERLAY,     overlay,     vf);
      REGISTER_FILTER (PAD,         pad,         vf);
      REGISTER_FILTER (PIXDESCTEST, pixdesctest, vf);
-     REGISTER_FILTER (SCALE,       scale,       vf);
 +    REGISTER_FILTER (REMOVELOGO,  removelogo,  vf);
      REGISTER_FILTER (SELECT,      select,      vf);
      REGISTER_FILTER (SETDAR,      setdar,      vf);
 +    REGISTER_FILTER (SETFIELD,    setfield,    vf);
      REGISTER_FILTER (SETPTS,      setpts,      vf);
      REGISTER_FILTER (SETSAR,      setsar,      vf);
      REGISTER_FILTER (SETTB,       settb,       vf);
      REGISTER_FILTER (RGBTESTSRC,  rgbtestsrc,  vsrc);
      REGISTER_FILTER (TESTSRC,     testsrc,     vsrc);
  
 +    REGISTER_FILTER (BUFFERSINK,  buffersink,  vsink);
      REGISTER_FILTER (NULLSINK,    nullsink,    vsink);
  
-     /* vsrc_buffer is a part of public API => registered unconditionally */
+     /* those filters are part of public or internal API => registered
+      * unconditionally */
      {
          extern AVFilter avfilter_vsrc_buffer;
          avfilter_register(&avfilter_vsrc_buffer);
@@@ -45,30 -43,23 +45,30 @@@ static void merge_ref(AVFilterFormats *
  AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b)
  {
      AVFilterFormats *ret;
 -    unsigned i, j, k = 0, m_count;
 +    unsigned i, j, k = 0;
 +
 +    if (a == b) return a;
  
-     ret = av_mallocz(sizeof(AVFilterFormats));
+     ret = av_mallocz(sizeof(*ret));
  
      /* merge list of formats */
 -    m_count = FFMIN(a->format_count, b->format_count);
 -    if (m_count) {
 -        ret->formats = av_malloc(sizeof(*ret->formats) * m_count);
 -        for(i = 0; i < a->format_count; i ++)
 -            for(j = 0; j < b->format_count; j ++)
 -                if(a->formats[i] == b->formats[j])
 -                    ret->formats[k++] = a->formats[i];
 -
 -        ret->format_count = k;
 -    }
 +    ret->formats = av_malloc(sizeof(*ret->formats) * FFMIN(a->format_count,
 +                                                           b->format_count));
 +    for (i = 0; i < a->format_count; i++)
 +        for (j = 0; j < b->format_count; j++)
 +            if (a->formats[i] == b->formats[j]){
 +                if(k >= FFMIN(a->format_count, b->format_count)){
 +                    av_log(0, AV_LOG_ERROR, "Duplicate formats in avfilter_merge_formats() detected\n");
 +                    av_free(ret->formats);
 +                    av_free(ret);
 +                    return NULL;
 +                }
 +                ret->formats[k++] = a->formats[i];
 +            }
 +
 +    ret->format_count = k;
      /* check that there was at least one common format */
 -    if(!ret->format_count) {
 +    if (!ret->format_count) {
          av_free(ret->formats);
          av_free(ret);
          return NULL;
@@@ -154,11 -101,11 +154,11 @@@ AVFilterFormats *avfilter_make_format64
      return formats;
  }
  
 -int avfilter_add_format(AVFilterFormats **avff, int fmt)
 +int avfilter_add_format(AVFilterFormats **avff, int64_t fmt)
  {
 -    int *fmts;
 +    int64_t *fmts;
  
-     if (!(*avff) && !(*avff = av_mallocz(sizeof(AVFilterFormats))))
+     if (!(*avff) && !(*avff = av_mallocz(sizeof(**avff))))
          return AVERROR(ENOMEM);
  
      fmts = av_realloc((*avff)->formats,
@@@ -239,11 -158,11 +239,11 @@@ void avfilter_formats_unref(AVFilterFor
  
      idx = find_ref_index(ref);
  
-     if (idx >= 0)
-         memmove((*ref)->refs + idx, (*ref)->refs + idx+1,
-             sizeof(AVFilterFormats**) * ((*ref)->refcount-idx-1));
+     if(idx >= 0)
+         memmove((*ref)->refs + idx, (*ref)->refs + idx + 1,
+             sizeof(*(*ref)->refs) * ((*ref)->refcount - idx - 1));
  
 -    if(!--(*ref)->refcount) {
 +    if (!--(*ref)->refcount) {
          av_free((*ref)->formats);
          av_free((*ref)->refs);
          av_free(*ref);
@@@ -51,7 -94,10 +94,10 @@@ AVFilter avfilter_vf_split = 
      .name      = "split",
      .description = NULL_IF_CONFIG_SMALL("Pass on the input to two outputs."),
  
 -    .inputs    = (AVFilterPad[]) {{ .name            = "default",
+     .init   = split_init,
+     .uninit = split_uninit,
 +    .inputs    = (const AVFilterPad[]) {{ .name      = "default",
                                      .type            = AVMEDIA_TYPE_VIDEO,
                                      .get_video_buffer= avfilter_null_get_video_buffer,
                                      .start_frame     = start_frame,
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc tests/utils.c
Simple merge