Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 20 Oct 2011 23:27:28 +0000 (01:27 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 21 Oct 2011 00:01:26 +0000 (02:01 +0200)
* qatar/master: (47 commits)
  lavc: hide private symbols.
  lavc: deprecate img_get_alpha_info().
  lavc: use avpriv_ prefix for ff_toupper4.
  lavc: use avpriv_ prefix for ff_copy_bits and align_put_bits.
  lavc: use avpriv_ prefix for ff_ac3_parse_header.
  lavc: use avpriv_ prefix for ff_frame_rate_tab.
  lavc: rename ff_find_start_code to avpriv_mpv_find_start_code
  lavc: use avpriv_ prefix for ff_split_xiph_headers.
  lavc: use avpriv_ prefix for ff_dirac_parse_sequence_header.
  lavc: use avpriv_ prefix for some dv symbols used in lavf.
  lavc: use avpriv_ prefix for some flac symbols used in lavf.
  lavc: use avpriv_ prefix for some mpeg4audio symbols used in lavf.
  lavc: use avpriv_ prefix for some mpegaudio symbols used in lavf.
  lavc: use avpriv_ prefix for ff_aac_parse_header().
  lavf: hide private symbols.
  lavf: use avpriv_ prefix for some dv functions.
  lavf: use avpriv_ prefix for ff_new_chapter().
  avcodec: add CODEC_CAP_DELAY note to avcodec_decode_audio3() documentation
  avcodec: clarify the CODEC_CAP_DELAY note in avcodec_decode_video2()
  avcodec: clarify documentation of CODEC_CAP_DELAY
  ...

Conflicts:
configure
doc/general.texi
libavcodec/Makefile
libavcodec/aacdec.c
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/dv.c
libavcodec/dvdata.c
libavcodec/dvdata.h
libavcodec/libspeexenc.c
libavcodec/mpegvideo.c
libavcodec/version.h
libavformat/avidec.c
libavformat/dv.c
libavformat/dv.h
libavformat/flvenc.c
libavformat/mov.c
libavformat/mp3enc.c
libavformat/oggparsespeex.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
108 files changed:
1  2 
Changelog
configure
libavcodec/Makefile
libavcodec/aac_adtstoasc_bsf.c
libavcodec/aac_parser.c
libavcodec/aacadtsdec.c
libavcodec/aacadtsdec.h
libavcodec/aacdec.c
libavcodec/aacenc.c
libavcodec/ac3_parser.c
libavcodec/ac3_parser.h
libavcodec/ac3dec.c
libavcodec/alsdec.c
libavcodec/asv1.c
libavcodec/avcodec.h
libavcodec/bitstream.c
libavcodec/cavsdec.c
libavcodec/cljr.c
libavcodec/dirac.c
libavcodec/dirac.h
libavcodec/dv.c
libavcodec/dvdata.c
libavcodec/dvdata.h
libavcodec/flac.h
libavcodec/flacdec.c
libavcodec/flvenc.c
libavcodec/h261enc.c
libavcodec/h264_parser.c
libavcodec/imgconvert.c
libavcodec/internal.h
libavcodec/ituh263enc.c
libavcodec/jpeglsenc.c
libavcodec/libspeexenc.c
libavcodec/libvo-aacenc.c
libavcodec/mp3_header_decompress_bsf.c
libavcodec/mpeg12.c
libavcodec/mpeg12data.c
libavcodec/mpeg12data.h
libavcodec/mpeg12enc.c
libavcodec/mpeg4audio.c
libavcodec/mpeg4audio.h
libavcodec/mpeg4videoenc.c
libavcodec/mpegaudio_parser.c
libavcodec/mpegaudiodata.c
libavcodec/mpegaudiodata.h
libavcodec/mpegaudiodec.c
libavcodec/mpegaudiodecheader.c
libavcodec/mpegaudiodecheader.h
libavcodec/mpegaudioenc.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h
libavcodec/mpegvideo_enc.c
libavcodec/mpegvideo_parser.c
libavcodec/msmpeg4.c
libavcodec/put_bits.h
libavcodec/rv10enc.c
libavcodec/shorten.c
libavcodec/svq1enc.c
libavcodec/utils.c
libavcodec/vcr1.c
libavcodec/version.h
libavcodec/vorbisdec.c
libavcodec/vp3.c
libavcodec/wmaenc.c
libavcodec/wmaprodec.c
libavcodec/wmavoice.c
libavcodec/x86/ac3dsp_mmx.c
libavcodec/x86/h264_intrapred_init.c
libavcodec/x86/proresdsp-init.c
libavcodec/x86/vp8dsp-init.c
libavcodec/xiph.c
libavcodec/xiph.h
libavcodec/xsubenc.c
libavdevice/dv1394.c
libavdevice/libcdio.c
libavformat/ac3dec.c
libavformat/adtsenc.c
libavformat/asfdec.c
libavformat/avidec.c
libavformat/dv.c
libavformat/dv.h
libavformat/dvenc.c
libavformat/ffmetadec.c
libavformat/flacdec.c
libavformat/flacenc.c
libavformat/flacenc_header.c
libavformat/flvdec.c
libavformat/flvenc.c
libavformat/gxf.c
libavformat/internal.h
libavformat/isom.c
libavformat/latmenc.c
libavformat/matroskadec.c
libavformat/matroskaenc.c
libavformat/mov.c
libavformat/mp3dec.c
libavformat/mp3enc.c
libavformat/mpegtsenc.c
libavformat/nutdec.c
libavformat/nutenc.c
libavformat/oggenc.c
libavformat/oggparsedirac.c
libavformat/oggparseflac.c
libavformat/rtpenc_mpv.c
libavformat/sdp.c
libavformat/spdifdec.c
libavformat/spdifenc.c
libavformat/utils.c

diff --cc Changelog
+++ b/Changelog
@@@ -43,35 -41,47 +43,36 @@@ easier to use. The changes are
        '-preset <presetname>'.
      * -intra option was removed, it's equivalent to -g 0.
  - XMV demuxer
 +- LOAS demuxer
 +- ashowinfo filter added
  - Windows Media Image decoder
 +- amovie source added
  - LATM muxer/demuxer
 -- showinfo filter
 -- split filter
 +- Speex encoder via libspeex
 +- JSON output in ffprobe
 +- WTV muxer
 +- Optional C++ Support (needed for libstagefright)
 +- H.264 Decoding on Android via Stagefright
 +- Prores decoder
 +- BIN/XBIN/ADF/IDF text file decoder
 +- aconvert audio filter added
 +- audio support to lavfi input device added
  - libcdio-paranoia input device for audio CD grabbing
 -- select filter
  - Apple ProRes decoder
  - CELT in Ogg demuxing
 +- G.723.1 demuxer and decoder
 +- libmodplug support (--enable-libmodplug)
  - VC-1 interlaced decoding
 -- lut, lutrgb, and lutyuv filters
 -- boxblur filter
 +- libutvideo wrapper (--enable-libutvideo)
 +- aevalsrc audio source added
  - Ut Video decoder
+ - Speex encoding via libspeex
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 +version 0.8:
  
  
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 -
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
diff --cc configure
+++ b/configure
@@@ -182,10 -178,8 +182,10 @@@ External library support
    --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac support via libschroedinger [no]
-   --enable-libspeex        enable Speex encoding and decoding via libspeex [no]
+   --enable-libspeex        enable Speex support via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libutvideo      enable Ut Video decoding via libutvideo [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
    --enable-libvorbis       enable Vorbis encoding via libvorbis,
@@@ -702,8 -671,11 +702,9 @@@ SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  
  SKIPHEADERS-$(CONFIG_VAAPI)            += vaapi_internal.h
  SKIPHEADERS-$(CONFIG_VDPAU)            += vdpau.h
  SKIPHEADERS-$(CONFIG_XVMC)             += xvmc.h
+ SKIPHEADERS-$(HAVE_W32THREADS)         += w32pthreads.h
  
 -EXAMPLES = api
 -
 -TESTPROGS = cabac dct fft fft-fixed h264 iirfilter rangecoder
 +TESTPROGS = cabac dct fft fft-fixed h264 iirfilter rangecoder snow
  TESTPROGS-$(HAVE_MMX) += motion
  TESTOBJS = dctref.o
  
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -472,7 -470,7 +472,7 @@@ static int decode_audio_specific_config
  
      init_get_bits(&gb, data, data_size * 8);
  
-     if ((i = ff_mpeg4audio_get_config(m4ac, data, asclen/8)) < 0)
 -    if ((i = avpriv_mpeg4audio_get_config(m4ac, data, data_size)) < 0)
++    if ((i = avpriv_mpeg4audio_get_config(m4ac, data, asclen/8)) < 0)
          return -1;
      if (m4ac->sampling_index > 12) {
          av_log(avctx, AV_LOG_ERROR, "invalid sampling rate index %d\n", m4ac->sampling_index);
@@@ -2077,9 -2075,9 +2077,9 @@@ static int parse_adts_frame_header(AACC
      int size;
      AACADTSHeaderInfo hdr_info;
  
-     size = ff_aac_parse_header(gb, &hdr_info);
+     size = avpriv_aac_parse_header(gb, &hdr_info);
      if (size > 0) {
 -        if (ac->output_configured != OC_LOCKED && hdr_info.chan_config) {
 +        if (hdr_info.chan_config) {
              enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
              memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
              ac->m4ac.chan_config = hdr_info.chan_config;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -210,10 -210,11 +210,12 @@@ enum CodecID 
      CODEC_ID_DFA,
      CODEC_ID_WMV3IMAGE,
      CODEC_ID_VC1IMAGE,
 -    CODEC_ID_G723_1,
 -    CODEC_ID_G729,
+ #if LIBAVCODEC_VERSION_MAJOR == 53
 -    CODEC_ID_UTVIDEO,
 +    CODEC_ID_8SVX_RAW,
 +    CODEC_ID_G2M,
+ #endif
 +    CODEC_ID_UTVIDEO_DEPRECATED,
 +    CODEC_ID_UTVIDEO = 0x800,
  
      /* various PCM "codecs" */
      CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
@@@ -3575,39 -3500,7 +3579,40 @@@ int avcodec_get_pix_fmt_loss(enum Pixel
  enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
                                int has_alpha, int *loss_ptr);
  
 +/**
 + * Find the best pixel format to convert to given a certain source pixel
 + * format and a selection of two destination pixel formats. When converting from
 + * one pixel format to another, information loss may occur.  For example, when converting
 + * from RGB24 to GRAY, the color information will be lost. Similarly, other losses occur when
 + * converting from some formats to other formats. avcodec_find_best_pix_fmt2() selects which of
 + * the given pixel formats should be used to suffer the least amount of loss.
 + *
 + * If one of the destination formats is PIX_FMT_NONE the other pixel format (if valid) will be
 + * returned.
 + *
 + * @code
 + * src_pix_fmt = PIX_FMT_YUV420P;
 + * dst_pix_fmt1= PIX_FMT_RGB24;
 + * dst_pix_fmt2= PIX_FMT_GRAY8;
 + * dst_pix_fmt3= PIX_FMT_RGB8;
 + * loss= FF_LOSS_CHROMA; // don't care about chroma loss, so chroma loss will be ignored.
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, alpha, &loss);
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt, dst_pix_fmt3, src_pix_fmt, alpha, &loss);
 + * @endcode
 + *
 + * @param[in] dst_pix_fmt1 One of the two destination pixel formats to choose from
 + * @param[in] dst_pix_fmt2 The other of the two destination pixel formats to choose from
 + * @param[in] src_pix_fmt Source pixel format
 + * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 + * @param[in, out] loss_ptr Combination of loss flags. In: selects which of the losses to ignore, i.e.
 + *                               NULL or value of zero means we care about all losses. Out: the loss
 + *                               that occurs when converting from src to selected dst pixel format.
 + * @return The best pixel format to convert to or -1 if none was found.
 + */
 +enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat dst_pix_fmt1, enum PixelFormat dst_pix_fmt2,
 +                                            enum PixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
 +
+ #if FF_API_GET_ALPHA_INFO
  #define FF_ALPHA_TRANSP       0x0001 /* image has some totally transparent pixels */
  #define FF_ALPHA_SEMI_TRANSP  0x0002 /* image has some transparent pixels */
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc libavcodec/dv.c
@@@ -1072,7 -1072,7 +1072,7 @@@ static int dvvideo_decode_frame(AVCodec
      const uint8_t* vsc_pack;
      int apt, is16_9;
  
-     s->sys = ff_dv_frame_profile2(avctx, s->sys, buf, buf_size);
 -    s->sys = avpriv_dv_frame_profile(s->sys, buf, buf_size);
++    s->sys = avpriv_dv_frame_profile2(avctx, s->sys, buf, buf_size);
      if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) {
          av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n");
          return -1; /* NOTE: we only accept several full frames */
@@@ -246,16 -245,14 +246,16 @@@ static const DVprofile dv_profiles[] = 
      }
  };
  
- const DVprofile* ff_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys,
 -const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
++const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys,
                                    const uint8_t* frame, unsigned buf_size)
  {
 -   int i;
 +   int i, dsf, stype;
  
 -   int dsf = (frame[3] & 0x80) >> 7;
 +   if(buf_size < DV_PROFILE_BYTES)
 +       return NULL;
  
 -   int stype = frame[80*5 + 48 + 3] & 0x1f;
 +   dsf = (frame[3] & 0x80) >> 7;
 +   stype = frame[80*5 + 48 + 3] & 0x1f;
  
     /* 576i50 25Mbps 4:1:1 is a special case */
     if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) {
     return NULL;
  }
  
- const DVprofile* ff_dv_frame_profile(const DVprofile *sys,
++const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
 +                                  const uint8_t* frame, unsigned buf_size)
 +{
-     return ff_dv_frame_profile2(NULL, sys, frame, buf_size);
++    return avpriv_dv_frame_profile2(NULL, sys, frame, buf_size);
 +}
 +
- const DVprofile* ff_dv_codec_profile(AVCodecContext* codec)
+ const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec)
  {
      int i;
  
@@@ -274,11 -274,9 +274,11 @@@ enum dv_pack_type 
   */
  #define DV_MAX_BPM 8
  
- const DVprofile* ff_dv_frame_profile(const DVprofile *sys,
+ const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
 -                                         const uint8_t* frame, unsigned buf_size);
 +                                  const uint8_t* frame, unsigned buf_size);
- const DVprofile* ff_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys,
++const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys,
 +                                  const uint8_t* frame, unsigned buf_size);
- const DVprofile* ff_dv_codec_profile(AVCodecContext* codec);
+ const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec);
  
  static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
                                    uint8_t seq_num, uint8_t dif_num,
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -53,11 -53,6 +53,11 @@@ AVHWAccel *ff_find_hwaccel(enum CodecI
   */
  int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
  
- unsigned int ff_toupper4(unsigned int x);
+ unsigned int avpriv_toupper4(unsigned int x);
  
 +/**
 + * does needed setup of pkt_pts/pos and such for (re)get_buffer();
 + */
 +void ff_init_buffer_info(AVCodecContext *s, AVFrame *pic);
 +
  #endif /* AVCODEC_INTERNAL_H */
Simple merge
Simple merge
@@@ -1,8 -1,10 +1,10 @@@
  /*
-  * Copyright (c) 2009 by Xuggle Incorporated.  All rights reserved.
+  * Copyright (C) 2009 Justin Ruggles
+  * Copyright (c) 2009 Xuggle Incorporated
+  *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   * 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 <libavcodec/avcodec.h>
+ /**
+  * @file
+  * libspeex Speex audio encoder
+  *
+  * Usage Guide
+  * This explains the values that need to be set prior to initialization in
+  * order to control various encoding parameters.
+  *
+  * Channels
+  *     Speex only supports mono or stereo, so avctx->channels must be set to
+  *     1 or 2.
+  *
+  * Sample Rate / Encoding Mode
+  *     Speex has 3 modes, each of which uses a specific sample rate.
+  *         narrowband     :  8 kHz
+  *         wideband       : 16 kHz
+  *         ultra-wideband : 32 kHz
+  *     avctx->sample_rate must be set to one of these 3 values.  This will be
+  *     used to set the encoding mode.
+  *
+  * Rate Control
+  *     VBR mode is turned on by setting CODEC_FLAG_QSCALE in avctx->flags.
+  *     avctx->global_quality is used to set the encoding quality.
+  *     For CBR mode, avctx->bit_rate can be used to set the constant bitrate.
+  *     Alternatively, the 'cbr_quality' option can be set from 0 to 10 to set
+  *     a constant bitrate based on quality.
+  *     For ABR mode, set avctx->bit_rate and set the 'abr' option to 1.
+  *     Approx. Bitrate Range:
+  *         narrowband     : 2400 - 25600 bps
+  *         wideband       : 4000 - 43200 bps
+  *         ultra-wideband : 4400 - 45200 bps
+  *
+  * Complexity
+  *     Encoding complexity is controlled by setting avctx->compression_level.
+  *     The valid range is 0 to 10.  A higher setting gives generally better
+  *     quality at the expense of encoding speed.  This does not affect the
+  *     bit rate.
+  *
+  * Frames-per-Packet
+  *     The encoder defaults to using 1 frame-per-packet.  However, it is
+  *     sometimes desirable to use multiple frames-per-packet to reduce the
+  *     amount of container overhead.  This can be done by setting the
+  *     'frames_per_packet' option to a value 1 to 8.
+  */
  #include <speex/speex.h>
  #include <speex/speex_header.h>
  #include <speex/speex_stereo.h>
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -64,10 -64,9 +64,10 @@@ static int mpegaudio_parse(AVCodecParse
  
                  state= (state<<8) + buf[i++];
  
-                 ret = ff_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate);
+                 ret = avpriv_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate);
                  if (ret < 4) {
 -                    s->header_count= -2;
 +                    if(i > 4)
 +                        s->header_count= -2;
                  } else {
                      if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
                          s->header_count= -3;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -616,85 -616,85 +616,84 @@@ 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 = ff_toupper4(s->avctx->codec_tag);
-     s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag);
++    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
 +        /* 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->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)
 +        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)
 -            }
 +        if(s->avctx->noise_reduction){
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
          }
      }
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -21,7 -21,7 +21,7 @@@
  #define AVCODEC_VERSION_H
  
  #define LIBAVCODEC_VERSION_MAJOR 53
- #define LIBAVCODEC_VERSION_MINOR 22
 -#define LIBAVCODEC_VERSION_MINOR  14
++#define LIBAVCODEC_VERSION_MINOR 23
  #define LIBAVCODEC_VERSION_MICRO  0
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -167,11 -167,11 +167,11 @@@ void ff_pred4x4_tm_vp8_mmxext      (uin
  void ff_pred4x4_tm_vp8_ssse3       (uint8_t *src, const uint8_t *topright, int stride);
  void ff_pred4x4_vertical_vp8_mmxext(uint8_t *src, const uint8_t *topright, int stride);
  
 -void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth)
 +void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth, const int chroma_format_idc)
  {
+ #if HAVE_YASM
      int mm_flags = av_get_cpu_flags();
  
- #if HAVE_YASM
      if (bit_depth == 8) {
          if (mm_flags & AV_CPU_FLAG_MMX) {
              h->pred16x16[VERT_PRED8x8         ] = ff_pred16x16_vertical_mmx;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -186,9 -186,9 +186,9 @@@ restart_poll
      av_dlog(context, "index %d, avail %d, done %d\n", dv->index, dv->avail,
              dv->done);
  
-     size = dv_produce_packet(dv->dv_demux, pkt,
+     size = avpriv_dv_produce_packet(dv->dv_demux, pkt,
                               dv->ring + (dv->index * DV1394_PAL_FRAME_SIZE),
 -                             DV1394_PAL_FRAME_SIZE);
 +                             DV1394_PAL_FRAME_SIZE, -1);
      dv->index = (dv->index + 1) % DV1394_RING_FRAMES;
      dv->done++; dv->avail--;
  
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1115,8 -1079,8 +1115,8 @@@ resync
  
          if (CONFIG_DV_DEMUXER && avi->dv_demux) {
              dstr = pkt->destruct;
-             size = dv_produce_packet(avi->dv_demux, pkt,
+             size = avpriv_dv_produce_packet(avi->dv_demux, pkt,
 -                                    pkt->data, pkt->size);
 +                                    pkt->data, pkt->size, pkt->pos);
              pkt->destruct = dstr;
              pkt->flags |= AV_PKT_FLAG_KEY;
              if (size < 0)
@@@ -316,8 -316,8 +316,8 @@@ int avpriv_dv_get_packet(DVDemuxContex
      return size;
  }
  
- int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
+ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
 -                      uint8_t* buf, int buf_size)
 +                      uint8_t* buf, int buf_size, int64_t pos)
  {
      int size, i;
      uint8_t *ppcm[4] = {0};
@@@ -452,17 -450,16 +452,17 @@@ static int dv_read_packet(AVFormatConte
      int size;
      RawDVContext *c = s->priv_data;
  
-     size = dv_get_packet(c->dv_demux, pkt);
+     size = avpriv_dv_get_packet(c->dv_demux, pkt);
  
      if (size < 0) {
 +        int64_t pos = avio_tell(s->pb);
          if (!c->dv_demux->sys)
              return AVERROR(EIO);
          size = c->dv_demux->sys->frame_size;
          if (avio_read(s->pb, c->buf, size) <= 0)
              return AVERROR(EIO);
  
-         size = dv_produce_packet(c->dv_demux, pkt, c->buf, size, pos);
 -        size = avpriv_dv_produce_packet(c->dv_demux, pkt, c->buf, size);
++        size = avpriv_dv_produce_packet(c->dv_demux, pkt, c->buf, size, pos);
      }
  
      return size;
@@@ -31,9 -31,9 +31,9 @@@
  #include "avformat.h"
  
  typedef struct DVDemuxContext DVDemuxContext;
- DVDemuxContext* dv_init_demux(AVFormatContext* s);
- int dv_get_packet(DVDemuxContext*, AVPacket *);
- int dv_produce_packet(DVDemuxContext*, AVPacket*, uint8_t*, int, int64_t);
+ DVDemuxContext* avpriv_dv_init_demux(AVFormatContext* s);
+ int avpriv_dv_get_packet(DVDemuxContext*, AVPacket *);
 -int avpriv_dv_produce_packet(DVDemuxContext*, AVPacket*, uint8_t*, int);
++int avpriv_dv_produce_packet(DVDemuxContext*, AVPacket*, uint8_t*, int, int64_t);
  void dv_offset_reset(DVDemuxContext *c, int64_t frame_offset);
  
  typedef struct DVMuxContext DVMuxContext;
Simple merge
Simple merge
@@@ -46,9 -46,9 +46,9 @@@ static int flac_read_header(AVFormatCon
      }
  
      /* process metadata blocks */
 -    while (!s->pb->eof_reached && !metadata_last) {
 +    while (!url_feof(s->pb) && !metadata_last) {
          avio_read(s->pb, header, 4);
-         ff_flac_parse_block_header(header, &metadata_last, &metadata_type,
+         avpriv_flac_parse_block_header(header, &metadata_last, &metadata_type,
                                     &metadata_size);
          switch (metadata_type) {
          /* allocate and read metadata block for supported types */
Simple merge
Simple merge
Simple merge
@@@ -367,8 -343,8 +362,8 @@@ static int flv_write_trailer(AVFormatCo
      for (i = 0; i < s->nb_streams; i++) {
          AVCodecContext *enc = s->streams[i]->codec;
          if (enc->codec_type == AVMEDIA_TYPE_VIDEO &&
 -                enc->codec_id == CODEC_ID_H264) {
 +                (enc->codec_id == CODEC_ID_H264 || enc->codec_id == CODEC_ID_MPEG4)) {
-             put_avc_eos_tag(pb, flv->last_video_ts);
+             put_avc_eos_tag(pb, flv->last_ts);
          }
      }
  
@@@ -434,19 -405,22 +429,26 @@@ static int flv_write_packet(AVFormatCon
              if (ff_avc_parse_nal_units_buf(pkt->data, &data, &size) < 0)
                  return -1;
          }
-         if (!flv->delay && pkt->dts < 0)
-             flv->delay = -pkt->dts;
 +    } else if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 &&
 +               (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
 +        av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n");
 +        return -1;
      }
+     if (!flv->delay && pkt->dts < 0)
+         flv->delay = -pkt->dts;
  
      ts = pkt->dts + flv->delay; // add delay to force positive dts
-     if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
-         if (flv->last_video_ts < ts)
-             flv->last_video_ts = ts;
+     /* check Speex packet duration */
+     if (enc->codec_id == CODEC_ID_SPEEX && ts - flv->last_ts > 160) {
+         av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than "
+                                   "8 frames per packet. Adobe Flash "
+                                   "Player cannot handle this!\n");
      }
+     if (flv->last_ts < ts)
+         flv->last_ts = ts;
      avio_wb24(pb,size + flags_size);
      avio_wb24(pb,ts);
      avio_w8(pb,(ts >> 24) & 0x7F); // timestamps are 32bits _signed_
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -2592,10 -2528,10 +2592,10 @@@ static int mov_read_packet(AVFormatCont
          }
  #if CONFIG_DV_DEMUXER
          if (mov->dv_demux && sc->dv_audio_container) {
-             dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size, pkt->pos);
 -            avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size);
++            avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size, pkt->pos);
              av_free(pkt->data);
              pkt->size = 0;
-             ret = dv_get_packet(mov->dv_demux, pkt);
+             ret = avpriv_dv_get_packet(mov->dv_demux, pkt);
              if (ret < 0)
                  return ret;
          }
Simple merge
@@@ -219,30 -206,25 +219,30 @@@ static int id3v2_check_write_tag(AVForm
      return -1;
  }
  
 -/* insert a dummy frame containing number of frames */
 -static void mp3_write_xing(AVFormatContext *s)
 +static const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}};
 +
 +/*
 + * Write an empty XING header and initialize respective data.
 + */
 +static int mp3_write_xing(AVFormatContext *s)
  {
 -    AVCodecContext *codec = s->streams[0]->codec;
 +    AVCodecContext   *codec = s->streams[0]->codec;
      MP3Context       *mp3 = s->priv_data;
 -    int       bitrate_idx = 1;    // 32 kbps
 -    int64_t   xing_offset = (codec->channels == 2) ? 32 : 17;
 -    int32_t        header;
 -    MPADecodeHeader  mpah;
 -    int srate_idx, i, channels;
 +    int              bitrate_idx = 3;
 +    int64_t          xing_offset;
 +    int32_t          mask, header;
 +    MPADecodeHeader  c;
 +    int              srate_idx, i, channels;
 +    int              needed;
  
-     for (i = 0; i < FF_ARRAY_ELEMS(ff_mpa_freq_tab); i++)
-         if (ff_mpa_freq_tab[i] == codec->sample_rate) {
+     for (i = 0; i < FF_ARRAY_ELEMS(avpriv_mpa_freq_tab); i++)
+         if (avpriv_mpa_freq_tab[i] == codec->sample_rate) {
              srate_idx = i;
              break;
          }
-     if (i == FF_ARRAY_ELEMS(ff_mpa_freq_tab)) {
+     if (i == FF_ARRAY_ELEMS(avpriv_mpa_freq_tab)) {
          av_log(s, AV_LOG_ERROR, "Unsupported sample rate.\n");
 -        return;
 +        return -1;
      }
  
      switch (codec->channels) {
      /* dummy MPEG audio header */
      header  =  0xff                                  << 24; // sync
      header |= (0x7 << 5 | 0x3 << 3 | 0x1 << 1 | 0x1) << 16; // sync/mpeg-1/layer 3/no crc*/
 -    header |= (bitrate_idx << 4 | srate_idx << 2)    <<  8;
 +    header |= (srate_idx << 2) <<  8;
      header |= channels << 6;
 -    avio_wb32(s->pb, header);
  
 -    avpriv_mpegaudio_decode_header(&mpah, header);
 +    for (;;) {
 +        if (15 == bitrate_idx)
 +            return -1;
 +
 +        mask = (bitrate_idx << 4) <<  8;
 +        header |= mask;
-         ff_mpegaudio_decode_header(&c, header);
++        avpriv_mpegaudio_decode_header(&c, header);
 +        xing_offset=xing_offtbl[c.lsf == 1][c.nb_channels == 1];
 +        needed = 4              // header
 +               + xing_offset
 +               + 4              // xing tag
 +               + 4              // frames/size/toc flags
 +               + 4              // frames
 +               + 4              // size
 +               + VBR_TOC_SIZE;  // toc
 +
 +        if (needed <= c.frame_size)
 +            break;
  
 +        header &= ~mask;
 +        ++bitrate_idx;
 +    }
 +
 +    avio_wb32(s->pb, header);
      ffio_fill(s->pb, 0, xing_offset);
 -    ffio_wfourcc(s->pb, "Xing");
 -    avio_wb32(s->pb, 0x1);    // only number of frames
 -    mp3->nb_frames_offset = avio_tell(s->pb);
 -    avio_wb32(s->pb, 0);
 +    avio_wb32(s->pb, MKBETAG('X', 'i', 'n', 'g'));
 +    avio_wb32(s->pb, 0x01 | 0x02 | 0x04);  // frames/size/toc
 +
 +    mp3->frames_offset = avio_tell(s->pb);
 +    mp3->size = c.frame_size;
 +    mp3->want=1;
 +    mp3->seen=0;
 +    mp3->pos=0;
 +
 +    avio_wb32(s->pb, 0);  // frames
 +    avio_wb32(s->pb, 0);  // size
 +
 +    // toc
 +    for (i = 0; i < VBR_TOC_SIZE; ++i)
 +        avio_w8(s->pb, (uint8_t)(255 * i / VBR_TOC_SIZE));
 +
 +    ffio_fill(s->pb, 0, c.frame_size - needed);
 +    avio_flush(s->pb);
 +
 +    return 0;
 +}
 +
 +/*
 + * Add a frame to XING data.
 + * Following lame's "VbrTag.c".
 + */
 +static void mp3_xing_add_frame(AVFormatContext *s, AVPacket *pkt)
 +{
 +    MP3Context  *mp3 = s->priv_data;
 +    int i;
 +
 +    ++mp3->frames;
 +    mp3->size += pkt->size;
 +
 +    if (mp3->want == ++mp3->seen) {
 +        mp3->bag[mp3->pos] = mp3->size;
 +
 +        if (VBR_NUM_BAGS == ++mp3->pos) {
 +            /* shrink table to half size by throwing away each second bag. */
 +            for (i = 1; i < VBR_NUM_BAGS; i += 2)
 +                mp3->bag[i >> 1] = mp3->bag[i];
 +
 +            /* double wanted amount per bag. */
 +            mp3->want <<= 1;
 +            /* adjust current position to half of table size. */
 +            mp3->pos >>= 1;
 +        }
 +
 +        mp3->seen = 0;
 +    }
 +}
 +
 +static void mp3_fix_xing(AVFormatContext *s)
 +{
 +    MP3Context  *mp3 = s->priv_data;
 +    int i;
 +
 +    avio_flush(s->pb);
 +    avio_seek(s->pb, mp3->frames_offset, SEEK_SET);
 +    avio_wb32(s->pb, mp3->frames);
 +    avio_wb32(s->pb, mp3->size);
 +
 +    avio_w8(s->pb, 0);  // first toc entry has to be zero.
  
 -    mpah.frame_size -= 4 + xing_offset + 4 + 4 + 4;
 -    ffio_fill(s->pb, 0, mpah.frame_size);
 +    for (i = 1; i < VBR_TOC_SIZE; ++i) {
 +        int j = i * mp3->pos / VBR_TOC_SIZE;
 +        int seek_point = 256LL * mp3->bag[j] / mp3->size;
 +        avio_w8(s->pb, FFMIN(seek_point, 255));
 +    }
 +
 +    avio_flush(s->pb);
 +    avio_seek(s->pb, 0, SEEK_END);
  }
  
  /**
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge