Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Jun 2012 18:52:00 +0000 (20:52 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Jun 2012 18:53:27 +0000 (20:53 +0200)
* qatar/master: (24 commits)
  flvdec: remove incomplete, disabled seeking code
  mem: add support for _aligned_malloc() as found on Windows
  lavc: Extend the documentation for avcodec_init_packet
  flvdec: remove incomplete, disabled seeking code
  http: replace atoll() with strtoll()
  mpegts: remove unused/incomplete/broken seeking code
  af_amix: allow float planar sample format as input
  af_amix: use AVFloatDSPContext.vector_fmac_scalar()
  float_dsp: add x86-optimized functions for vector_fmac_scalar()
  float_dsp: Move vector_fmac_scalar() from libavcodec to libavutil
  lavr: Add x86-optimized function for flt to s32 conversion
  lavr: Add x86-optimized function for flt to s16 conversion
  lavr: Add x86-optimized functions for s32 to flt conversion
  lavr: Add x86-optimized functions for s32 to s16 conversion
  lavr: Add x86-optimized functions for s16 to flt conversion
  lavr: Add x86-optimized function for s16 to s32 conversion
  rtpenc: Support packetizing iLBC
  rtpdec: Add a depacketizer for iLBC
  Implement the iLBC storage file format
  mov: Support muxing/demuxing iLBC
  ...

Conflicts:
Changelog
configure
libavcodec/avcodec.h
libavcodec/dsputil.c
libavcodec/version.h
libavformat/movenc.c
libavformat/mpegts.c
libavformat/version.h
libavutil/mem.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
40 files changed:
1  2 
Changelog
configure
doc/general.texi
doc/protocols.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/arm/dsputil_init_neon.c
libavcodec/arm/dsputil_neon.S
libavcodec/avcodec.h
libavcodec/dca.c
libavcodec/dirac.c
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/libilbc.c
libavcodec/ratecontrol.c
libavcodec/utils.c
libavcodec/version.h
libavfilter/af_amix.c
libavformat/Makefile
libavformat/allformats.c
libavformat/flvdec.c
libavformat/http.c
libavformat/ilbc.c
libavformat/isom.c
libavformat/mov.c
libavformat/movenc.c
libavformat/mpegts.c
libavformat/rtmpproto.c
libavformat/rtpdec.c
libavformat/rtpdec_formats.h
libavformat/rtpdec_ilbc.c
libavformat/rtpenc.c
libavformat/rtsp.c
libavformat/sdp.c
libavformat/version.h
libavutil/float_dsp.c
libavutil/float_dsp.h
libavutil/mem.c
libavutil/x86/float_dsp.asm
libavutil/x86/float_dsp_init.c

diff --cc Changelog
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version <next>:
 +version next:
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
 +- Indeo Audio decoder
 +- channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
 +- RTMPT protocol support
++- iLBC encoding/decoding via libilbc
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 +
 +version 0.11:
 +
 +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 +         CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785,
 +         CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790,
 +         CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795,
 +         CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800,
 +         CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804,
 +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder
 +- setfield filter
  - CDXL demuxer and decoder
  - Apple ProRes encoder
 +- ffprobe -count_packets and -count_frames options
  - Sun Rasterfile Encoder
 -- remove libpostproc
  - ID3v2 attached pictures reading and writing
  - WMA Lossless decoder
 -- XBM encoder
 +- bluray protocol
 +- blackdetect filter
 +- libutvideo encoder wrapper (--enable-libutvideo)
 +- swapuv filter
 +- bbox filter
 +- XBM encoder and decoder
  - RealAudio Lossless decoder
  - ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 +- tile video filter
 +- Metal Gear Solid: The Twin Snakes demuxer
 +- OpenEXR image decoder
 +- removelogo filter
 +- drop support for ffmpeg without libavfilter
 +- drawtext video filter: fontconfig support
 +- ffmpeg -benchmark_all option
 +- super2xsai filter ported from libmpcodecs
 +- add libavresample audio conversion library for compatibility
 +- MicroDVD decoder
 +- Avid Meridien (AVUI) encoder and decoder
 +- accept + prefix to -pix_fmt option to disable automatic conversions.
 +- complete audio filtering in libavfilter and ffmpeg
  - add fps filter
 -- audio split filter
 +- vorbis parser
 +- png parser
  - audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 -- Indeo Audio decoder
 -- channelsplit audio filter
 -- RTMPT protocol support
 -- iLBC encoding/decoding via libilbc
  
  
 -version 0.8:
 +version 0.10:
  
 +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 +         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 +         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 +         CVE-2011-3950, CVE-2011-3951, CVE-2011-3952
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
 +- OpenMG Audio muxer
 +- Timecode extraction in DV and MOV
 +- thumbnail video filter
 +- XML output in ffprobe
 +- asplit audio filter
 +- tinterlace video filter
 +- astreamsync audio filter
 +- amerge audio filter
 +- ISMV (Smooth Streaming) muxer
  - GSM audio parser
  - SMJPEG muxer
 -
 -
 -version 0.8_beta2:
 -
 +- XWD encoder and decoder
  - Automatic thread count based on detection number of (available) CPU cores
 -- Deprecate libpostproc. If desired, the switch --enable-postproc will
 -  enable it but it may be removed in a later Libav release.
 +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
 +- ffprobe -show_error option
 +- Avid 1:1 10-bit RGB Packer codec
 +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder
 +- yuv4 libquicktime packed 4:2:0 encoder and decoder
 +- ffprobe -show_frames option
 +- silencedetect audio filter
 +- ffprobe -show_program_version, -show_library_versions, -show_versions options
  - rv34: frame-level multi-threading
  - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
 +- Improved PGS subtitle decoder
 +- dumpgraph option to lavfi device
 +- r210 and r10k encoders
 +- ffwavesynth decoder
 +- aviocat tool
 +- ffeval tool
  
  
 -version 0.8_beta1:
 +version 0.9:
  
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
 +- added avconv, which is almost the same for now, except
  for a few incompatible changes in the options, which will hopefully make them
  easier to use. The changes are:
      * The options placement is now strictly enforced! While in theory the
diff --cc configure
+++ b/configure
@@@ -180,10 -172,8 +180,11 @@@ External library support
    --enable-libfaac         enable FAAC support via libfaac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [no]
+   --enable-libilbc         enable iLBC de/encoding via libilbc [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
 +  --enable-libnut          enable NUT (de)muxing via libnut,
 +                           native (de)muxer exists [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
@@@ -1051,9 -946,8 +1052,10 @@@ CONFIG_LIST=
      libfaac
      libfreetype
      libgsm
+     libilbc
 +    libmodplug
      libmp3lame
 +    libnut
      libopencore_amrnb
      libopencore_amrwb
      libopencv
@@@ -1588,7 -1430,8 +1591,9 @@@ libgsm_decoder_deps="libgsm
  libgsm_encoder_deps="libgsm"
  libgsm_ms_decoder_deps="libgsm"
  libgsm_ms_encoder_deps="libgsm"
+ libilbc_decoder_deps="libilbc"
+ libilbc_encoder_deps="libilbc"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
@@@ -3254,12 -2923,11 +3260,13 @@@ enabled libcelt    && require libcelt c
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
  enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
+ enabled libilbc    && require  libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
 +enabled libmodplug && require  libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
  enabled libmp3lame && require  "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
 +enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
  enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
  enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
 -enabled libopencv  && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
 +enabled libopencv  && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
  enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
  enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
  enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
@@@ -3517,41 -3146,9 +3524,41 @@@ check_deps $CONFIG_LIST       
  
  enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
  
- ! enabled_any memalign posix_memalign &&
 +if test $target_os = "haiku"; then
 +    disable memalign
 +    disable posix_memalign
 +fi
 +
+ ! enabled_any memalign posix_memalign aligned_malloc &&
      enabled_any $need_memalign && enable memalign_hack
  
 +# add_dep lib dep
 +# -> enable ${lib}_deps_${dep}
 +# -> add $dep to ${lib}_deps only once
 +add_dep() {
 +    lib=$1
 +    dep=$2
 +    enabled "${lib}_deps_${dep}" && return 0
 +    enable  "${lib}_deps_${dep}"
 +    prepend "${lib}_deps" $dep
 +}
 +
 +# merge deps lib components
 +# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
 +merge_deps() {
 +    lib=$1
 +    shift
 +    for comp in $*; do
 +        enabled $comp || continue
 +        eval "dep=\"\$${comp}_deps\""
 +        for d in $dep; do
 +            add_dep $lib $d
 +        done
 +    done
 +}
 +
 +merge_deps libavfilter $FILTER_LIST
 +
  echo "install prefix            $prefix"
  echo "source path               $source_path"
  echo "C compiler                $cc"
@@@ -3628,9 -3213,8 +3635,10 @@@ echo "libcelt enabled           ${libce
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libfaac enabled           ${libfaac-no}"
  echo "libgsm enabled            ${libgsm-no}"
+ echo "libilbc enabled           ${libilbc-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
 +echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
  echo "libopencore-amrwb support ${libopencore_amrwb-no}"
  echo "libopencv support         ${libopencv-no}"
@@@ -90,12 -82,23 +90,23 @@@ configure to enable it
  @float NOTE
  x264 is under the GNU Public License Version 2 or later
  (see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for
 -details), you must upgrade Libav's license to GPL in order to use it.
 +details), you must upgrade FFmpeg's license to GPL in order to use it.
  @end float
  
+ @section libilbc
+ iLBC is a narrowband speech codec that has been made freely available
+ by Google as part of the WebRTC project. libilbc is a packaging friendly
+ copy of the iLBC codec. Libav can make use of the libilbc library for
+ iLBC encoding and decoding.
+ Go to @url{https://github.com/dekkers/libilbc} and follow the instructions for
+ installing the library. Then pass @code{--enable-libilbc} to configure to
+ enable it.
  
  
 -@chapter Supported File Formats and Codecs
 +@chapter Supported File Formats, Codecs or Features
  
  You can use the @code{-formats} and @code{-codecs} options to have an exhaustive list.
  
Simple merge
@@@ -659,15 -596,14 +659,17 @@@ OBJS-$(CONFIG_LIBGSM_DECODER
  OBJS-$(CONFIG_LIBGSM_ENCODER)             += libgsm.o
  OBJS-$(CONFIG_LIBGSM_MS_DECODER)          += libgsm.o
  OBJS-$(CONFIG_LIBGSM_MS_ENCODER)          += libgsm.o
+ OBJS-$(CONFIG_LIBILBC_DECODER)            += libilbc.o
+ OBJS-$(CONFIG_LIBILBC_ENCODER)            += libilbc.o
  OBJS-$(CONFIG_LIBMP3LAME_ENCODER)         += libmp3lame.o mpegaudiodecheader.o \
                                               audio_frame_queue.o
 -OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER)  += libopencore-amr.o
 -OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER)  += libopencore-amr.o
 +OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER)  += libopencore-amr.o \
 +                                             audio_frame_queue.o
 +OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER)  += libopencore-amr.o \
 +                                             audio_frame_queue.o
  OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER)  += libopencore-amr.o
 -OBJS-$(CONFIG_LIBOPENJPEG_DECODER)        += libopenjpeg.o
 +OBJS-$(CONFIG_LIBOPENJPEG_DECODER)        += libopenjpegdec.o
 +OBJS-$(CONFIG_LIBOPENJPEG_ENCODER)        += libopenjpegenc.o
  OBJS-$(CONFIG_LIBSCHROEDINGER_DECODER)    += libschroedingerdec.o \
                                               libschroedinger.o
  OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER)    += libschroedingerenc.o \
