Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Aug 2012 20:14:43 +0000 (22:14 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Aug 2012 20:22:37 +0000 (22:22 +0200)
* qatar/master:
  nuv: K&R formatting cosmetics
  build: generalise rules and variable settings for av* programs
  nuv: check RTjpeg header for validity
  Revert "nuv: check per-frame header for validity."
  imc: remove unused field IMCContext.one_div_log2
  imc: fix size of a memset()
  imc: remove empty if() block
  fate: simplify variable setting filter.mak
  lavf: Declare an AVRational struct without a struct literal

Conflicts:
Makefile
configure
libavcodec/nuv.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Makefile
configure
libavcodec/imc.c
libavcodec/nuv.c
libavcodec/rtjpeg.h
libavformat/utils.c
tests/fate/filter.mak

diff --cc Makefile
+++ b/Makefile
@@@ -8,16 -6,60 +8,16 @@@ vpath %.S    $(SRC_PATH
  vpath %.asm  $(SRC_PATH)
  vpath %.v    $(SRC_PATH)
  vpath %.texi $(SRC_PATH)
 +vpath %/fate_config.sh.template $(SRC_PATH)
  
 -ifndef V
 -Q      = @
 -ECHO   = printf "$(1)\t%s\n" $(2)
 -BRIEF  = CC AS YASM AR LD HOSTCC
 -SILENT = DEPCC DEPAS DEPHOSTCC DEPYASM RM RANLIB
 -MSG    = $@
 -M      = @$(call ECHO,$(TAG),$@);
 -$(foreach VAR,$(BRIEF), \
 -    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
 -$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
 -$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_PATH)/%=%)); $(INSTALL))
 -endif
 -
 -ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil swscale
 -
 -IFLAGS     := -I. -I$(SRC_PATH)
 -CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
 -CFLAGS     += $(ECFLAGS)
 -CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
 -ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 -YASMFLAGS  += $(IFLAGS) -I$(SRC_PATH)/libavutil/x86/ -Pconfig.asm
 -HOSTCCFLAGS = $(IFLAGS) $(HOSTCFLAGS)
 -LDFLAGS    := $(ALLFFLIBS:%=-Llib%) $(LDFLAGS)
 -
 -define COMPILE
 -      $(call $(1)DEP,$(1))
 -      $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
 -endef
 -
 -COMPILE_C = $(call COMPILE,CC)
 -COMPILE_S = $(call COMPILE,AS)
 -
 -%.o: %.c
 -      $(COMPILE_C)
 -
 -%.o: %.S
 -      $(COMPILE_S)
 -
 -%.ho: %.h
 -      $(CC) $(CCFLAGS) -c $(CC_O) -x c $<
 -
 -%.ver: %.v
 -      $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
 -
 -%.c %.h: TAG = GEN
 -
 -PROGS-$(CONFIG_AVCONV)   += avconv
 -PROGS-$(CONFIG_AVPLAY)   += avplay
 -PROGS-$(CONFIG_AVPROBE)  += avprobe
 -PROGS-$(CONFIG_AVSERVER) += avserver
 +PROGS-$(CONFIG_FFMPEG)   += ffmpeg
 +PROGS-$(CONFIG_FFPLAY)   += ffplay
 +PROGS-$(CONFIG_FFPROBE)  += ffprobe
 +PROGS-$(CONFIG_FFSERVER) += ffserver
  
  PROGS      := $(PROGS-yes:%=%$(EXESUF))
- OBJS        = $(PROGS-yes:%=%.o) cmdutils.o
 +INSTPROGS   = $(PROGS-yes:%=%$(PROGSSUF)$(EXESUF))
+ OBJS        = cmdutils.o
  TESTTOOLS   = audiogen videogen rotozoom tiny_psnr base64
  HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options
  TOOLS       = qt-faststart trasher
@@@ -88,12 -121,19 +88,19 @@@ ende
  
  $(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))
  
