Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 8 Jan 2012 00:29:15 +0000 (01:29 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 8 Jan 2012 02:34:22 +0000 (03:34 +0100)
* qatar/master: (29 commits)
  cabac: Move code only used within the CABAC test program into the test program.
  vp56: Drop unnecessary cabac.h #include.
  h264-test: Initialize AVCodecContext.av_class.
  build: Skip compiling network.h and rtsp.h if networking is not enabled.
  cosmetics: drop some pointless parentheses
  Disable annoying warning without changing behavior
  faq: Solutions for common problems with sample paths when running FATE.
  avcodec: attempt to clarify the CODEC_CAP_DELAY documentation
  avcodec: fix avcodec_encode_audio() documentation.
  FATE: xmv-demux test; exercise the XMV demuxer without decoding the perceptual codecs inside.
  vqf: recognize more metadata chunks
  FATE test: BMV demuxer and associated video and audio decoders.
  FATE: indeo4 video decoder test.
  FATE: update xxan-wc4 test to a sample with more code coverage.
  Change the recent h264_mp4toannexb bitstream filter test to output to an elementary stream rather than a program stream.
  g722enc: validate AVCodecContext.trellis
  g722enc: set frame_size, and also handle an odd number of input samples
  g722enc: split encoding into separate functions for trellis vs. no trellis
  mpegaudiodec: Use clearer pointer math
  tta: Fix returned error code at EOF
  ...

Conflicts:
libavcodec/h264.c
libavcodec/indeo3.c
libavcodec/interplayvideo.c
libavcodec/ivi_common.c
libavcodec/libxvidff.c
libavcodec/mpegvideo.c
libavcodec/ppc/mpegvideo_altivec.c
libavcodec/tta.c
libavcodec/utils.c
libavfilter/vsrc_buffer.c
libavformat/Makefile
tests/fate/indeo.mak
tests/ref/acodec/g722

Merged-by: Michael Niedermayer <michaelni@gmx.at>
41 files changed:
1  2 
doc/faq.texi
libavcodec/ac3dec.c
libavcodec/avcodec.h
libavcodec/cabac.c
libavcodec/cabac.h
libavcodec/cavs.c
libavcodec/cavsdec.c
libavcodec/error_resilience.c
libavcodec/h264.c
libavcodec/indeo3.c
libavcodec/interplayvideo.c
libavcodec/ivi_common.c
libavcodec/libdiracenc.c
libavcodec/libschroedingerenc.c
libavcodec/libxvidff.c
libavcodec/mpeg12.c
libavcodec/mpegvideo.c
libavcodec/ppc/mpegvideo_altivec.c
libavcodec/pthread.c
libavcodec/tscc.c
libavcodec/tta.c
libavcodec/utils.c
libavcodec/vc1dec.c
libavcodec/vorbisdec.c
libavcodec/vp56.h
libavcodec/zmbv.c
libavcodec/zmbvenc.c
libavdevice/bktr.c
libavdevice/timefilter.c
libavfilter/vsrc_buffer.c
libavformat/Makefile
libavformat/aviobuf.c
libavformat/electronicarts.c
libavformat/ipmovie.c
libavformat/mtv.c
libavformat/rmdec.c
libavformat/vqf.c
tests/fate/h264.mak
tests/fate/indeo.mak
tests/fate/video.mak
tests/ref/acodec/g722

diff --cc doc/faq.texi
@@@ -373,28 -357,18 +373,40 @@@ to use them you have to append -D__STDC
  @section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
  
  You have to implement a URLProtocol, see @file{libavformat/file.c} in
 -Libav and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
 +FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
 +
 +@section Where can I find libav* headers for Pascal/Delphi?
 +
 +see @url{http://www.iversenit.dk/dev/ffmpeg-headers/}
 +
 +@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
 +
 +see @url{http://www.ffmpeg.org/~michael/}
 +
 +@section How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?
 +
 +Even if peculiar since it is network oriented, RTP is a container like any
 +other. You have to @emph{demux} RTP before feeding the payload to libavcodec.
 +In this specific case please look at RFC 4629 to see how it should be done.
 +
 +@section AVStream.r_frame_rate is wrong, it is much larger than the frame rate.
 +
 +r_frame_rate is NOT the average frame rate, it is the smallest frame rate
 +that can accurately represent all timestamps. So no, it is not
 +wrong if it is larger than the average!
 +For example, if you have mixed 25 and 30 fps content, then r_frame_rate
 +will be 150.
  
+ @section Why is @code{make fate} not running all tests?
+ Make sure you have the fate-suite samples and the @code{SAMPLES} Make variable
+ or @code{FATE_SAMPLES} environment variable or the @code{--samples}
+ @command{configure} option is set to the right path.
+ @section Why is @code{make fate} not finding the samples?
+ Do you happen to have a @code{~} character in the samples path to indicate a
+ home directory? The value is used in ways where the shell cannot expand it,
+ causing FATE to not find files. Just replace @code{~} by the full path.
  @bye
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -770,8 -769,12 +772,13 @@@ static int parse_bintree(Indeo3DecodeCo
                  /* get motion vector index and setup the pointer to the mv set */
                  if (!ctx->need_resync)
                      ctx->next_cell_data = &ctx->gb.buffer[(get_bits_count(&ctx->gb) + 7) >> 3];
 -                mv_idx = *(ctx->next_cell_data++) << 1;
 +                if(ctx->mc_vectors)
-                     curr_cell.mv_ptr = &ctx->mc_vectors[*(ctx->next_cell_data++) << 1];
++                    mv_idx = *(ctx->next_cell_data++) << 1;
+                 if (mv_idx >= ctx->num_vectors) {
+                     av_log(avctx, AV_LOG_ERROR, "motion vector index out of range\n");
+                     return AVERROR_INVALIDDATA;
+                 }
+                 curr_cell.mv_ptr = &ctx->mc_vectors[mv_idx];
                  curr_cell.tree   = 1; /* enter the VQ tree */
                  UPDATE_BITPOS(8);
              } else { /* VQ tree DATA code */
@@@ -1019,12 -1019,6 +1019,10 @@@ static av_cold int ipvideo_decode_init(
  
      dsputil_init(&s->dsp, avctx);
  
-     /* decoding map contains 4 bits of information per 8x8 block */
-     s->decoding_map_size = avctx->width * avctx->height / (8 * 8 * 2);
 +    avcodec_get_frame_defaults(&s->second_last_frame);
 +    avcodec_get_frame_defaults(&s->last_frame);
 +    avcodec_get_frame_defaults(&s->current_frame);
++
      s->current_frame.data[0] = s->last_frame.data[0] =
      s->second_last_frame.data[0] = NULL;
  
Simple merge
Simple merge
Simple merge
@@@ -232,7 -270,7 +232,7 @@@ static av_cold int xvid_encode_init(AVC
          rc2pass2.version = XVID_VERSION;
          rc2pass2.bitrate = avctx->bit_rate;
  
-         fd = av_tempfile("xvidff.", &(x->twopassfile), 0, avctx);
 -        fd = ff_tempfile("xvidff.", &x->twopassfile);
++        fd = av_tempfile("xvidff.", &x->twopassfile, 0, avctx);
          if( fd == -1 ) {
              av_log(avctx, AV_LOG_ERROR,
                  "Xvid: Cannot write 2-pass pipe\n");
Simple merge
@@@ -697,83 -696,110 +697,83 @@@ av_cold int MPV_common_init(MpegEncCont
      s->flags  = s->avctx->flags;
      s->flags2 = s->avctx->flags2;
  
 -    if (s->width && s->height) {
 -        s->mb_width   = (s->width + 15) / 16;
 -        s->mb_stride  = s->mb_width + 1;
 -        s->b8_stride  = s->mb_width * 2 + 1;
 -        s->b4_stride  = s->mb_width * 4 + 1;
 -        mb_array_size = s->mb_height * s->mb_stride;
 -        mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
 +    s->mb_width   = (s->width + 15) / 16;
 +    s->mb_stride  = s->mb_width + 1;
 +    s->b8_stride  = s->mb_width * 2 + 1;
 +    s->b4_stride  = s->mb_width * 4 + 1;
 +    mb_array_size = s->mb_height * s->mb_stride;
 +    mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
  
-     /* set chroma shifts */
-     avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
-                                                     &(s->chroma_y_shift) );
+         /* set chroma shifts */
+         avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift,
+                                       &s->chroma_y_shift);
  
 -        /* set default edge pos, will be overriden
 -         * in decode_header if needed */
 -        s->h_edge_pos = s->mb_width * 16;
 -        s->v_edge_pos = s->mb_height * 16;
 +    /* set default edge pos, will be overriden in decode_header if needed */
 +    s->h_edge_pos = s->mb_width * 16;
 +    s->v_edge_pos = s->mb_height * 16;
  
 -        s->mb_num     = s->mb_width * s->mb_height;
 +    s->mb_num = s->mb_width * s->mb_height;
  
 -        s->block_wrap[0] =
 -        s->block_wrap[1] =
 -        s->block_wrap[2] =
 -        s->block_wrap[3] = s->b8_stride;
 -        s->block_wrap[4] =
 -        s->block_wrap[5] = s->mb_stride;
 +    s->block_wrap[0] =
 +    s->block_wrap[1] =
 +    s->block_wrap[2] =
 +    s->block_wrap[3] = s->b8_stride;
 +    s->block_wrap[4] =
 +    s->block_wrap[5] = s->mb_stride;
  
 -        y_size  = s->b8_stride * (2 * s->mb_height + 1);
 -        c_size  = s->mb_stride * (s->mb_height + 1);
 -        yc_size = y_size + 2   * c_size;
 +    y_size = s->b8_stride * (2 * s->mb_height + 1);
 +    c_size = s->mb_stride * (s->mb_height + 1);
 +    yc_size = y_size + 2 * c_size;
  
 -        /* convert fourcc to upper case */
 -        s->codec_tag          = avpriv_toupper4(s->avctx->codec_tag);
 +    /* convert fourcc to upper case */
 +    s->codec_tag        = avpriv_toupper4(s->avctx->codec_tag);
 +    s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
  
 -        s->stream_codec_tag   = avpriv_toupper4(s->avctx->stream_codec_tag);
 +    s->avctx->coded_frame = (AVFrame*)&s->current_picture;
  
 -        s->avctx->coded_frame = (AVFrame *)&s->current_picture;
 +    FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
 +    for (y = 0; y < s->mb_height; y++)
 +        for (x = 0; x < s->mb_width; x++)
 +            s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
  
 -        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int),
 -                          fail); // error ressilience code looks cleaner with this
 -        for (y = 0; y < s->mb_height; y++)
 -            for (x = 0; x < s->mb_width; x++)
 -                s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
 +    s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
  
 -        s->mb_index2xy[s->mb_height * s->mb_width] =
 -                       (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
 +    if (s->encoding) {
 +        /* Allocate MV tables */
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t), fail)
 +        s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;
 +        s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;
 +        s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;
 +        s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
 +        s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
 +        s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;
 +
 +        if(s->msmpeg4_version){
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
 +        }
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
  
 -        if (s->encoding) {
 -            /* Allocate MV tables */
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            s->p_mv_table            = s->p_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_forw_mv_table       = s->b_forw_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_back_mv_table       = s->b_back_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_direct_mv_table     = s->b_direct_mv_table_base +
 -                                       s->mb_stride + 1;
 -
 -            if (s->msmpeg4_version) {
 -                FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
 -                                  2 * 2 * (MAX_LEVEL + 1) *
 -                                  (MAX_RUN + 1) * 2 * sizeof(int), fail);
 -            }
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
 -
 -            /* Allocate MB type table */
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size *
 -                              sizeof(uint16_t), fail); // needed for encoding
 -
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size *
 -                              sizeof(int), fail);
 -
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix,
 -                              64 * 32   * sizeof(int), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix,
 -                              64 * 32   * sizeof(int), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16,
 -                              64 * 32 * 2 * sizeof(uint16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16,
 -                              64 * 32 * 2 * sizeof(uint16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
 -                              MAX_PICTURE_COUNT * sizeof(Picture *), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
 -                              MAX_PICTURE_COUNT * sizeof(Picture *), fail);
 -
 -            if (s->avctx->noise_reduction) {
 -                FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
 -                                  2 * 64 * sizeof(uint16_t), fail);
 -            }
 +        /* Allocate MB type table */
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type  , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
 +
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
 +
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix         , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix  , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix         , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16       , 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16       , 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 +
 +        if(s->avctx->noise_reduction){
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
          }
      }
  
@@@ -2414,7 -2435,7 +2414,7 @@@ void MPV_decode_mb_internal(MpegEncCont
                      }else{
                          //chroma422
                          dct_linesize = uvlinesize << s->interlaced_dct;
-                         dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
 -                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize * 8;
++                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
  
                          add_dct(s, block[4], 4, dest_cb, dct_linesize);
                          add_dct(s, block[5], 5, dest_cr, dct_linesize);
                      }else{
  
                          dct_linesize = uvlinesize << s->interlaced_dct;
-                         dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
 -                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize * 8;
++                        dct_offset   = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
  
                          s->dsp.idct_put(dest_cb,              dct_linesize, block[4]);
                          s->dsp.idct_put(dest_cr,              dct_linesize, block[5]);
@@@ -267,16 -267,11 +267,16 @@@ static int dct_quantize_altivec(MpegEnc
              baseVector = vec_cts(vec_splat(row0, 0), 0);
              vec_ste(baseVector, 0, &oldBaseValue);
  
 -            qmat = (vector signed int*)s->q_intra_matrix[qscale];
 -            biasAddr = &s->intra_quant_bias;
 +            if(n<4){
 +                qmat = (vector signed int*)s->q_intra_matrix[qscale];
-                 biasAddr = &(s->intra_quant_bias);
++                biasAddr = &s->intra_quant_bias;
 +            }else{
 +                qmat = (vector signed int*)s->q_chroma_intra_matrix[qscale];
-                 biasAddr = &(s->intra_quant_bias);
++                biasAddr = &s->intra_quant_bias;
 +            }
          } else {
              qmat = (vector signed int*)s->q_inter_matrix[qscale];
-             biasAddr = &(s->inter_quant_bias);
+             biasAddr = &s->inter_quant_bias;
          }
  
          // Load the bias vector (We add 0.5 to the bias so that we're
Simple merge
@@@ -142,9 -142,8 +142,9 @@@ static av_cold int decode_init(AVCodecC
  
      c->height = avctx->height;
  
 +    avcodec_get_frame_defaults(&c->pic);
      // Needed if zlib unused or init aborted before inflateInit
-     memset(&(c->zstream), 0, sizeof(z_stream));
+     memset(&c->zstream, 0, sizeof(z_stream));
      switch(avctx->bits_per_coded_sample){
      case  8: avctx->pix_fmt = PIX_FMT_PAL8; break;
      case 16: avctx->pix_fmt = PIX_FMT_RGB555; break;
@@@ -411,32 -403,19 +415,32 @@@ static int tta_decode_frame(AVCodecCont
          return -1;
      skip_bits(&s->gb, 32); // frame crc
  
 -    // convert to output buffer
 -    if (s->bps == 2) {
 -        int16_t *samples = (int16_t *)s->frame.data[0];
 -        for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
 -            *samples++ = *p;
 -    } else {
 -        // shift samples for 24-bit sample format
 -        int32_t *samples = (int32_t *)s->frame.data[0];
 -        for (i = 0; i < framelen * s->channels; i++)
 -            *samples++ <<= 8;
 -        // reset decode buffer
 -        s->decode_buffer = NULL;
 -    }
 +        // convert to output buffer
 +        switch(s->bps) {
 +            case 1: {
 +                uint8_t *samples = (uint8_t *)s->frame.data[0];
 +                for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
 +                    *samples++ = *p + 0x80;
 +                break;
 +            }
 +            case 2: {
 +                uint16_t *samples = (int16_t *)s->frame.data[0];
 +                for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
 +                    *samples++ = *p;
 +                break;
 +            }
 +            case 3: {
 +                // shift samples for 24-bit sample format
 +                int32_t *samples = (int32_t *)s->frame.data[0];
 +                for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
-                     *samples++ = *p<<8;
++                    *samples++ <<= 8;
 +                // reset decode buffer
 +                s->decode_buffer = NULL;
 +                break;
 +            }
 +            default:
 +                av_log(s->avctx, AV_LOG_ERROR, "Error, only 16bit samples supported!\n");
 +        }
  
      *got_frame_ptr   = 1;
      *(AVFrame *)data = s->frame;
@@@ -903,38 -842,48 +903,80 @@@ int avcodec_encode_subtitle(AVCodecCont
      return ret;
  }
  
 +/**
 + * Attempt to guess proper monotonic timestamps for decoded video frames
 + * which might have incorrect times. Input timestamps may wrap around, in
 + * which case the output will as well.
 + *
 + * @param pts the pts field of the decoded AVPacket, as passed through
 + * AVFrame.pkt_pts
 + * @param dts the dts field of the decoded AVPacket
 + * @return one of the input values, may be AV_NOPTS_VALUE
 + */
 +static int64_t guess_correct_pts(AVCodecContext *ctx,
 +                                 int64_t reordered_pts, int64_t dts)
 +{
 +    int64_t pts = AV_NOPTS_VALUE;
 +
 +    if (dts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_dts += dts <= ctx->pts_correction_last_dts;
 +        ctx->pts_correction_last_dts = dts;
 +    }
 +    if (reordered_pts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_pts += reordered_pts <= ctx->pts_correction_last_pts;
 +        ctx->pts_correction_last_pts = reordered_pts;
 +    }
 +    if ((ctx->pts_correction_num_faulty_pts<=ctx->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
 +       && reordered_pts != AV_NOPTS_VALUE)
 +        pts = reordered_pts;
 +    else
 +        pts = dts;
 +
 +    return pts;
 +}
 +
+ static void apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
+ {
+     int size = 0;
+     const uint8_t *data;
+     uint32_t flags;
+     if (!(avctx->codec->capabilities & CODEC_CAP_PARAM_CHANGE))
+         return;
+     data = av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, &size);
+     if (!data || size < 4)
+         return;
+     flags = bytestream_get_le32(&data);
+     size -= 4;
+     if (size < 4) /* Required for any of the changes */
+         return;
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
+         avctx->channels = bytestream_get_le32(&data);
+         size -= 4;
+     }
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
+         if (size < 8)
+             return;
+         avctx->channel_layout = bytestream_get_le64(&data);
+         size -= 8;
+     }
+     if (size < 4)
+         return;
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
+         avctx->sample_rate = bytestream_get_le32(&data);
+         size -= 4;
+     }
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) {
+         if (size < 8)
+             return;
+         avctx->width  = bytestream_get_le32(&data);
+         avctx->height = bytestream_get_le32(&data);
+         avcodec_set_dimensions(avctx, avctx->width, avctx->height);
+         size -= 8;
+     }
+ }
  int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                           int *got_picture_ptr,
                           AVPacket *avpkt)
      if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
          return -1;
  
 -    avctx->pkt = avpkt;
 -    apply_param_change(avctx, avpkt);
 -
      if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type&FF_THREAD_FRAME)){
 +        av_packet_split_side_data(avpkt);
++        apply_param_change(avctx, avpkt);
 +        avctx->pkt = avpkt;
          if (HAVE_THREADS && avctx->active_thread_type&FF_THREAD_FRAME)
               ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
                                            avpkt);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -217,7 -147,7 +217,7 @@@ static int request_frame(AVFilterLink *
  static int poll_frame(AVFilterLink *link)
  {
      BufferSourceContext *c = link->src->priv;
-     return !!(c->picref);
 -    return !!c->buf;
++    return !!c->picref;
  }
  
  AVFilter avfilter_vsrc_buffer = {
@@@ -371,6 -349,10 +371,6 @@@ OBJS-$(CONFIG_TCP_PROTOCOL
  OBJS-$(CONFIG_TLS_PROTOCOL)              += tls.o
  OBJS-$(CONFIG_UDP_PROTOCOL)              += udp.o
  
+ SKIPHEADERS-$(CONFIG_NETWORK)            += network.h rtsp.h
 -
 -EXAMPLES  = metadata output
  TESTPROGS = seek
  TOOLS     = pktdumper probetest
 -
 -$(SUBDIR)output-example$(EXESUF): ELIBS = -lswscale
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1,11 -1,11 +1,14 @@@
 -FATE_TESTS += fate-indeo2
 +FATE_INDEO += fate-indeo2
  fate-indeo2: CMD = framecrc -i $(SAMPLES)/rt21/VPAR0026.AVI
  
 -FATE_TESTS += fate-indeo3
 +FATE_INDEO += fate-indeo3
  fate-indeo3: CMD = framecrc -i $(SAMPLES)/iv32/cubes.mov
  
 -FATE_TESTS += fate-indeo4
++FATE_INDEO += fate-indeo4
+ fate-indeo4: CMD = framecrc -i $(SAMPLES)/iv41/indeo41-partial.avi -an
 -FATE_TESTS += fate-indeo5
 +FATE_INDEO += fate-indeo5
  fate-indeo5: CMD = framecrc -i $(SAMPLES)/iv50/Educ_Movie_DeadlyForce.avi -an
 +
 +FATE_TESTS += $(FATE_INDEO)
 +fate-indeo: $(FATE_INDEO)
@@@ -185,5 -185,5 +185,5 @@@ fate-wnv1: CMD = framecrc -i $(SAMPLES)
  FATE_TESTS += fate-yop
  fate-yop: CMD = framecrc -i $(SAMPLES)/yop/test1.yop -pix_fmt rgb24 -an
  
--FATE_TESTS += fate-xxan-wc4
- fate-xxan-wc4: CMD = framecrc -i $(SAMPLES)/wc4-xan/wc4_2.avi -an -vframes 10
 -fate-xxan-wc4: CMD = framecrc -i $(SAMPLES)/wc4-xan/wc4trailer-partial.avi -an
++#FATE_TESTS += fate-xxan-wc4
++#fate-xxan-wc4: CMD = framecrc -i $(SAMPLES)/wc4-xan/wc4trailer-partial.avi -an
@@@ -1,4 -1,4 +1,4 @@@
- 156f63e3391b95020ae882dbae6eccf3 *./tests/data/acodec/g722.wav
- 47991 ./tests/data/acodec/g722.wav
- 8f65de513acc08b37a488d6a802b4f00 *./tests/data/g722.acodec.out.wav
- stddev: 8860.50 PSNR: 17.38 MAXDIFF:33814 bytes:   191732/  1058400
 -1975cc4a3521e374b33ae042e182f6b6 *./tests/data/acodec/g722.wav
++b813a52d4efe6cf7974190ea9c4c7e8c *./tests/data/acodec/g722.wav
+ 48053 ./tests/data/acodec/g722.wav
 -ade04cdcf249e6946395f109b077dd62 *./tests/data/g722.acodec.out.wav
 -stddev: 8841.24 PSNR: 17.40 MAXDIFF:36225 bytes:   191980/  1058400
++d8344d14a11eef0418b856af70694cbe *./tests/data/g722.acodec.out.wav
++stddev: 8841.18 PSNR: 17.40 MAXDIFF:36225 bytes:   191980/  1058400