Simple merge
Simple merge
Simple merge
@@@ -407,10 -394,7 +407,11 @@@ enum CodecID 
      CODEC_ID_BMV_AUDIO,
      CODEC_ID_RALF,
      CODEC_ID_IAC,
+     CODEC_ID_ILBC,
 +    CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
 +    CODEC_ID_8SVX_RAW    = MKBETAG('8','S','V','X'),
 +    CODEC_ID_SONIC       = MKBETAG('S','O','N','C'),
 +    CODEC_ID_SONIC_LS    = MKBETAG('S','O','N','L'),
  
      /* subtitle codecs */
      CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
Simple merge
Simple merge
@@@ -2509,15 -2401,7 +2509,7 @@@ static void vector_fmul_scalar_c(float 
          dst[i] = src[i] * mul;
  }
  
- static void vector_fmac_scalar_c(float *dst, const float *src, float mul,
-                                  int len)
- {
-     int i;
-     for (i = 0; i < len; i++)
-         dst[i] += src[i] * mul;
- }
 -static void butterflies_float_c(float *restrict v1, float *restrict v2,
 +static void butterflies_float_c(float *av_restrict v1, float *av_restrict v2,
                                  int len)
  {
      int i;
Simple merge
index 0000000,1c056d5..0893c6c
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,209 +1,209 @@@
 - * This file is part of Libav.
+ /*
+  * iLBC decoder/encoder stub
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <ilbc.h>
+ #include "avcodec.h"
+ #include "libavutil/opt.h"
+ #include "internal.h"
+ static int get_mode(AVCodecContext *avctx)
+ {
+     if (avctx->block_align == 38)
+         return 20;
+     else if (avctx->block_align == 50)
+         return 30;
+     else if (avctx->bit_rate > 0)
+         return avctx->bit_rate <= 14000 ? 30 : 20;
+     else
+         return -1;
+ }
+ typedef struct ILBCDecContext {
+     const AVClass *class;
+     AVFrame frame;
+     iLBC_Dec_Inst_t decoder;
+     int enhance;
+ } ILBCDecContext;
+ static const AVOption ilbc_dec_options[] = {
+     { "enhance", "Enhance the decoded audio (adds delay)", offsetof(ILBCDecContext, enhance), AV_OPT_TYPE_INT, { 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM },
+     { NULL }
+ };
+ static const AVClass ilbc_dec_class = {
+     "libilbc", av_default_item_name, ilbc_dec_options, LIBAVUTIL_VERSION_INT
+ };
+ static av_cold int ilbc_decode_init(AVCodecContext *avctx)
+ {
+     ILBCDecContext *s  = avctx->priv_data;
+     int mode;
+     if ((mode = get_mode(avctx)) < 0) {
+         av_log(avctx, AV_LOG_ERROR, "iLBC frame mode not indicated\n");
+         return AVERROR(EINVAL);
+     }
+     WebRtcIlbcfix_InitDecode(&s->decoder, mode, s->enhance);
+     avcodec_get_frame_defaults(&s->frame);
+     avctx->coded_frame = &s->frame;
+     avctx->channels = 1;
+     avctx->sample_rate = 8000;
+     avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+     return 0;
+ }
+ static int ilbc_decode_frame(AVCodecContext *avctx, void *data,
+                              int *got_frame_ptr, AVPacket *avpkt)
+ {
+     const uint8_t *buf = avpkt->data;
+     int buf_size       = avpkt->size;
+     ILBCDecContext *s  = avctx->priv_data;
+     int ret;
+     if (s->decoder.no_of_bytes > buf_size) {
+         av_log(avctx, AV_LOG_ERROR, "iLBC frame too short (%u, should be %u)\n",
+                buf_size, s->decoder.no_of_bytes);
+         return AVERROR_INVALIDDATA;
+     }
+     s->frame.nb_samples = s->decoder.blockl;
+     if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
+         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+         return ret;
+     }
+     WebRtcIlbcfix_DecodeImpl((WebRtc_Word16*) s->frame.data[0],
+                              (const WebRtc_UWord16*) buf, &s->decoder, 1);
+     *got_frame_ptr   = 1;
+     *(AVFrame *)data = s->frame;
+     return s->decoder.no_of_bytes;
+ }
+ AVCodec ff_libilbc_decoder = {
+     .name           = "libilbc",
+     .type           = AVMEDIA_TYPE_AUDIO,
+     .id             = CODEC_ID_ILBC,
+     .priv_data_size = sizeof(ILBCDecContext),
+     .init           = ilbc_decode_init,
+     .decode         = ilbc_decode_frame,
+     .capabilities   = CODEC_CAP_DR1,
+     .long_name      = NULL_IF_CONFIG_SMALL("Internet Low Bitrate Codec (iLBC)"),
+     .priv_class     = &ilbc_dec_class,
+ };
+ typedef struct ILBCEncContext {
+     const AVClass *class;
+     iLBC_Enc_Inst_t encoder;
+     int mode;
+ } ILBCEncContext;
+ static const AVOption ilbc_enc_options[] = {
+     { "mode", "iLBC mode (20 or 30 ms frames)", offsetof(ILBCEncContext, mode), AV_OPT_TYPE_INT, { 20 }, 20, 30, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
+     { NULL }
+ };
+ static const AVClass ilbc_enc_class = {
+     "libilbc", av_default_item_name, ilbc_enc_options, LIBAVUTIL_VERSION_INT
+ };
+ static av_cold int ilbc_encode_init(AVCodecContext *avctx)
+ {
+     ILBCEncContext *s = avctx->priv_data;
+     int mode;
+     if (avctx->sample_rate != 8000) {
+         av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
+         return AVERROR(EINVAL);
+     }
+     if (avctx->channels != 1) {
+         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
+         return AVERROR(EINVAL);
+     }
+     if ((mode = get_mode(avctx)) > 0)
+         s->mode = mode;
+     else
+         s->mode = s->mode != 30 ? 20 : 30;
+     WebRtcIlbcfix_InitEncode(&s->encoder, s->mode);
+     avctx->block_align = s->encoder.no_of_bytes;
+     avctx->frame_size  = s->encoder.blockl;
+ #if FF_API_OLD_ENCODE_AUDIO
+     avctx->coded_frame = avcodec_alloc_frame();
+     if (!avctx->coded_frame)
+         return AVERROR(ENOMEM);
+ #endif
+     return 0;
+ }
+ static av_cold int ilbc_encode_close(AVCodecContext *avctx)
+ {
+ #if FF_API_OLD_ENCODE_AUDIO
+     av_freep(&avctx->coded_frame);
+ #endif
+     return 0;
+ }
+ static int ilbc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+                              const AVFrame *frame, int *got_packet_ptr)
+ {
+     ILBCEncContext *s = avctx->priv_data;
+     int ret;
+     if ((ret = ff_alloc_packet(avpkt, 50))) {
+         av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+         return ret;
+     }
+     WebRtcIlbcfix_EncodeImpl((WebRtc_UWord16*) avpkt->data, (const WebRtc_Word16*) frame->data[0], &s->encoder);
+     avpkt->size     = s->encoder.no_of_bytes;
+     *got_packet_ptr = 1;
+     return 0;
+ }
+ static const AVCodecDefault ilbc_encode_defaults[] = {
+     { "b", "0" },
+     { NULL }
+ };
+ AVCodec ff_libilbc_encoder = {
+     .name           = "libilbc",
+     .type           = AVMEDIA_TYPE_AUDIO,
+     .id             = CODEC_ID_ILBC,
+     .priv_data_size = sizeof(ILBCEncContext),
+     .init           = ilbc_encode_init,
+     .encode2        = ilbc_encode_frame,
+     .close          = ilbc_encode_close,
+     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                      AV_SAMPLE_FMT_NONE },
+     .long_name      = NULL_IF_CONFIG_SMALL("Internet Low Bitrate Codec (iLBC)"),
+     .defaults       = ilbc_encode_defaults,
+     .priv_class     = &ilbc_enc_class,
+ };
Simple merge
Simple merge
@@@ -27,8 -27,8 +27,8 @@@
   */
  
  #define LIBAVCODEC_VERSION_MAJOR 54
- #define LIBAVCODEC_VERSION_MINOR  25
 -#define LIBAVCODEC_VERSION_MINOR 15
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  26
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge
@@@ -119,10 -108,10 +119,12 @@@ OBJS-$(CONFIG_H263_MUXER
  OBJS-$(CONFIG_H264_DEMUXER)              += h264dec.o rawdec.o
  OBJS-$(CONFIG_H264_MUXER)                += rawenc.o
  OBJS-$(CONFIG_HLS_DEMUXER)               += hls.o
 +OBJS-$(CONFIG_ICO_DEMUXER)               += icodec.o
  OBJS-$(CONFIG_IDCIN_DEMUXER)             += idcin.o
 +OBJS-$(CONFIG_IDF_DEMUXER)               += bintext.o
  OBJS-$(CONFIG_IFF_DEMUXER)               += iff.o
+ OBJS-$(CONFIG_ILBC_DEMUXER)              += ilbc.o
+ OBJS-$(CONFIG_ILBC_MUXER)                += ilbc.o
  OBJS-$(CONFIG_IMAGE2_DEMUXER)            += img2dec.o img2.o
  OBJS-$(CONFIG_IMAGE2_MUXER)              += img2enc.o img2.o
  OBJS-$(CONFIG_IMAGE2PIPE_DEMUXER)        += img2dec.o img2.o
@@@ -112,10 -106,9 +112,11 @@@ void av_register_all(void
      REGISTER_MUXDEMUX (H263, h263);
      REGISTER_MUXDEMUX (H264, h264);
      REGISTER_DEMUXER  (HLS, hls);
 +    REGISTER_DEMUXER  (ICO, ico);
      REGISTER_DEMUXER  (IDCIN, idcin);
 +    REGISTER_DEMUXER  (IDF, idf);
      REGISTER_DEMUXER  (IFF, iff);
+     REGISTER_MUXDEMUX (ILBC, ilbc);
      REGISTER_MUXDEMUX (IMAGE2, image2);
      REGISTER_MUXDEMUX (IMAGE2PIPE, image2pipe);
      REGISTER_DEMUXER  (INGENIENT, ingenient);
Simple merge
Simple merge
index 0000000,33aed77..d4f4583
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,141 +1,141 @@@
 - * This file is part of Libav.
+ /*
+  * iLBC storage file format
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "avformat.h"
+ #include "internal.h"
+ static const char mode20_header[] = "#!iLBC20\n";
+ static const char mode30_header[] = "#!iLBC30\n";
+ static int ilbc_write_header(AVFormatContext *s)
+ {
+     AVIOContext *pb = s->pb;
+     AVCodecContext *enc;
+     if (s->nb_streams != 1) {
+         av_log(s, AV_LOG_ERROR, "Unsupported number of streams\n");
+         return AVERROR(EINVAL);
+     }
+     enc = s->streams[0]->codec;
+     if (enc->codec_id != CODEC_ID_ILBC) {
+         av_log(s, AV_LOG_ERROR, "Unsupported codec\n");
+         return AVERROR(EINVAL);
+     }
+     if (enc->block_align == 50) {
+         avio_write(pb, mode30_header, sizeof(mode30_header) - 1);
+     } else if (enc->block_align == 38) {
+         avio_write(pb, mode20_header, sizeof(mode20_header) - 1);
+     } else {
+         av_log(s, AV_LOG_ERROR, "Unsupported mode\n");
+         return AVERROR(EINVAL);
+     }
+     avio_flush(pb);
+     return 0;
+ }
+ static int ilbc_write_packet(AVFormatContext *s, AVPacket *pkt)
+ {
+     avio_write(s->pb, pkt->data, pkt->size);
+     avio_flush(s->pb);
+     return 0;
+ }
+ static int ilbc_probe(AVProbeData *p)
+ {
+     // Only check for "#!iLBC" which matches both formats
+     if (!memcmp(p->buf, mode20_header, 6))
+         return AVPROBE_SCORE_MAX;
+     else
+         return 0;
+ }
+ static int ilbc_read_header(AVFormatContext *s)
+ {
+     AVIOContext *pb = s->pb;
+     AVStream *st;
+     uint8_t header[9];
+     avio_read(pb, header, 9);
+     st = avformat_new_stream(s, NULL);
+     if (!st)
+         return AVERROR(ENOMEM);
+     st->codec->codec_id = CODEC_ID_ILBC;
+     st->codec->sample_rate = 8000;
+     st->codec->channels = 1;
+     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+     st->start_time = 0;
+     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+     if (!memcmp(header, mode20_header, sizeof(mode20_header) - 1)) {
+         st->codec->block_align = 38;
+         st->codec->bit_rate = 15200;
+     } else if (!memcmp(header, mode30_header, sizeof(mode30_header) - 1)) {
+         st->codec->block_align = 50;
+         st->codec->bit_rate = 13333;
+     } else {
+         av_log(s, AV_LOG_ERROR, "Unrecognized iLBC file header\n");
+         return AVERROR_INVALIDDATA;
+     }
+     return 0;
+ }
+ static int ilbc_read_packet(AVFormatContext *s,
+                           AVPacket *pkt)
+ {
+     AVCodecContext *enc = s->streams[0]->codec;
+     int ret;
+     if ((ret = av_new_packet(pkt, enc->block_align)) < 0)
+         return ret;
+     pkt->stream_index = 0;
+     pkt->pos = avio_tell(s->pb);
+     pkt->duration = enc->block_align == 38 ? 160 : 240;
+     if ((ret = avio_read(s->pb, pkt->data, enc->block_align)) != enc->block_align) {
+         av_free_packet(pkt);
+         return ret < 0 ? ret : AVERROR(EIO);
+     }
+     return 0;
+ }
+ AVInputFormat ff_ilbc_demuxer = {
+     .name         = "ilbc",
+     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage file format"),
+     .read_probe   = ilbc_probe,
+     .read_header  = ilbc_read_header,
+     .read_packet  = ilbc_read_packet,
+     .flags        = AVFMT_GENERIC_INDEX,
+ };
+ AVOutputFormat ff_ilbc_muxer = {
+     .name         = "ilbc",
+     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage file format"),
+     .mime_type    = "audio/iLBC",
+     .extensions   = "lbc",
+     .audio_codec  = CODEC_ID_ILBC,
+     .write_header = ilbc_write_header,
+     .write_packet = ilbc_write_packet,
+     .flags        = AVFMT_NOTIMESTAMPS,
+ };
Simple merge
Simple merge
@@@ -3367,13 -3094,11 +3367,14 @@@ 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) ||
 -                st->codec->codec_id == CODEC_ID_ILBC) {
 +            if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) {
 +                av_log(s, AV_LOG_WARNING, "track %d: codec frame size is not set\n", i);
 +                track->audio_vbr = 1;
 +            }else if(st->codec->codec_id == CODEC_ID_ADPCM_MS ||
-                      st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV){
++                     st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV ||
++                     st->codec->codec_id == CODEC_ID_ILBC){
                  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->sample_size = st->codec->block_align;
@@@ -2107,146 -2059,61 +2105,60 @@@ static av_unused int64_t mpegts_get_pcr
      int64_t pos, timestamp;
      uint8_t buf[TS_PACKET_SIZE];
      int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
 -    const int find_next= 1;
      pos = ((*ppos  + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
 -    if (find_next) {
 -        for(;;) {
 -            avio_seek(s->pb, pos, SEEK_SET);
 -            if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
 +    while(pos < pos_limit) {
 +        if (avio_seek(s->pb, pos, SEEK_SET) < 0)
 +            return AV_NOPTS_VALUE;
 +        if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
 +            return AV_NOPTS_VALUE;
 +        if (buf[0] != 0x47) {
 +            if (mpegts_resync(s) < 0)
                  return AV_NOPTS_VALUE;
 -            if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
 -                parse_pcr(&timestamp, &pcr_l, buf) == 0) {
 -                break;
 -            }
 -            pos += ts->raw_packet_size;
 +            pos = avio_tell(s->pb);
 +            continue;
          }
 -    } else {
 -        for(;;) {
 -            pos -= ts->raw_packet_size;
 -            if (pos < 0)
 -                return AV_NOPTS_VALUE;
 -            avio_seek(s->pb, pos, SEEK_SET);
 -            if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
 -                return AV_NOPTS_VALUE;
 -            if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
 -                parse_pcr(&timestamp, &pcr_l, buf) == 0) {
 -                break;
 -            }
 +        if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
 +            parse_pcr(&timestamp, &pcr_l, buf) == 0) {
 +            *ppos = pos;
 +            return timestamp;
          }
 +        pos += ts->raw_packet_size;
      }
 -    *ppos = pos;
  
 -    return timestamp;
 +    return AV_NOPTS_VALUE;
  }
  
 -static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
 +static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
 +                              int64_t *ppos, int64_t pos_limit)
 +{
      MpegTSContext *ts = s->priv_data;
 -    uint8_t buf[TS_PACKET_SIZE];
      int64_t pos;
 -
 -    if (ff_seek_frame_binary(s, stream_index, target_ts, flags) < 0)
 -        return -1;
 -
 -    pos= avio_tell(s->pb);
 -
 -    for(;;) {
 -        avio_seek(s->pb, pos, SEEK_SET);
 -        if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
 -            return -1;
 -//        pid = AV_RB16(buf + 1) & 0x1fff;
 -        if(buf[1] & 0x40) break;
 -        pos += ts->raw_packet_size;
 +    pos = ((*ppos  + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
 +    ff_read_frame_flush(s);
 +    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
 +        return AV_NOPTS_VALUE;
 +    while(pos < pos_limit) {
 +        int ret;
 +        AVPacket pkt;
 +        av_init_packet(&pkt);
 +        ret= av_read_frame(s, &pkt);
 +        if(ret < 0)
 +            return AV_NOPTS_VALUE;
 +        av_free_packet(&pkt);
 +        if(pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0){
 +            ff_reduce_index(s, pkt.stream_index);
 +            av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
 +            if(pkt.stream_index == stream_index){
 +                *ppos= pkt.pos;
 +                return pkt.dts;
 +            }
 +        }
 +        pos = pkt.pos;
      }
 -    avio_seek(s->pb, pos, SEEK_SET);
  
 -    return 0;
 +    return AV_NOPTS_VALUE;
  }
  
- #ifdef USE_SYNCPOINT_SEARCH
- static int read_seek2(AVFormatContext *s,
-                       int stream_index,
-                       int64_t min_ts,
-                       int64_t target_ts,
-                       int64_t max_ts,
-                       int flags)
- {
-     int64_t pos;
-     int64_t ts_ret, ts_adj;
-     int stream_index_gen_search;
-     AVStream *st;
-     AVParserState *backup;
-     backup = ff_store_parser_state(s);
-     // detect direction of seeking for search purposes
-     flags |= (target_ts - min_ts > (uint64_t)(max_ts - target_ts)) ?
-              AVSEEK_FLAG_BACKWARD : 0;
-     if (flags & AVSEEK_FLAG_BYTE) {
-         // use position directly, we will search starting from it
-         pos = target_ts;
-     } else {
-         // search for some position with good timestamp match
-         if (stream_index < 0) {
-             stream_index_gen_search = av_find_default_stream_index(s);
-             if (stream_index_gen_search < 0) {
-                 ff_restore_parser_state(s, backup);
-                 return -1;
-             }
-             st = s->streams[stream_index_gen_search];
-             // timestamp for default must be expressed in AV_TIME_BASE units
-             ts_adj = av_rescale(target_ts,
-                                 st->time_base.den,
-                                 AV_TIME_BASE * (int64_t)st->time_base.num);
-         } else {
-             ts_adj = target_ts;
-             stream_index_gen_search = stream_index;
-         }
-         pos = ff_gen_search(s, stream_index_gen_search, ts_adj,
-                             0, INT64_MAX, -1,
-                             AV_NOPTS_VALUE,
-                             AV_NOPTS_VALUE,
-                             flags, &ts_ret, mpegts_get_pcr);
-         if (pos < 0) {
-             ff_restore_parser_state(s, backup);
-             return -1;
-         }
-     }
-     // search for actual matching keyframe/starting position for all streams
-     if (ff_gen_syncpoint_search(s, stream_index, pos,
-                                 min_ts, target_ts, max_ts,
-                                 flags) < 0) {
-         ff_restore_parser_state(s, backup);
-         return -1;
-     }
-     ff_free_parser_state(s, backup);
-     return 0;
- }
- static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
- {
-     int ret;
-     if (flags & AVSEEK_FLAG_BACKWARD) {
-         flags &= ~AVSEEK_FLAG_BACKWARD;
-         ret = read_seek2(s, stream_index, INT64_MIN, target_ts, target_ts, flags);
-         if (ret < 0)
-             // for compatibility reasons, seek to the best-fitting timestamp
-             ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags);
-     } else {
-         ret = read_seek2(s, stream_index, target_ts, target_ts, INT64_MAX, flags);
-         if (ret < 0)
-             // for compatibility reasons, seek to the best-fitting timestamp
-             ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags);
-     }
-     return ret;
- }
- #endif
  /**************************************************************/
  /* parsing functions - called from other demuxers such as RTP */
  
@@@ -2311,11 -2175,9 +2223,8 @@@ AVInputFormat ff_mpegts_demuxer = 
      .read_header    = mpegts_read_header,
      .read_packet    = mpegts_read_packet,
      .read_close     = mpegts_read_close,
 -    .read_seek      = read_seek,
 -    .read_timestamp = mpegts_get_pcr,
 +    .read_timestamp = mpegts_get_dts,
      .flags          = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
- #ifdef USE_SYNCPOINT_SEARCH
-     .read_seek2     = read_seek2,
- #endif
  };
  
  AVInputFormat ff_mpegtsraw_demuxer = {
      .read_header    = mpegts_read_header,
      .read_packet    = mpegts_raw_read_packet,
      .read_close     = mpegts_read_close,
 -    .read_seek      = read_seek,
 -    .read_timestamp = mpegts_get_pcr,
 +    .read_timestamp = mpegts_get_dts,
      .flags          = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
- #ifdef USE_SYNCPOINT_SEARCH
-     .read_seek2     = read_seek2,
- #endif
      .priv_class     = &mpegtsraw_class,
  };
Simple merge
Simple merge
Simple merge
index 0000000,7159dcf..247c779
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,73 +1,73 @@@
 - * This file is part of Libav.
+ /*
+  * RTP iLBC Depacketizer, RFC 3952
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "avformat.h"
+ #include "rtpdec_formats.h"
+ #include "libavutil/avstring.h"
+ static int ilbc_parse_fmtp(AVStream *stream, PayloadContext *data,
+                            char *attr, char *value)
+ {
+     if (!strcmp(attr, "mode")) {
+         int mode = atoi(value);
+         switch (mode) {
+         case 20:
+             stream->codec->block_align = 38;
+             break;
+         case 30:
+             stream->codec->block_align = 50;
+             break;
+         default:
+             av_log(NULL, AV_LOG_ERROR, "Unsupported iLBC mode %d\n", mode);
+             return AVERROR(EINVAL);
+         }
+     }
+     return 0;
+ }
+ static int ilbc_parse_sdp_line(AVFormatContext *s, int st_index,
+                                PayloadContext *data, const char *line)
+ {
+     const char *p;
+     AVStream *st;
+     if (st_index < 0)
+         return 0;
+     st = s->streams[st_index];
+     if (av_strstart(line, "fmtp:", &p)) {
+         int ret = ff_parse_fmtp(st, data, p, ilbc_parse_fmtp);
+         if (ret < 0)
+             return ret;
+         if (!st->codec->block_align) {
+             av_log(s, AV_LOG_ERROR, "No iLBC mode set\n");
+             return AVERROR(EINVAL);
+         }
+     }
+     return 0;
+ }
+ RTPDynamicProtocolHandler ff_ilbc_dynamic_handler = {
+     .enc_name         = "iLBC",
+     .codec_type       = AVMEDIA_TYPE_AUDIO,
+     .codec_id         = CODEC_ID_ILBC,
+     .parse_sdp_a_line = ilbc_parse_sdp_line,
+ };
Simple merge
Simple merge
Simple merge
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 54
- #define LIBAVFORMAT_VERSION_MINOR  8
 -#define LIBAVFORMAT_VERSION_MINOR  5
 -#define LIBAVFORMAT_VERSION_MICRO  2
++#define LIBAVFORMAT_VERSION_MINOR  9
 +#define LIBAVFORMAT_VERSION_MICRO 100
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \
Simple merge
Simple merge
diff --cc libavutil/mem.c
@@@ -91,11 -82,12 +91,13 @@@ void *av_malloc(size_t size
      ptr = (char*)ptr + diff;
      ((char*)ptr)[-1]= diff;
  #elif HAVE_POSIX_MEMALIGN
 -    if (posix_memalign(&ptr,32,size))
 +    if (size) //OS X on SDK 10.6 has a broken posix_memalign implementation
 +    if (posix_memalign(&ptr,ALIGN,size))
          ptr = NULL;
 -    ptr = _aligned_malloc(size, 32);
+ #elif HAVE_ALIGNED_MALLOC
++    ptr = _aligned_malloc(size, ALIGN);
  #elif HAVE_MEMALIGN
 -    ptr = memalign(32,size);
 +    ptr = memalign(ALIGN,size);
      /* Why 64?
         Indeed, we should align it:
           on 4 for 386
@@@ -142,11 -132,11 +144,13 @@@ void *av_realloc(void *ptr, size_t size
      //FIXME this isn't aligned correctly, though it probably isn't needed
      if(!ptr) return av_malloc(size);
      diff= ((char*)ptr)[-1];
 -    return (char*)realloc((char*)ptr - diff, size + diff) + diff;
 +    ptr= realloc((char*)ptr - diff, size + diff);
 +    if(ptr) ptr = (char*)ptr + diff;
 +    return ptr;
+ #elif HAVE_ALIGNED_MALLOC
 -    return _aligned_realloc(ptr, size, 32);
++    return _aligned_realloc(ptr, size + !size, ALIGN);
  #else
 -    return realloc(ptr, size);
 +    return realloc(ptr, size + !size);
  #endif
  }
  
Simple merge
Simple merge