- ffplay.o: CFLAGS += $(SDL_CFLAGS)
- ffplay_g$(EXESUF): FF_EXTRALIBS += $(SDL_LIBS)
- ffserver_g$(EXESUF): LDFLAGS += $(FFSERVERLDFLAGS)
+ define DOPROG
+ OBJS-$(1) += $(1).o
 -$(1)$(EXESUF): $(OBJS-$(1))
++$(1)_g$(EXESUF): $(OBJS-$(1))
+ $$(OBJS-$(1)): CFLAGS  += $(CFLAGS-$(1))
 -$(1)$(EXESUF): LDFLAGS += $(LDFLAGS-$(1))
 -$(1)$(EXESUF): FF_EXTRALIBS += $(LIBS-$(1))
++$(1)_g$(EXESUF): LDFLAGS += $(LDFLAGS-$(1))
++$(1)_g$(EXESUF): FF_EXTRALIBS += $(LIBS-$(1))
+ -include $$(OBJS-$(1):.o=.d)
+ endef
+ $(foreach P,$(PROGS-yes),$(eval $(call DOPROG,$(P))))
  
 -$(PROGS): %$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS)
 +%$(PROGSSUF)_g$(EXESUF): %.o cmdutils.o $(FF_DEP_LIBS)
-       $(LD) $(LDFLAGS) -o $@ $< cmdutils.o $(FF_EXTRALIBS)
+       $(LD) $(LDFLAGS) -o $@ $(OBJS-$*) cmdutils.o $(FF_EXTRALIBS)
  
  OBJDIRS += tools
  
diff --cc configure
+++ b/configure
@@@ -3926,7 -3442,7 +3926,7 @@@ CXX_O=$CXX_
  LD_O=$LD_O
  DLLTOOL=$dlltool
  LDFLAGS=$LDFLAGS
- FFSERVERLDFLAGS=$FFSERVERLDFLAGS
 -LDFLAGS-avserver=$AVSERVERLDFLAGS
++LDFLAGS-ffserver=$FFSERVERLDFLAGS
  SHFLAGS=$SHFLAGS
  YASMFLAGS=$YASMFLAGS
  BUILDSUF=$build_suffix
@@@ -3960,11 -3474,11 +3960,11 @@@ HOSTCC_C=$HOSTCC_
  HOSTCC_O=$HOSTCC_O
  TARGET_EXEC=$target_exec
  TARGET_PATH=$target_path
- SDL_LIBS=$sdl_libs
- SDL_CFLAGS=$sdl_cflags
 -LIBS-avplay=$sdl_libs
 -CFLAGS-avplay=$sdl_cflags
++LIBS-ffplay=$sdl_libs
++CFLAGS-ffplay=$sdl_cflags
  LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
  EXTRALIBS=$extralibs
 -INSTALL=install
 +INSTALL=$install
  LIBTARGET=${LIBTARGET}
  SLIBNAME=${SLIBNAME}
  SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
Simple merge
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include <stdio.h>
  #include <stdlib.h>
 +#include <limits.h>
  
  #include "libavutil/bswap.h"
  #include "libavutil/lzo.h"
@@@ -113,38 -117,44 +118,49 @@@ static int codec_reinit(AVCodecContext 
      if (quality >= 0)
          get_quant_quality(c, quality);
      if (width != c->width || height != c->height) {
 -        if (av_image_check_size(height, width, 0, avctx) < 0)
 -            return 0;
 +        // also reserve space for a possible additional header
 +        int buf_size = 24 + height * width * 3 / 2 + AV_LZO_OUTPUT_PADDING;
 +        if (av_image_check_size(height, width, 0, avctx) < 0 ||
 +            buf_size > INT_MAX/8)
 +            return -1;
-         avctx->width = c->width = width;
+         avctx->width  = c->width  = width;
          avctx->height = c->height = height;
-         av_fast_malloc(&c->decomp_buf, &c->decomp_size, buf_size);
+         av_fast_malloc(&c->decomp_buf, &c->decomp_size,
 -                       c->height * c->width * 3 / 2);
++                       buf_size);
          if (!c->decomp_buf) {
-             av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
+             av_log(avctx, AV_LOG_ERROR,
+                    "Can't allocate decompression buffer.\n");
 -            return 0;
 +            return AVERROR(ENOMEM);
          }
-         ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, c->lq, c->cq);
+         ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height,
+                               c->lq, c->cq);
 +        return 1;
      } else if (quality != c->quality)
-         ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, c->lq, c->cq);
+         ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height,
+                               c->lq, c->cq);
 -    return 1;
 +    return 0;
  }
  
  static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                         AVPacket *avpkt) {
+                         AVPacket *avpkt)
+ {
      const uint8_t *buf = avpkt->data;
-     int buf_size = avpkt->size;
-     NuvContext *c = avctx->priv_data;
-     AVFrame *picture = data;
-     int orig_size = buf_size;
+     int buf_size       = avpkt->size;
+     NuvContext *c      = avctx->priv_data;
+     AVFrame *picture   = data;
+     int orig_size      = buf_size;
      int keyframe;
 +    int size_change = 0;
      int result;
-     enum {NUV_UNCOMPRESSED = '0', NUV_RTJPEG = '1',
-           NUV_RTJPEG_IN_LZO = '2', NUV_LZO = '3',
-           NUV_BLACK = 'N', NUV_COPY_LAST = 'L'} comptype;
+     enum {
+         NUV_UNCOMPRESSED  = '0',
+         NUV_RTJPEG        = '1',
+         NUV_RTJPEG_IN_LZO = '2',
+         NUV_LZO           = '3',
+         NUV_BLACK         = 'N',
+         NUV_COPY_LAST     = 'L'
+     } comptype;
  
      if (buf_size < 12) {
          av_log(avctx, AV_LOG_ERROR, "coded frame too small\n");
      }
      comptype = buf[1];
      switch (comptype) {
-         case NUV_RTJPEG_IN_LZO:
-         case NUV_RTJPEG:
-             keyframe = !buf[2]; break;
-         case NUV_COPY_LAST:
-             keyframe = 0; break;
-         default:
-             keyframe = 1; break;
+     case NUV_RTJPEG_IN_LZO:
+     case NUV_RTJPEG:
+         keyframe = !buf[2];
+         break;
+     case NUV_COPY_LAST:
+         keyframe = 0;
+         break;
+     default:
+         keyframe = 1;
+         break;
      }
 +retry:
      // skip rest of the frameheader.
-     buf = &buf[12];
+     buf       = &buf[12];
      buf_size -= 12;
      if (comptype == NUV_RTJPEG_IN_LZO || comptype == NUV_LZO) {
 -        int outlen = c->decomp_size, inlen = buf_size;
 +        int outlen = c->decomp_size - AV_LZO_OUTPUT_PADDING, inlen = buf_size;
          if (av_lzo1x_decode(c->decomp_buf, &outlen, buf, &inlen))
              av_log(avctx, AV_LOG_ERROR, "error during lzo decompression\n");
-         buf = c->decomp_buf;
+         buf      = c->decomp_buf;
 -        buf_size = c->decomp_size;
 +        buf_size = c->decomp_size - AV_LZO_OUTPUT_PADDING - outlen;
      }
      if (c->codec_frameheader) {
-         int w, h, q, res;
-         if (buf_size < 12) {
+         int w, h, q;
 -        if (buf_size < RTJPEG_HEADER_SIZE || buf[4] != RTJPEG_HEADER_SIZE ||
 -            buf[5] != RTJPEG_FILE_VERSION) {
 -            av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame\n");
++        int res;
++        if (buf_size < RTJPEG_HEADER_SIZE) {
 +            av_log(avctx, AV_LOG_ERROR, "Too small NUV video frame\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        // There seem to exist two variants of this header: one starts with 'V'
 +        // and 5 bytes unknown, the other matches current MythTV and is 4 bytes size,
 +        // 1 byte header size (== 12), 1 byte version (== 0)
 +        if (buf[0] != 'V' && AV_RL16(&buf[4]) != 0x000c) {
 +            av_log(avctx, AV_LOG_ERROR, "Unknown secondary frame header (wrong codec_tag?)\n");
              return AVERROR_INVALIDDATA;
          }
          w = AV_RL16(&buf[6]);
          h = AV_RL16(&buf[8]);
          q = buf[10];
 -        if (!codec_reinit(avctx, w, h, q))
 -            return -1;
 -        buf       = &buf[RTJPEG_HEADER_SIZE];
 +        res = codec_reinit(avctx, w, h, q);
 +        if (res < 0)
 +            return res;
 +        if (res) {
 +            buf = avpkt->data;
 +            buf_size = avpkt->size;
 +            size_change = 1;
 +            goto retry;
 +        }
-         buf = &buf[12];
-         buf_size -= 12;
++        buf = &buf[RTJPEG_HEADER_SIZE];
+         buf_size -= RTJPEG_HEADER_SIZE;
      }
  
 -    if (keyframe && c->pic.data[0])
 +    if ((size_change || keyframe) && c->pic.data[0])
          avctx->release_buffer(avctx, &c->pic);
-     c->pic.reference = 3;
-     c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_READABLE |
+     c->pic.reference    = 3;
+     c->pic.buffer_hints = FF_BUFFER_HINTS_VALID    | FF_BUFFER_HINTS_READABLE |
                            FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
      result = avctx->reget_buffer(avctx, &c->pic);
      if (result < 0) {
      return orig_size;
  }
  
- static av_cold int decode_init(AVCodecContext *avctx) {
-     NuvContext *c = avctx->priv_data;
+ static av_cold int decode_init(AVCodecContext *avctx)
+ {
+     NuvContext *c  = avctx->priv_data;
      avctx->pix_fmt = PIX_FMT_YUV420P;
      c->pic.data[0] = NULL;
-     c->decomp_buf = NULL;
-     c->quality = -1;
-     c->width = 0;
-     c->height = 0;
+     c->decomp_buf  = NULL;
+     c->quality     = -1;
+     c->width       = 0;
+     c->height      = 0;
      c->codec_frameheader = avctx->codec_tag == MKTAG('R', 'J', 'P', 'G');
      if (avctx->extradata_size)
          get_quant(avctx, c, avctx->extradata, avctx->extradata_size);
      ff_dsputil_init(&c->dsp, avctx);
 -    if (!codec_reinit(avctx, avctx->width, avctx->height, -1))
 +    if (codec_reinit(avctx, avctx->width, avctx->height, -1) < 0)
          return 1;
      return 0;
  }
  
Simple merge
Simple merge
@@@ -19,11 -19,10 +19,10 @@@ $(FATE_AMIX): CMP  = oneof
  $(FATE_AMIX): CMP_UNIT = f32
  
  FATE_FILTER += $(FATE_AMIX)
- FATE_SAMPLES_AVCONV += $(FATE_AMIX)
  
- FATE_ASYNCTS += fate-filter-asyncts
+ FATE_FILTER += fate-filter-asyncts
  fate-filter-asyncts: SRC = $(SAMPLES)/nellymoser/nellymoser-discont.flv
 -fate-filter-asyncts: CMD = pcm -analyzeduration 10000000 -i $(SRC) -af asyncts
 +fate-filter-asyncts: CMD = pcm -i $(SRC) -af aresample=min_comp=0.001:min_hard_comp=0.1
  fate-filter-asyncts: CMP = oneoff
  fate-filter-asyncts: REF = $(SAMPLES)/nellymoser/nellymoser-discont.pcm