Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 31 Jan 2012 00:14:58 +0000 (01:14 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 31 Jan 2012 01:46:26 +0000 (02:46 +0100)
* qatar/master: (26 commits)
  avconv: deprecate the -deinterlace option
  doc: Fix the name of the new function
  aacenc: make sure to encode enough frames to cover all input samples.
  aacenc: only use the number of input samples provided by the user.
  wmadec: Verify bitstream size makes sense before calling init_get_bits.
  kmvc: Log into a context at a log level constant.
  mpeg12: Pad framerate tab to 16 entries.
  kgv1dec: Increase offsets array size so it is large enough.
  kmvc: Check palsize.
  nsvdec: Propagate errors
  nsvdec: Be more careful with av_malloc().
  nsvdec: Fix use of uninitialized streams.
  movenc: cosmetics: Get rid of camelCase identifiers
  swscale: more generic check for planar destination formats with alpha
  doc: Document mov/mp4 fragmentation options
  build: Use order-only prerequisites for creating FATE reference file dirs.
  x86 dsputil: provide SSE2/SSSE3 versions of bswap_buf
  rtsp: Remove some unused variables from ff_rtsp_connect().
  avutil: make intfloat api public
  avformat_write_header(): detail error message
  ...

Conflicts:
doc/APIchanges
doc/ffmpeg.texi
doc/muxers.texi
ffmpeg.c
libavcodec/kmvc.c
libavcodec/x86/Makefile
libavcodec/x86/dsputil_yasm.asm
libavcodec/x86/pngdsp-init.c
libavformat/movenc.c
libavformat/movenc.h
libavformat/mpegtsenc.c
libavformat/nsvdec.c
libavformat/utils.c
libavutil/avutil.h
libswscale/swscale.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
24 files changed:
1  2 
doc/APIchanges
doc/ffmpeg.texi
doc/muxers.texi
ffmpeg.c
libavcodec/aacenc.c
libavcodec/kmvc.c
libavcodec/mpc7.c
libavcodec/mpeg12data.c
libavcodec/wmadec.c
libavcodec/x86/Makefile
libavcodec/x86/dsputil_mmx.c
libavcodec/x86/dsputil_yasm.asm
libavcodec/x86/pngdsp-init.c
libavformat/movenc.c
libavformat/movenc.h
libavformat/mpegtsenc.c
libavformat/nsvdec.c
libavformat/rtsp.c
libavformat/utils.c
libavformat/yuv4mpeg.c
libavutil/Makefile
libavutil/avutil.h
libswscale/swscale.c
tests/Makefile

diff --cc doc/APIchanges
@@@ -13,9 -13,10 +13,13 @@@ libavutil:   2011-04-1
  
  API changes, most recent first:
  
 +2012-01-24 - xxxxxxx - lavfi 2.60.100
 +  Add avfilter_graph_dump.
 +
+ 2012-01-30 - xxxxxxx - lavu 51.22.0 - intfloat.h
+   Add a new installed header libavutil/intfloat.h with int/float punning
+   functions.
  2012-01-25 - lavf 53.22.0
    f1caf01 Allow doing av_write_frame(ctx, NULL) for flushing possible
            buffered data within a muxer. Added AVFMT_ALLOW_FLUSH for
diff --cc doc/ffmpeg.texi
@@@ -620,14 -528,8 +620,16 @@@ Enable Unlimited Motion Vector (h263+
  
  @item -deinterlace
  Deinterlace pictures.
+ This option is deprecated since the deinterlacing is very low quality.
+ Use the yadif filter with @code{-filter:v yadif}.
 +@item -ilme
 +Force interlacing support in encoder (MPEG-2 and MPEG-4 only).
 +Use this option if your input file is interlaced and you want
 +to keep the interlaced format for minimum losses.
 +The alternative is to deinterlace the input stream with
 +@option{-deinterlace}, but deinterlacing introduces losses.
 +@item -psnr
 +Calculate PSNR of compressed frames.
  @item -vstats
  Dump video coding statistics to @file{vstats_HHMMSS.log}.
  @item -vstats_file @var{file}
diff --cc doc/muxers.texi
@@@ -139,27 -139,70 +139,79 @@@ Note also that the pattern must not nec
  "%0@var{N}d", for example to create a single image file
  @file{img.jpeg} from the input video you can employ the command:
  @example
 -avconv -i in.avi -f image2 -frames:v 1 img.jpeg
 +ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
  @end example
  
- @section mov
- MOV / MP4 muxer
- The muxer options are:
 +The image muxer supports the .Y.U.V image file format. This format is
 +special in that that each image frame consists of three files, for
 +each of the YUV420P components. To read or write this image file format,
 +specify the name of the '.Y' file. The muxer will automatically open the
 +'.U' and '.V' files as required.
 +
+ @section MOV/MP4/ISMV
+ The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4
+ file has all the metadata about all packets stored in one location
+ (written at the end of the file, it can be moved to the start for
+ better playback using the @command{qt-faststart} tool). A fragmented
+ file consists of a number of fragments, where packets and metadata
+ about these packets are stored together. Writing a fragmented
+ file has the advantage that the file is decodable even if the
+ writing is interrupted (while a normal MOV/MP4 is undecodable if
+ it is not properly finished), and it requires less memory when writing
+ very long files (since writing normal MOV/MP4 files stores info about
+ every single packet in memory until the file is closed). The downside
+ is that it is less compatible with other applications.
+ Fragmentation is enabled by setting one of the AVOptions that define
+ how to cut the file into fragments:
  
  @table @option
 +@item -moov_size @var{bytes}
 +Reserves space for the moov atom at the beginning of the file instead of placing the
 +moov atom at the end. If the space reserved is insufficient, muxing will fail.
+ @item -movflags frag_keyframe
+ Start a new fragment at each video keyframe.
+ @item -frag_duration @var{duration}
+ Create fragments that are @var{duration} microseconds long.
+ @item -frag_size @var{size}
+ Create fragments that contain up to @var{size} bytes of payload data.
+ @item -movflags frag_custom
+ Allow the caller to manually choose when to cut fragments, by
+ calling @code{av_write_frame(ctx, NULL)} to write a fragment with
+ the packets written so far. (This is only useful with other
+ applications integrating libavformat, not from @command{avconv}.)
+ @end table
+ Additionally, the way the output file is written can be adjusted
+ through a few other options:
+ @table @option
+ @item -movflags empty_moov
+ Write an initial moov atom directly at the start of the file, without
+ describing any samples in it. Generally, an mdat/moov pair is written
+ at the start of the file, as a normal MOV/MP4 file, containing only
+ a short portion of the file. With this option set, there is no initial
+ mdat atom, and the moov atom only describes the tracks but has
+ a zero duration.
+ Files written with this option set do not work in QuickTime.
+ This option is implicitly set when writing ismv (Smooth Streaming) files.
+ @item -movflags separate_moof
+ Write a separate moof (movie fragment) atom for each track. Normally,
+ packets for all tracks are written in a moof atom (which is slightly
+ more efficient), but with this option set, the muxer writes one moof/mdat
+ pair for each track, making it easier to separate tracks.
+ This option is implicitly set when writing ismv (Smooth Streaming) files.
  @end table
  
+ Smooth Streaming content can be pushed in real time to a publishing
+ point on IIS with this muxer. Example:
+ @example
+ avconv -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
+ @end example
  @section mpegts
  
  MPEG transport stream muxer.
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -468,10 -417,11 +468,10 @@@ static void reset_options(OptionsContex
      init_opts();
  }
  
 -static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
 +static int alloc_buffer(AVCodecContext *s, InputStream *ist, FrameBuffer **pbuf)
  {
 -    AVCodecContext *s = ist->st->codec;
      FrameBuffer  *buf = av_mallocz(sizeof(*buf));
-     int ret, i;
+     int i, ret;
      const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
      int h_chroma_shift, v_chroma_shift;
      int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
@@@ -5017,10 -4441,9 +5024,10 @@@ static const OptionDef options[] = 
      { "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" },
+     { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
+       "this option is deprecated, use the yadif filter instead" },
 +    { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
      { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
      { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
  #if CONFIG_AVFILTER
Simple merge
@@@ -380,10 -382,9 +382,10 @@@ static av_cold int decode_init(AVCodecC
          c->palsize = 127;
      } else {
          c->palsize = AV_RL16(avctx->extradata + 10);
-         if (c->palsize > 255U) {
 -        if (c->palsize >= MAX_PALSIZE) {
++        if (c->palsize >= (unsigned)MAX_PALSIZE) {
 +            c->palsize = 127;
-             av_log(NULL, AV_LOG_ERROR, "palsize too big\n");
-             return -1;
+             av_log(avctx, AV_LOG_ERROR, "KMVC palette too large\n");
+             return AVERROR_INVALIDDATA;
          }
      }
  
@@@ -53,7 -53,7 +53,7 @@@ static av_cold int mpc7_decode_init(AVC
      int i, j;
      MPCContext *c = avctx->priv_data;
      GetBitContext gb;
--    uint8_t buf[16];
++    LOCAL_ALIGNED_16(uint8_t, buf, [16]);
      static int vlc_initialized = 0;
  
      static VLC_TYPE scfi_table[1 << MPC7_SCFI_BITS][2];
Simple merge
Simple merge
@@@ -46,8 -42,7 +46,9 @@@ MMX-OBJS-$(CONFIG_ENCODERS)            
  YASM-OBJS-$(CONFIG_ENCODERS)           += x86/dsputilenc_yasm.o
  MMX-OBJS-$(CONFIG_GPL)                 += x86/idct_mmx.o
  MMX-OBJS-$(CONFIG_LPC)                 += x86/lpc_mmx.o
 +YASM-OBJS-$(CONFIG_PRORES_LGPL_DECODER)     += x86/proresdsp.o
 +MMX-OBJS-$(CONFIG_PRORES_LGPL_DECODER)      += x86/proresdsp-init.o
+ YASM-OBJS-$(CONFIG_PNG_DECODER)        += x86/pngdsp.o
  MMX-OBJS-$(CONFIG_PNG_DECODER)         += x86/pngdsp-init.o
  YASM-OBJS-$(CONFIG_PRORES_DECODER)     += x86/proresdsp.o
  MMX-OBJS-$(CONFIG_PRORES_DECODER)      += x86/proresdsp-init.o
Simple merge
@@@ -1176,7 -1177,127 +1177,130 @@@ cglobal butterflies_float_interleave, 4
  
  INIT_XMM sse
  BUTTERFLIES_FLOAT_INTERLEAVE
 +%ifdef HAVE_AVX
  INIT_YMM avx
  BUTTERFLIES_FLOAT_INTERLEAVE
 +%endif
+ INIT_XMM sse2
+ ; %1 = aligned/unaligned
+ %macro BSWAP_LOOPS_SSE2  1
+     mov      r3, r2
+     sar      r2, 3
+     jz       .left4_%1
+ .loop8_%1:
+     mov%1    m0, [r1 +  0]
+     mov%1    m1, [r1 + 16]
+     pshuflw  m0, m0, 10110001b
+     pshuflw  m1, m1, 10110001b
+     pshufhw  m0, m0, 10110001b
+     pshufhw  m1, m1, 10110001b
+     mova     m2, m0
+     mova     m3, m1
+     psllw    m0, 8
+     psllw    m1, 8
+     psrlw    m2, 8
+     psrlw    m3, 8
+     por      m2, m0
+     por      m3, m1
+     mova     [r0 +  0], m2
+     mova     [r0 + 16], m3
+     add      r1, 32
+     add      r0, 32
+     dec      r2
+     jnz      .loop8_%1
+ .left4_%1:
+     mov      r2, r3
+     and      r3, 4
+     jz       .left
+     mov%1    m0, [r1]
+     pshuflw  m0, m0, 10110001b
+     pshufhw  m0, m0, 10110001b
+     mova     m2, m0
+     psllw    m0, 8
+     psrlw    m2, 8
+     por      m2, m0
+     mova     [r0], m2
+     add      r1, 16
+     add      r0, 16
+ %endmacro
+ ; void bswap_buf(uint32_t *dst, const uint32_t *src, int w);
+ cglobal bswap32_buf, 3,4,5
+     mov      r3, r1
+     and      r3, 15
+     jz       .start_align
+     BSWAP_LOOPS_SSE2  u
+     jmp      .left
+ .start_align:
+     BSWAP_LOOPS_SSE2  a
+ .left:
+     and      r2, 3
+     jz       .end
+ .loop2:
+     mov      r3d, [r1]
+     bswap    r3d
+     mov      [r0], r3d
+     add      r1, 4
+     add      r0, 4
+     dec      r2
+     jnz      .loop2
+ .end
+     RET
+ ; %1 = aligned/unaligned
+ %macro BSWAP_LOOPS_SSSE3  1
+     mov      r3, r2
+     sar      r2, 3
+     jz       .left4_%1
+ .loop8_%1:
+     mov%1    m0, [r1 +  0]
+     mov%1    m1, [r1 + 16]
+     pshufb   m0, m2
+     pshufb   m1, m2
+     mova     [r0 +  0], m0
+     mova     [r0 + 16], m1
+     add      r0, 32
+     add      r1, 32
+     dec      r2
+     jnz      .loop8_%1
+ .left4_%1:
+     mov      r2, r3
+     and      r3, 4
+     jz       .left2
+     mov%1    m0, [r1]
+     pshufb   m0, m2
+     mova     [r0], m0
+     add      r1, 16
+     add      r0, 16
+ %endmacro
+ INIT_XMM ssse3
+ ; void bswap_buf(uint32_t *dst, const uint32_t *src, int w);
+ cglobal bswap32_buf, 3,4,3
+     mov      r3, r1
+     mova     m2, [pb_bswap32]
+     and      r3, 15
+     jz       .start_align
+     BSWAP_LOOPS_SSSE3  u
+     jmp      .left2
+ .start_align:
+     BSWAP_LOOPS_SSSE3  a
+ .left2:
+     mov      r3, r2
+     and      r2, 2
+     jz       .left1
+     movq     m0, [r1]
+     pshufb   m0, m2
+     movq     [r0], m0
+     add      r1, 8
+     add      r0, 8
+ .left1:
+     and      r3, 1
+     jz       .end
+     mov      r2d, [r1]
+     bswap    r2d
+     mov      [r0], r2d
+ .end:
+     RET
++
Simple merge
@@@ -154,14 -151,14 +154,14 @@@ static int mov_write_stsc_tag(AVIOConte
      ffio_wfourcc(pb, "stsc");
      avio_wb32(pb, 0); // version & flags
      entryPos = avio_tell(pb);
 -    avio_wb32(pb, track->entry); // entry count
 +    avio_wb32(pb, track->chunkCount); // entry count
      for (i=0; i<track->entry; i++) {
-         if(oldval != track->cluster[i].samplesInChunk && track->cluster[i].chunkNum)
 -        if (oldval != track->cluster[i].samples_in_chunk)
++        if (oldval != track->cluster[i].samples_in_chunk && track->cluster[i].chunkNum)
          {
 -            avio_wb32(pb, i+1); // first chunk
 +            avio_wb32(pb, track->cluster[i].chunkNum); // first chunk
-             avio_wb32(pb, track->cluster[i].samplesInChunk); // samples per chunk
+             avio_wb32(pb, track->cluster[i].samples_in_chunk); // samples per chunk
              avio_wb32(pb, 0x1); // sample description index
-             oldval = track->cluster[i].samplesInChunk;
+             oldval = track->cluster[i].samples_in_chunk;
              index++;
          }
      }
@@@ -282,20 -279,10 +282,20 @@@ static void put_descr(AVIOContext *pb, 
      avio_w8(pb, size & 0x7F);
  }
  
-     return size * 8 * track->timescale / track->trackDuration;
 +static unsigned compute_avg_bitrate(MOVTrack *track)
 +{
 +    uint64_t size = 0;
 +    int i;
 +    for (i = 0; i < track->entry; i++)
 +        size += track->cluster[i].size;
++    return size * 8 * track->timescale / track->track_duration;
 +}
 +
  static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
  {
      int64_t pos = avio_tell(pb);
-     int decoderSpecificInfoLen = track->vosLen ? 5+track->vosLen : 0;
+     int decoder_specific_info_len = track->vos_len ? 5 + track->vos_len : 0;
 +    unsigned avg_bitrate;
  
      avio_wb32(pb, 0); // size
      ffio_wfourcc(pb, "esds");
      avio_w8(pb,  track->enc->rc_buffer_size>>(3+16));      // Buffersize DB (24 bits)
      avio_wb16(pb, (track->enc->rc_buffer_size>>3)&0xFFFF); // Buffersize DB
  
 -    avio_wb32(pb, FFMAX(track->enc->bit_rate, track->enc->rc_max_rate)); // maxbitrate (FIXME should be max rate in any 1 sec window)
 -    if(track->enc->rc_max_rate != track->enc->rc_min_rate || track->enc->rc_min_rate==0)
 -        avio_wb32(pb, 0); // vbr
 -    else
 -        avio_wb32(pb, track->enc->rc_max_rate); // avg bitrate
 +    avg_bitrate = compute_avg_bitrate(track);
 +    // maxbitrate (FIXME should be max rate in any 1 sec window)
 +    avio_wb32(pb, FFMAX3(track->enc->bit_rate, track->enc->rc_max_rate, avg_bitrate));
 +    avio_wb32(pb, avg_bitrate);
  
-     if (track->vosLen) {
+     if (track->vos_len) {
          // DecoderSpecific info descriptor
-         putDescr(pb, 0x05, track->vosLen);
-         avio_write(pb, track->vosData, track->vosLen);
+         put_descr(pb, 0x05, track->vos_len);
+         avio_write(pb, track->vos_data, track->vos_len);
      }
  
      // SL descriptor
@@@ -502,35 -484,19 +502,35 @@@ static int mov_write_audio_tag(AVIOCont
          avio_wb32(pb, 0x7F000000);
          avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id));
          avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id));
-         avio_wb32(pb, track->sampleSize);
+         avio_wb32(pb, track->sample_size);
 -        avio_wb32(pb, track->audio_vbr ? track->enc->frame_size : 1);
 +        avio_wb32(pb, track->enc->frame_size);
      } else {
 -        /* reserved for mp4/3gp */
 -        avio_wb16(pb, 2);
 -        avio_wb16(pb, 16);
 -        avio_wb16(pb, 0);
 +        if (track->mode == MODE_MOV) {
 +            avio_wb16(pb, track->enc->channels);
 +            if (track->enc->codec_id == CODEC_ID_PCM_U8 ||
 +                track->enc->codec_id == CODEC_ID_PCM_S8)
 +                avio_wb16(pb, 8); /* bits per sample */
 +            else
 +                avio_wb16(pb, 16);
 +            avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
 +        } else { /* reserved for mp4/3gp */
 +            avio_wb16(pb, 2);
 +            avio_wb16(pb, 16);
 +            avio_wb16(pb, 0);
 +        }
  
          avio_wb16(pb, 0); /* packet size (= 0) */
          avio_wb16(pb, track->enc->sample_rate);
          avio_wb16(pb, 0); /* Reserved */
      }
  
-         avio_wb32(pb, track->sampleSize / track->enc->channels); /* Bytes per packet */
-         avio_wb32(pb, track->sampleSize); /* Bytes per frame */
 +    if(version == 1) { /* SoundDescription V1 extended info */
 +        avio_wb32(pb, track->enc->frame_size); /* Samples per packet */
++        avio_wb32(pb, track->sample_size / track->enc->channels); /* Bytes per packet */
++        avio_wb32(pb, track->sample_size); /* Bytes per frame */
 +        avio_wb32(pb, 2); /* Bytes per sample */
 +    }
 +
      if(track->mode == MODE_MOV &&
         (track->enc->codec_id == CODEC_ID_AAC ||
          track->enc->codec_id == CODEC_ID_AC3 ||
@@@ -1905,27 -1873,6 +1905,27 @@@ static int mov_write_uuidusmt_tag(AVIOC
      return 0;
  }
  
-             chunk->samplesInChunk += trk->cluster[i].entries;
 +static void build_chunks(MOVTrack *trk)
 +{
 +    int i;
 +    MOVIentry *chunk= &trk->cluster[0];
 +    uint64_t chunkSize = chunk->size;
 +    chunk->chunkNum= 1;
 +    trk->chunkCount= 1;
 +    for(i=1; i<trk->entry; i++){
 +        if(chunk->pos + chunkSize == trk->cluster[i].pos &&
 +            chunkSize + trk->cluster[i].size < (1<<20)){
 +            chunkSize             += trk->cluster[i].size;
++            chunk->samples_in_chunk += trk->cluster[i].entries;
 +        }else{
 +            trk->cluster[i].chunkNum = chunk->chunkNum+1;
 +            chunk=&trk->cluster[i];
 +            chunkSize = chunk->size;
 +            trk->chunkCount++;
 +        }
 +    }
 +}
 +
  static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
                                AVFormatContext *s)
  {
              continue;
  
          mov->tracks[i].time = mov->time;
-         mov->tracks[i].trackID = i+1;
+         mov->tracks[i].track_id = i+1;
 +
 +        build_chunks(&mov->tracks[i]);
      }
  
      if (mov->chapter_track)
@@@ -2699,22 -2644,19 +2699,22 @@@ static int mov_write_packet_internal(AV
              av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n");
              return -1;
          }
-         samplesInChunk = enc->frame_size;
-     } else if (trk->sampleSize)
-         samplesInChunk = size/trk->sampleSize;
 +    } else if (enc->codec_id == CODEC_ID_ADPCM_MS ||
 +               enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
++        samples_in_chunk = enc->frame_size;
+     } else if (trk->sample_size)
+         samples_in_chunk = size / trk->sample_size;
      else
-         samplesInChunk = 1;
+         samples_in_chunk = 1;
  
      /* copy extradata if it exists */
-     if (trk->vosLen == 0 && enc->extradata_size > 0) {
-         trk->vosLen = enc->extradata_size;
-         trk->vosData = av_malloc(trk->vosLen);
-         memcpy(trk->vosData, enc->extradata, trk->vosLen);
+     if (trk->vos_len == 0 && enc->extradata_size > 0) {
+         trk->vos_len = enc->extradata_size;
+         trk->vos_data = av_malloc(trk->vos_len);
+         memcpy(trk->vos_data, enc->extradata, trk->vos_len);
      }
  
-     if (enc->codec_id == CODEC_ID_H264 && trk->vosLen > 0 && *(uint8_t *)trk->vosData != 1) {
+     if (enc->codec_id == CODEC_ID_H264 && trk->vos_len > 0 && *(uint8_t *)trk->vos_data != 1) {
          /* from x264 or from bytestream h264 */
          /* nal reformating needed */
          if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
      }
  
      trk->cluster[trk->entry].pos = avio_tell(pb) - size;
-     trk->cluster[trk->entry].samplesInChunk = samplesInChunk;
+     trk->cluster[trk->entry].samples_in_chunk = samples_in_chunk;
 +    trk->cluster[trk->entry].chunkNum = 0;
      trk->cluster[trk->entry].size = size;
-     trk->cluster[trk->entry].entries = samplesInChunk;
+     trk->cluster[trk->entry].entries = samples_in_chunk;
      trk->cluster[trk->entry].dts = pkt->dts;
      if (!trk->entry && trk->start_dts != AV_NOPTS_VALUE) {
          /* First packet of a new fragment. We already wrote the duration
@@@ -2940,21 -2877,21 +2940,21 @@@ static int mov_write_header(AVFormatCon
                         "or choose different container.\n");
          }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){
              track->timescale = st->codec->sample_rate;
 -            /* set sample_size for PCM and ADPCM */
 -            if (av_get_bits_per_sample(st->codec->codec_id)) {
 +            if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) {
 +                av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i);
 +                goto error;
 +            }else if(st->codec->codec_id == CODEC_ID_ADPCM_MS ||
 +                     st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV){
                  if (!st->codec->block_align) {
 -                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i);
 +                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i);
                      goto error;
                  }
-                 track->sampleSize = st->codec->block_align;
+                 track->sample_size = st->codec->block_align;
 -            }
 -            /* set audio_vbr for compressed audio */
 -            if (av_get_bits_per_sample(st->codec->codec_id) < 8) {
 -                if (!st->codec->frame_size && track->mode == MODE_MOV) {
 -                    av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i);
 -                    goto error;
 -                }
 +            }else if(st->codec->frame_size > 1){ /* assume compressed audio */
                  track->audio_vbr = 1;
-                 track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
 +            }else{
 +                st->codec->frame_size = 1;
++                track->sample_size = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
              }
              if (track->mode != MODE_MOV) {
                  if (track->timescale > UINT16_MAX) {
@@@ -44,8 -44,7 +44,8 @@@ typedef struct MOVIentry 
      uint64_t     pos;
      int64_t      dts;
      unsigned int size;
-     unsigned int samplesInChunk;
+     unsigned int samples_in_chunk;
 +    unsigned int chunkNum;              ///< Chunk number if the current entry is a chunk start otherwise 0
      unsigned int entries;
      int          cts;
  #define MOV_SYNC_SAMPLE         0x0001
@@@ -79,11 -78,10 +79,11 @@@ typedef struct MOVIndex 
      int         entry;
      unsigned    timescale;
      uint64_t    time;
-     int64_t     trackDuration;
-     long        sampleCount;
-     long        sampleSize;
+     int64_t     track_duration;
+     long        sample_count;
+     long        sample_size;
 +    long        chunkCount;
-     int         hasKeyframes;
+     int         has_keyframes;
  #define MOV_TRACK_CTTS         0x0001
  #define MOV_TRACK_STPS         0x0002
      uint32_t    flags;
@@@ -991,8 -956,8 +991,8 @@@ static int mpegts_write_packet(AVFormat
  
          if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
              av_log(s, AV_LOG_ERROR, "H.264 bitstream malformed, "
-                    "no startcode found, use the h264_mp4toannexb bitstream filter\n");
 -                   "no startcode found, use -bsf h264_mp4toannexb\n");
 -            return -1;
++                   "no startcode found, use the h264_mp4toannexb bitstream filter (-bsf h264_mp4toannexb)\n");
 +            return AVERROR_INVALIDDATA;
          }
  
          do {
Simple merge
Simple merge
@@@ -2985,10 -2781,12 +2985,14 @@@ int avformat_write_header(AVFormatConte
                  ret = AVERROR(EINVAL);
                  goto fail;
              }
 -            if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
 +            if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
 +               && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
 +            ){
-                 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
+                 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder "
+                        "(%d/%d) and muxer layer (%d/%d)\n",
+                        st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
+                        st->codec->sample_aspect_ratio.num,
+                        st->codec->sample_aspect_ratio.den);
                  ret = AVERROR(EINVAL);
                  goto fail;
              }
Simple merge
Simple merge
   */
  
  #define LIBAVUTIL_VERSION_MAJOR 51
- #define LIBAVUTIL_VERSION_MINOR 35
- #define LIBAVUTIL_VERSION_MICRO 101
 -#define LIBAVUTIL_VERSION_MINOR 22
 -#define LIBAVUTIL_VERSION_MICRO  0
++#define LIBAVUTIL_VERSION_MINOR 36
++#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \
Simple merge
diff --cc tests/Makefile
@@@ -4,41 -2,24 +4,39 @@@ AREF = fate-acodec-are
  VREF = fate-vsynth1-vref fate-vsynth2-vref
  REFS = $(AREF) $(VREF)
  
 -$(VREF): avconv$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm
 -$(AREF): avconv$(EXESUF) tests/data/asynth1.sw
 +$(VREF): ffmpeg$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm
 +$(AREF): ffmpeg$(EXESUF) tests/data/asynth1.sw
 +
 +ffservertest: ffserver$(EXESUF) tests/vsynth1/00.pgm tests/data/asynth1.sw
 +      @echo
 +      @echo "Unfortunately ffserver is broken and therefore its regression"
 +      @echo "test fails randomly. Treat the results accordingly."
 +      @echo
 +      $(SRC_PATH)/tests/ffserver-regression.sh $(FFSERVER_REFFILE) $(SRC_PATH)/tests/ffserver.conf
  
- tests/vsynth1/00.pgm: tests/videogen$(HOSTEXESUF)
-       @mkdir -p tests/vsynth1
+ OBJDIRS += tests/data tests/vsynth1 tests/vsynth2
+ tests/vsynth1/00.pgm: tests/videogen$(HOSTEXESUF) | tests/vsynth1
        $(M)./$< 'tests/vsynth1/'
  
- tests/vsynth2/00.pgm: tests/rotozoom$(HOSTEXESUF)
-       @mkdir -p tests/vsynth2
+ tests/vsynth2/00.pgm: tests/rotozoom$(HOSTEXESUF) | tests/vsynth2
        $(M)./$< 'tests/vsynth2/' $(SRC_PATH)/tests/lena.pnm
  
- tests/data/asynth1.sw: tests/audiogen$(HOSTEXESUF)
-       @mkdir -p tests/data
+ tests/data/asynth1.sw: tests/audiogen$(HOSTEXESUF) | tests/data
        $(M)./$< $@
  
- tests/data/asynth-16000-1.sw: tests/audiogen$(HOSTEXESUF)
-       @mkdir -p tests/data
+ tests/data/asynth-16000-1.sw: tests/audiogen$(HOSTEXESUF) | tests/data
        $(M)./$< $@ 16000 1
  
 -tests/data/asynth%.sw tests/vsynth%/00.pgm: TAG = GEN
 +tests/data/mapchan-6ch.sw: tests/audiogen$(HOSTEXESUF)
 +      @mkdir -p tests/data
 +      $(M)./$< $@ 22050 6
 +
 +tests/data/mapchan-mono.sw: tests/audiogen$(HOSTEXESUF)
 +      @mkdir -p tests/data
 +      $(M)./$< $@ 22050 1
 +
 +tests/data/%.sw tests/vsynth%/00.pgm: TAG = GEN
  
  include $(SRC_PATH)/tests/fate/aac.mak
  include $(SRC_PATH)/tests/fate/ac3.mak