]> git.sesse.net Git - ffmpeg/commitdiff
Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 14 Oct 2011 01:43:24 +0000 (03:43 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 14 Oct 2011 01:48:22 +0000 (03:48 +0200)
* qatar/master: (22 commits)
  prores: add FATE tests
  id3v2: reduce the scope of some non-globally-used symbols/structures
  id3v2: cosmetics: move some declarations before the places they are used
  shorten: remove the flush function.
  shn: do not allow seeking in the raw shn demuxer.
  avformat: add AVInputFormat flag AVFMT_NO_BYTE_SEEK.
  avformat: update AVInputFormat allowed flags
  avformat: don't unconditionally call ff_read_frame_flush() when trying to seek.
  truespeech: use sizeof() instead of hardcoded sizes
  truespeech: remove unneeded variable, 'consumed'
  truespeech: simplify truespeech_read_frame() by using get_bits()
  truespeech: decode directly to output buffer instead of a temp buffer
  truespeech: check to make sure channels == 1
  truespeech: check for large enough output buffer rather than truncating output
  truespeech: remove unneeded zero-size packet check.
  mlpdec: return meaningful error codes instead of -1
  mlpdec: remove unnecessary wrapper function
  mlpdec: only calculate output size once
  mlpdec: validate that the reported channel count matches the actual output channel count
  pcm: reduce pointer type casting
  ...

Conflicts:
libavformat/avformat.h
libavformat/id3v2.c
libavformat/id3v2.h
libavformat/utils.c
libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
15 files changed:
1  2 
doc/APIchanges
libavcodec/mathops.h
libavcodec/mlp_parser.c
libavcodec/mlpdec.c
libavcodec/pcm.c
libavcodec/shorten.c
libavcodec/truespeech.c
libavcodec/vc1.c
libavformat/avformat.h
libavformat/id3v2.c
libavformat/id3v2.h
libavformat/rawdec.c
libavformat/utils.c
libavformat/version.h
tests/Makefile

diff --combined doc/APIchanges
index c8a58428ff01d7729c3dba150d196e3f33435e5b,c4557f06a01f7cc40d93d3d9b4603fdab3f6e33d..a1a5de2309e557de7cacf51073ab63e5aef69e64
@@@ -13,6 -13,9 +13,9 @@@ libavutil:   2011-04-1
  
  API changes, most recent first:
  
+ 2011-xx-xx - xxxxxxx - lavf 53.9.0
+   Add AVFMT_NO_BYTE_SEEK AVInputFormat flag.
  2011-10-12 - lavu 51.12.0
    AVOptions API rewrite.
  
    - 641c7af new functions - av_opt_child_next, av_opt_child_class_next
      and av_opt_find2()
  
 -2011-09-03 - fb4ca26 - lavc 53.10.0
 -                       lavf 53.6.0
 +2011-09-22 - xxxxxxx - lavu 51.17.0
 +  Add av_x_if_null().
 +
 +2011-09-18 - xxxxxxx - lavc 53.16.0
 +  Add showall flag2
 +
 +2011-09-16 - xxxxxxx - lavfi 2.42.0
 +  Add avfilter_all_channel_layouts.
 +
 +2011-09-16 - xxxxxxx - lavfi 2.41.0
 +  Rename avfilter_all_* function names to avfilter_make_all_*.
 +
 +  In particular, apply the renames:
 +  avfilter_all_formats         -> avfilter_make_all_formats
 +  avfilter_all_channel_layouts -> avfilter_make_all_channel_layouts
 +  avfilter_all_packing_formats -> avfilter_make_all_packing_formats
 +
 +2011-09-12 - xxxxxxx - lavfi 2.40.0
 +  Change AVFilterBufferRefAudioProps.sample_rate type from uint32_t to int.
 +
 +2011-09-12 - xxxxxxx - lavfi 2.40.0
 +  Simplify signature for avfilter_get_audio_buffer(), make it
 +  consistent with avfilter_get_video_buffer().
 +
 +2011-09-06 - xxxxxxx - lavfi 2.39.0
 +  Rename libavfilter/vsink_buffer.h to libavfilter/buffersink.h.
 +
 +2011-09-06 - xxxxxxx - lavfi 2.38.0
 +  Unify video and audio sink API.
 +
 +  In particular, add av_buffersink_get_buffer_ref(), deprecate
 +  av_vsink_buffer_get_video_buffer_ref() and change the value for the
 +  opaque field passed to the abuffersink init function.
 +
 +2011-09-xx - xxxxxxx - lavu 51.16.0
 +  Add av_asprintf().
 +
 +2011-08-22 - dacd827 - lavf 53.10.0
 +  Add av_find_program_from_stream().
 +
 +2011-08-20 - 69e2c1a - lavu 51.13.0
 +  Add av_get_media_type_string().
 +
 +2011-09-03 - fb4ca26 - lavc 53.13.0
 +                       lavf 53.11.0
                         lsws  2.1.0
    Add {avcodec,avformat,sws}_get_class().
  
 -2011-09-03 - c11fb82 - lavu 51.10.0
 +2011-08-03 - c11fb82 - lavu 51.15.0
    Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function.
  
 -2011-08-26 - f2011ed - lavu 51.9.0
 +2011-08-14 - 323b930 - lavu 51.12.0
    Add av_fifo_peek2(), deprecate av_fifo_peek().
  
 -2011-08-16 - 48f9e45 - lavf 53.4.0
 +2011-08-16 - 48f9e45 - lavf 53.8.0
    Add avformat_query_codec().
  
 -2011-08-16 - bca06e7 - lavc 53.8.0
 +2011-08-16 - bca06e7 - lavc 53.11.0
    Add avcodec_get_type().
  
 -2011-08-06 - 2f63440 - lavf 53.4.0
 +2011-08-06 - 2f63440 - lavf 53.7.0
    Add error_recognition to AVFormatContext.
  
 -2011-08-02 - 9d39cbf - lavc 53.7.1
 +2011-08-02 - 9d39cbf - lavc 53.9.1
    Add AV_PKT_FLAG_CORRUPT AVPacket flag.
  
 -2011-07-10 - a67c061 - lavf 53.3.0
 +2011-07-16 - b57df29 - lavfi 2.27.0
 +  Add audio packing negotiation fields and helper functions.
 +
 +  In particular, add AVFilterPacking enum, planar, in_packings and
 +  out_packings fields to AVFilterLink, and the functions:
 +  avfilter_set_common_packing_formats()
 +  avfilter_all_packing_formats()
 +
 +2011-07-10 - a67c061 - lavf 53.6.0
    Add avformat_find_stream_info(), deprecate av_find_stream_info().
  
 -2011-07-10 - 0b950fe - lavc 53.6.0
 +2011-07-10 - 0b950fe - lavc 53.8.0
    Add avcodec_open2(), deprecate avcodec_open().
  
 +2011-07-01 - b442ca6 - lavf 53.5.0 - avformat.h
 +  Add function av_get_output_timestamp().
 +
 +2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h
 +  Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum.
 +
 +2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h
 +  Add layout negotiation fields and helper functions.
 +
 +  In particular, add in_chlayouts and out_chlayouts to AVFilterLink,
 +  and the functions:
 +  avfilter_set_common_sample_formats()
 +  avfilter_set_common_channel_layouts()
 +  avfilter_all_channel_layouts()
 +
 +2011-06-19 - 527ca39 - lavfi 2.22.0 - AVFilterFormats
 +  Change type of AVFilterFormats.formats from int * to int64_t *,
 +  and update formats handling API accordingly.
 +
 +  avfilter_make_format_list() still takes a int32_t array and converts
 +  it to int64_t. A new function, avfilter_make_format64_list(), that
 +  takes int64_t arrays has been added.
 +
 +2011-06-19 - 44f669e - lavfi 2.21.0 - vsink_buffer.h
 +  Add video sink buffer and vsink_buffer.h public header.
 +
 +2011-06-12 - 9fdf772 - lavfi 2.18.0 - avcodec.h
 +  Add avfilter_get_video_buffer_ref_from_frame() function in
 +  libavfilter/avcodec.h.
 +
 +2011-06-12 - c535494 - lavfi 2.17.0 - avfiltergraph.h
 +  Add avfilter_inout_alloc() and avfilter_inout_free() functions.
 +
 +2011-06-12 - 6119b23 - lavfi 2.16.0 - avfilter_graph_parse()
 +  Change avfilter_graph_parse() signature.
 +
  2011-06-23 - 67e9ae1 - lavu 51.8.0 - attributes.h
    Add av_printf_format().
  
  2011-06-10 - cb7c11c - lavu 51.6.0 - opt.h
    Add av_opt_flag_is_set().
  
 -2011-06-08 - d9f80ea - lavu 51.5.0 - AVMetadata
 +2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays
 +  Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h.
 +
 +2011-06-09 - d9f80ea - lavu 51.8.0 - AVMetadata
    Move AVMetadata from lavf to lavu and rename it to
    AVDictionary -- new installed header dict.h.
    All av_metadata_* functions renamed to av_dict_*.
  
 -2011-06-07 - a6703fa - lavu 51.4.0 - av_get_bytes_per_sample()
 +2011-06-07 - a6703fa - lavu 51.8.0 - av_get_bytes_per_sample()
    Add av_get_bytes_per_sample() in libavutil/samplefmt.h.
    Deprecate av_get_bits_per_sample_fmt().
  
 -2011-06-05 - b39b062 - lavu 51.3.0 - opt.h
 +2011-06-xx - b39b062 - lavu 51.8.0 - opt.h
    Add av_opt_free convenience function.
  
 -2011-05-28 - 0420bd7 - lavu 51.2.0 - pixdesc.h
 +2011-06-06 - 95a0242 - lavfi 2.14.0 - AVFilterBufferRefAudioProps
 +  Remove AVFilterBufferRefAudioProps.size, and use nb_samples in
 +  avfilter_get_audio_buffer() and avfilter_default_get_audio_buffer() in
 +  place of size.
 +
 +2011-06-06 - 0bc2cca - lavu 51.6.0 - av_samples_alloc()
 +  Switch nb_channels and nb_samples parameters order in
 +  av_samples_alloc().
 +
 +2011-06-06 - e1c7414 - lavu 51.5.0 - av_samples_*
 +  Change the data layout created by av_samples_fill_arrays() and
 +  av_samples_alloc().
 +
 +2011-06-06 - 27bcf55 - lavfi 2.13.0 - vsrc_buffer.h
 +  Make av_vsrc_buffer_add_video_buffer_ref() accepts an additional
 +  flags parameter in input.
 +
 +2011-06-03 - e977ca2 - lavfi 2.12.0 - avfilter_link_free()
 +  Add avfilter_link_free() function.
 +
 +2011-06-02 - 5ad38d9 - lavu 51.4.0 - av_force_cpu_flags()
 +  Add av_cpu_flags() in libavutil/cpu.h.
 +
 +2011-05-28 - e71f260 - lavu 51.3.0 - pixdesc.h
    Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate
    avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor.
  
 -2011-05-25 - 30315a8 - lavf 53.1.0 - avformat.h
 +2011-05-25 - 30315a8 - lavf 53.3.0 - avformat.h
    Add fps_probe_size to AVFormatContext.
  
 -2011-05-18 - 64150ff - lavc 53.4.0 - AVCodecContext.request_sample_fmt
 +2011-05-22 - 5ecdfd0 - lavf 53.2.0 - avformat.h
 +  Introduce avformat_alloc_output_context2() and deprecate
 +  avformat_alloc_output_context().
 +
 +2011-05-22 - 83db719 - lavfi 2.10.0 - vsrc_buffer.h
 +  Make libavfilter/vsrc_buffer.h public.
 +
 +2011-05-19 - c000a9f - lavfi 2.8.0 - avcodec.h
 +  Add av_vsrc_buffer_add_frame() to libavfilter/avcodec.h.
 +
 +2011-05-14 - 9fdf772 - lavfi 2.6.0 - avcodec.h
 +  Add avfilter_get_video_buffer_ref_from_frame() to libavfilter/avcodec.h.
 +
 +2011-05-18 - 64150ff - lavc 53.7.0 - AVCodecContext.request_sample_fmt
    Add request_sample_fmt field to AVCodecContext.
  
 -2011-05-10 - 188dea1 - lavc 53.3.0 - avcodec.h
 +2011-05-10 - 188dea1 - lavc 53.6.0 - avcodec.h
    Deprecate AVLPCType and the following fields in
    AVCodecContext: lpc_coeff_precision, prediction_order_method,
    min_partition_order, max_partition_order, lpc_type, lpc_passes.
    Corresponding FLAC encoder options should be used instead.
  
 +2011-05-07 - 9fdf772 - lavfi 2.5.0 - avcodec.h
 +  Add libavfilter/avcodec.h header and avfilter_copy_frame_props()
 +  function.
 +
 +2011-05-07 - 18ded93 - lavc 53.5.0 - AVFrame
 +  Add format field to AVFrame.
 +
 +2011-05-07 - 22333a6 - lavc 53.4.0 - AVFrame
 +  Add width and height fields to AVFrame.
 +
 +2011-05-01 - 35fe66a - lavfi 2.4.0 - avfilter.h
 +  Rename AVFilterBufferRefVideoProps.pixel_aspect to
 +  sample_aspect_ratio.
 +
 +2011-05-01 - 77e9dee - lavc 53.3.0 - AVFrame
 +  Add a sample_aspect_ratio field to AVFrame.
 +
 +2011-05-01 - 1ba5727 - lavc 53.2.0 - AVFrame
 +  Add a pkt_pos field to AVFrame.
 +
 +2011-04-29 - 35ceaa7 - lavu 51.2.0 - mem.h
 +  Add av_dynarray_add function for adding
 +  an element to a dynamic array.
 +
  2011-04-26 - bebe72f - lavu 51.1.0 - avutil.h
    Add AVPictureType enum and av_get_picture_type_char(), deprecate
    FF_*_TYPE defines and av_get_pict_type_char() defined in
      333e894 deprecate url_open_protocol
      e230705 deprecate url_poll and URLPollEntry
  
 -2011-04-10 - lavu  50.40.0 - pixfmt.h
 -  Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats
 -
  2011-04-08 - lavf 52.106.0 - avformat.h
    Minor avformat.h cleanup:
      a9bf9d8 deprecate av_guess_image2_codec
      d9d86e0 rename url_fprintf -> avio_printf
      59f65d9 deprecate url_setbufsize
      3e68b3b deprecate url_ferror
 -    66e5b1d deprecate url_feof
      e8bb2e2 deprecate url_fget_max_packet_size
      76aa876 rename url_fsize -> avio_size
      e519753 deprecate url_fgetc
  2011-03-25 - 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type
    Add audio_service_type field to AVCodecContext.
  
 +2011-03-17 - e309fdc - lavu 50.40.0 - pixfmt.h
 +  Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats
 +
  2011-03-02 - 863c471 - lavf  52.103.0 - av_pkt_dump2, av_pkt_dump_log2
    Add new functions av_pkt_dump2, av_pkt_dump_log2 that uses the
    source stream timebase for outputting timestamps. Deprecate
  2011-02-02 - dfd2a00 - lavu 50.37.0 - log.h
    Make av_dlog public.
  
 +2011-01-31 - 7b3ea55 - lavfi 1.76.0 - vsrc_buffer
 +  Add sample_aspect_ratio fields to vsrc_buffer arguments
 +
 +2011-01-31 - 910b5b8 - lavfi 1.75.0 - AVFilterLink sample_aspect_ratio
 +  Add sample_aspect_ratio field to AVFilterLink.
 +
  2011-01-15 - r26374 - lavfi 1.74.0 - AVFilterBufferRefAudioProps
    Rename AVFilterBufferRefAudioProps.samples_nb to nb_samples.
  
diff --combined libavcodec/mathops.h
index 0477cfdce3ca84e1e13280a4e1cd8427ed09fd6a,45b1ecf1ae435d47601d24f5e5363d7edb4a0c13..1126ba604304989195029f16040638ee4ea6b4ba
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001, 2002 Fabrice Bellard
   * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  #ifndef AVCODEC_MATHOPS_H
@@@ -116,7 -116,9 +116,9 @@@ static inline av_const int mid_pred(in
  #ifndef sign_extend
  static inline av_const int sign_extend(int val, unsigned bits)
  {
-     return (val << ((8 * sizeof(int)) - bits)) >> ((8 * sizeof(int)) - bits);
+     unsigned shift = 8 * sizeof(int) - bits;
+     union { unsigned u; int s; } v = { (unsigned) val << shift };
+     return v.s >> shift;
  }
  #endif
  
diff --combined libavcodec/mlp_parser.c
index a6bdc0c0a58e215f38718322dffd8d80e894a2c1,e1f4c5610ed94243b774146a751cdd7faf4ea45a..abd3ffa8e70038a865d2b87159ddf6eb4d4f8d32
@@@ -2,20 -2,20 +2,20 @@@
   * MLP parser
   * Copyright (c) 2007 Ian Caulfield
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -43,28 -43,28 +43,28 @@@ static const uint8_t mlp_channels[32] 
      5, 6, 5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  };
  
 -static const uint64_t mlp_layout[32] = {
 +const uint64_t ff_mlp_layout[32] = {
      AV_CH_LAYOUT_MONO,
      AV_CH_LAYOUT_STEREO,
      AV_CH_LAYOUT_2_1,
 -    AV_CH_LAYOUT_2_2,
 +    AV_CH_LAYOUT_QUAD,
      AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,
      AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,
 -    AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,
 +    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
      AV_CH_LAYOUT_SURROUND,
      AV_CH_LAYOUT_4POINT0,
 -    AV_CH_LAYOUT_5POINT0,
 +    AV_CH_LAYOUT_5POINT0_BACK,
      AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
      AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
 -    AV_CH_LAYOUT_5POINT1,
 +    AV_CH_LAYOUT_5POINT1_BACK,
      AV_CH_LAYOUT_4POINT0,
 -    AV_CH_LAYOUT_5POINT0,
 +    AV_CH_LAYOUT_5POINT0_BACK,
      AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
      AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
 -    AV_CH_LAYOUT_5POINT1,
 -    AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,
 -    AV_CH_LAYOUT_5POINT0,
 -    AV_CH_LAYOUT_5POINT1,
 +    AV_CH_LAYOUT_5POINT1_BACK,
 +    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
 +    AV_CH_LAYOUT_5POINT0_BACK,
 +    AV_CH_LAYOUT_5POINT1_BACK,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  };
  
@@@ -107,7 -107,7 +107,7 @@@ static int truehd_channels(int chanmap
      return channels;
  }
  
 -static int64_t truehd_layout(int chanmap)
 +int64_t ff_truehd_layout(int chanmap)
  {
      int layout = 0, i;
  
@@@ -138,11 -138,11 +138,11 @@@ int ff_mlp_read_major_sync(void *log, M
      checksum = ff_mlp_checksum16(gb->buffer, 26);
      if (checksum != AV_RL16(gb->buffer+26)) {
          av_log(log, AV_LOG_ERROR, "major sync info header checksum error\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (get_bits_long(gb, 24) != 0xf8726f) /* Sync words */
-         return -1;
+         return AVERROR_INVALIDDATA;
  
      mh->stream_type = get_bits(gb, 8);
  
  
          mh->channels_thd_stream2 = get_bits(gb, 13);
      } else
-         return -1;
+         return AVERROR_INVALIDDATA;
  
      mh->access_unit_size = 40 << (ratebits & 7);
      mh->access_unit_size_pow2 = 64 << (ratebits & 7);
@@@ -316,15 -316,15 +316,15 @@@ static int mlp_parse(AVCodecParserConte
          if (mh.stream_type == 0xbb) {
              /* MLP stream */
              avctx->channels = mlp_channels[mh.channels_mlp];
 -            avctx->channel_layout = mlp_layout[mh.channels_mlp];
 +            avctx->channel_layout = ff_mlp_layout[mh.channels_mlp];
          } else { /* mh.stream_type == 0xba */
              /* TrueHD stream */
              if (mh.channels_thd_stream2) {
                  avctx->channels = truehd_channels(mh.channels_thd_stream2);
 -                avctx->channel_layout = truehd_layout(mh.channels_thd_stream2);
 +                avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream2);
              } else {
                  avctx->channels = truehd_channels(mh.channels_thd_stream1);
 -                avctx->channel_layout = truehd_layout(mh.channels_thd_stream1);
 +                avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream1);
              }
          }
  
diff --combined libavcodec/mlpdec.c
index 9e59b923426ce197785b78b91af6fd8777eb3a0a,cefd0b5614e5d4f2dcf2c19f196ce61400c7916b..0396423b92bd8d8a53c09b1ba9e3242690c1f1ef
@@@ -2,20 -2,20 +2,20 @@@
   * MLP decoder
   * Copyright (c) 2007-2008 Ian Caulfield
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -41,7 -41,7 +41,7 @@@
  
  static const char* sample_message =
      "Please file a bug report following the instructions at "
 -    "http://libav.org/bugreports.html and include "
 +    "http://ffmpeg.org/bugreports.html and include "
      "a sample of this file.";
  
  typedef struct SubStream {
@@@ -133,9 -133,6 +133,9 @@@ typedef struct MLPDecodeContext 
      //! Index of the last substream to decode - further substreams are skipped.
      uint8_t     max_decoded_substream;
  
 +    //! Stream needs channel reordering to comply with FFmpeg's channel order
 +    uint8_t     needs_reordering;
 +
      //! number of PCM samples contained in each frame
      int         access_unit_size;
      //! next power of two above the number of samples in each frame
@@@ -217,7 -214,7 +217,7 @@@ static inline int read_huff_channels(ML
                              VLC_BITS, (9 + VLC_BITS - 1) / VLC_BITS);
  
          if (result < 0)
-             return -1;
+             return AVERROR_INVALIDDATA;
  
          if (lsb_bits > 0)
              result = (result << lsb_bits) + get_bits(gbp, lsb_bits);
@@@ -253,61 -250,61 +253,61 @@@ static av_cold int mlp_decode_init(AVCo
  static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb)
  {
      MLPHeaderInfo mh;
-     int substr;
+     int substr, ret;
  
-     if (ff_mlp_read_major_sync(m->avctx, &mh, gb) != 0)
-         return -1;
+     if ((ret = ff_mlp_read_major_sync(m->avctx, &mh, gb)) != 0)
+         return ret;
  
      if (mh.group1_bits == 0) {
          av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown bits per sample\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (mh.group2_bits > mh.group1_bits) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Channel group 2 cannot have more bits per sample than group 1.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (mh.group2_samplerate && mh.group2_samplerate != mh.group1_samplerate) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Channel groups with differing sample rates are not currently supported.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (mh.group1_samplerate == 0) {
          av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown sampling rate\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (mh.group1_samplerate > MAX_SAMPLERATE) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Sampling rate %d is greater than the supported maximum (%d).\n",
                 mh.group1_samplerate, MAX_SAMPLERATE);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (mh.access_unit_size > MAX_BLOCKSIZE) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Block size %d is greater than the supported maximum (%d).\n",
                 mh.access_unit_size, MAX_BLOCKSIZE);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (mh.access_unit_size_pow2 > MAX_BLOCKSIZE_POW2) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Block size pow2 %d is greater than the supported maximum (%d).\n",
                 mh.access_unit_size_pow2, MAX_BLOCKSIZE_POW2);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (mh.num_substreams == 0)
-         return -1;
+         return AVERROR_INVALIDDATA;
      if (m->avctx->codec_id == CODEC_ID_MLP && mh.num_substreams > 2) {
          av_log(m->avctx, AV_LOG_ERROR, "MLP only supports up to 2 substreams.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (mh.num_substreams > MAX_SUBSTREAMS) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Number of substreams %d is larger than the maximum supported "
                 "by the decoder. %s\n", mh.num_substreams, sample_message);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      m->access_unit_size      = mh.access_unit_size;
      for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
          m->substream[substr].restart_seen = 0;
  
 +    if (mh.stream_type == 0xbb) {
 +        /* MLP stream */
 +        m->avctx->channel_layout = ff_mlp_layout[mh.channels_mlp];
 +    } else { /* mh.stream_type == 0xba */
 +        /* TrueHD stream */
 +        if (mh.channels_thd_stream2) {
 +            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream2);
 +        } else {
 +            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream1);
 +        }
 +        if (m->avctx->channels &&
 +            !m->avctx->request_channels && !m->avctx->request_channel_layout &&
 +            av_get_channel_layout_nb_channels(m->avctx->channel_layout) != m->avctx->channels) {
 +            m->avctx->channel_layout = 0;
 +            av_log_ask_for_sample(m->avctx, "Unknown channel layout.");
 +        }
 +    }
 +
 +    m->needs_reordering = mh.channels_mlp >= 18 && mh.channels_mlp <= 20;
 +
      return 0;
  }
  
@@@ -374,14 -351,14 +374,14 @@@ static int read_restart_header(MLPDecod
      if (sync_word != 0x31ea >> 1) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "restart header sync incorrect (got 0x%04x)\n", sync_word);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      s->noise_type = get_bits1(gbp);
  
      if (m->avctx->codec_id == CODEC_ID_MLP && s->noise_type) {
          av_log(m->avctx, AV_LOG_ERROR, "MLP must have 0x31ea sync word.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      skip_bits(gbp, 16); /* Output timestamp */
          av_log(m->avctx, AV_LOG_ERROR,
                 "Max matrix channel cannot be greater than %d.\n",
                 max_matrix_channel);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (s->max_channel != s->max_matrix_channel) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Max channel must be equal max matrix channel.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      /* This should happen for TrueHD streams with >6 channels and MLP's noise
          av_log(m->avctx, AV_LOG_ERROR,
                 "Number of channels %d is larger than the maximum supported "
                 "by the decoder. %s\n", s->max_channel+2, sample_message);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (s->min_channel > s->max_channel) {
          av_log(m->avctx, AV_LOG_ERROR,
                 "Substream min channel cannot be greater than max channel.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (m->avctx->request_channels > 0
              av_log(m->avctx, AV_LOG_ERROR,
                     "Assignment of matrix channel %d to invalid output channel %d. %s\n",
                     ch, ch_assign, sample_message);
-             return -1;
+             return AVERROR_INVALIDDATA;
          }
          s->ch_assign[ch_assign] = ch;
      }
  
 +    if (m->avctx->codec_id == CODEC_ID_MLP && m->needs_reordering) {
 +        if (m->avctx->channel_layout == (AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY) ||
 +            m->avctx->channel_layout == AV_CH_LAYOUT_5POINT0_BACK) {
 +            int i = s->ch_assign[4];
 +            s->ch_assign[4] = s->ch_assign[3];
 +            s->ch_assign[3] = s->ch_assign[2];
 +            s->ch_assign[2] = i;
 +        } else if (m->avctx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) {
 +            FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
 +            FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
 +        }
 +    }
 +    if (m->avctx->codec_id == CODEC_ID_TRUEHD &&
 +        m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1) {
 +        FFSWAP(int, s->ch_assign[4], s->ch_assign[6]);
 +        FFSWAP(int, s->ch_assign[5], s->ch_assign[7]);
 +    }
 +
      checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
  
      if (checksum != get_bits(gbp, 8))
@@@ -528,7 -487,7 +528,7 @@@ static int read_filter_params(MLPDecode
  
      if (m->filter_changed[channel][filter]++ > 1) {
          av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      order = get_bits(gbp, 4);
          av_log(m->avctx, AV_LOG_ERROR,
                 "%cIR filter order %d is greater than maximum %d.\n",
                 fchar, order, max_order);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      fp->order = order;
  
              av_log(m->avctx, AV_LOG_ERROR,
                     "%cIR filter coeff_bits must be between 1 and 16.\n",
                     fchar);
-             return -1;
+             return AVERROR_INVALIDDATA;
          }
          if (coeff_bits + coeff_shift > 16) {
              av_log(m->avctx, AV_LOG_ERROR,
                     "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
                     fchar);
-             return -1;
+             return AVERROR_INVALIDDATA;
          }
  
          for (i = 0; i < order; i++)
              if (filter == FIR) {
                  av_log(m->avctx, AV_LOG_ERROR,
                         "FIR filter has state data specified.\n");
-                 return -1;
+                 return AVERROR_INVALIDDATA;
              }
  
              state_bits  = get_bits(gbp, 4);
@@@ -598,7 -557,7 +598,7 @@@ static int read_matrix_params(MLPDecode
  
      if (m->matrix_changed++ > 1) {
          av_log(m->avctx, AV_LOG_ERROR, "Matrices may change only once per access unit.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      s->num_primitive_matrices = get_bits(gbp, 4);
          av_log(m->avctx, AV_LOG_ERROR,
                 "Number of primitive matrices cannot be greater than %d.\n",
                 max_primitive_matrices);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      for (mat = 0; mat < s->num_primitive_matrices; mat++) {
              av_log(m->avctx, AV_LOG_ERROR,
                      "Invalid channel %d specified as output from matrix.\n",
                      s->matrix_out_ch[mat]);
-             return -1;
+             return AVERROR_INVALIDDATA;
          }
          if (frac_bits > 14) {
              av_log(m->avctx, AV_LOG_ERROR,
                      "Too many fractional bits specified.\n");
-             return -1;
+             return AVERROR_INVALIDDATA;
          }
  
          max_chan = s->max_matrix_channel;
@@@ -658,27 -617,28 +658,28 @@@ static int read_channel_params(MLPDecod
      ChannelParams *cp = &s->channel_params[ch];
      FilterParams *fir = &cp->filter_params[FIR];
      FilterParams *iir = &cp->filter_params[IIR];
+     int ret;
  
      if (s->param_presence_flags & PARAM_FIR)
          if (get_bits1(gbp))
-             if (read_filter_params(m, gbp, substr, ch, FIR) < 0)
-                 return -1;
+             if ((ret = read_filter_params(m, gbp, substr, ch, FIR)) < 0)
+                 return ret;
  
      if (s->param_presence_flags & PARAM_IIR)
          if (get_bits1(gbp))
-             if (read_filter_params(m, gbp, substr, ch, IIR) < 0)
-                 return -1;
+             if ((ret = read_filter_params(m, gbp, substr, ch, IIR)) < 0)
+                 return ret;
  
      if (fir->order + iir->order > 8) {
          av_log(m->avctx, AV_LOG_ERROR, "Total filter orders too high.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      if (fir->order && iir->order &&
          fir->shift != iir->shift) {
          av_log(m->avctx, AV_LOG_ERROR,
                  "FIR and IIR filters must use the same precision.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      /* The FIR and IIR filters must have the same precision.
       * To simplify the filtering code, only the precision of the
  
      if (cp->huff_lsbs > 24) {
          av_log(m->avctx, AV_LOG_ERROR, "Invalid huff_lsbs.\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
@@@ -713,6 -673,7 +714,7 @@@ static int read_decoding_params(MLPDeco
  {
      SubStream *s = &m->substream[substr];
      unsigned int ch;
+     int ret;
  
      if (s->param_presence_flags & PARAM_PRESENCE)
          if (get_bits1(gbp))
              if (s->blocksize < 8 || s->blocksize > m->access_unit_size) {
                  av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.");
                  s->blocksize = 0;
-                 return -1;
+                 return AVERROR_INVALIDDATA;
              }
          }
  
      if (s->param_presence_flags & PARAM_MATRIX)
          if (get_bits1(gbp))
-             if (read_matrix_params(m, substr, gbp) < 0)
-                 return -1;
+             if ((ret = read_matrix_params(m, substr, gbp)) < 0)
+                 return ret;
  
      if (s->param_presence_flags & PARAM_OUTSHIFT)
          if (get_bits1(gbp))
  
      for (ch = s->min_channel; ch <= s->max_channel; ch++)
          if (get_bits1(gbp))
-             if (read_channel_params(m, substr, gbp, ch) < 0)
-                 return -1;
+             if ((ret = read_channel_params(m, substr, gbp, ch)) < 0)
+                 return ret;
  
      return 0;
  }
@@@ -793,6 -754,7 +795,7 @@@ static int read_block_data(MLPDecodeCon
  {
      SubStream *s = &m->substream[substr];
      unsigned int i, ch, expected_stream_pos = 0;
+     int ret;
  
      if (s->data_check_present) {
          expected_stream_pos  = get_bits_count(gbp);
  
      if (s->blockpos + s->blocksize > m->access_unit_size) {
          av_log(m->avctx, AV_LOG_ERROR, "too many audio samples in frame\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      memset(&m->bypassed_lsbs[s->blockpos][0], 0,
             s->blocksize * sizeof(m->bypassed_lsbs[0]));
  
      for (i = 0; i < s->blocksize; i++)
-         if (read_huff_channels(m, gbp, substr, i) < 0)
-             return -1;
+         if ((ret = read_huff_channels(m, gbp, substr, i)) < 0)
+             return ret;
  
      for (ch = s->min_channel; ch <= s->max_channel; ch++)
          filter_channel(m, substr, ch);
@@@ -942,16 -904,26 +945,26 @@@ static void rematrix_channels(MLPDecode
  
  /** Write the audio data into the output buffer. */
  
- static int output_data_internal(MLPDecodeContext *m, unsigned int substr,
-                                 uint8_t *data, unsigned int *data_size, int is32)
+ static int output_data(MLPDecodeContext *m, unsigned int substr,
+                        uint8_t *data, unsigned int *data_size)
  {
      SubStream *s = &m->substream[substr];
      unsigned int i, out_ch = 0;
+     int out_size;
      int32_t *data_32 = (int32_t*) data;
      int16_t *data_16 = (int16_t*) data;
+     int is32 = (m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
  
-     if (*data_size < (s->max_channel + 1) * s->blockpos * (is32 ? 4 : 2))
-         return -1;
+     if (m->avctx->channels != s->max_matrix_channel + 1) {
+         av_log(m->avctx, AV_LOG_ERROR, "channel count mismatch\n");
+         return AVERROR_INVALIDDATA;
+     }
+     out_size = s->blockpos * m->avctx->channels *
+                av_get_bytes_per_sample(m->avctx->sample_fmt);
+     if (*data_size < out_size)
+         return AVERROR(EINVAL);
  
      for (i = 0; i < s->blockpos; i++) {
          for (out_ch = 0; out_ch <= s->max_matrix_channel; out_ch++) {
          }
      }
  
-     *data_size = i * out_ch * (is32 ? 4 : 2);
+     *data_size = out_size;
  
      return 0;
  }
  
- static int output_data(MLPDecodeContext *m, unsigned int substr,
-                        uint8_t *data, unsigned int *data_size)
- {
-     if (m->avctx->sample_fmt == AV_SAMPLE_FMT_S32)
-         return output_data_internal(m, substr, data, data_size, 1);
-     else
-         return output_data_internal(m, substr, data, data_size, 0);
- }
  /** Read an access unit from the stream.
   *  @return negative on error, 0 if not enough data is present in the input stream,
   *  otherwise the number of bytes consumed. */
@@@ -997,6 -959,7 +1000,7 @@@ static int read_access_unit(AVCodecCont
      uint8_t substream_parity_present[MAX_SUBSTREAMS];
      uint16_t substream_data_len[MAX_SUBSTREAMS];
      uint8_t parity_bits;
+     int ret;
  
      if (buf_size < 4)
          return 0;
      length = (AV_RB16(buf) & 0xfff) * 2;
  
      if (length < 4 || length > buf_size)
-         return -1;
+         return AVERROR_INVALIDDATA;
  
      init_get_bits(&gb, (buf + 4), (length - 4) * 8);
  
              if (!s->restart_seen)
                  goto next_substr;
  
-             if (read_block_data(m, &gb, substr) < 0)
-                 return -1;
+             if ((ret = read_block_data(m, &gb, substr)) < 0)
+                 return ret;
  
              if (get_bits_count(&gb) >= substream_data_len[substr] * 8)
                  goto substream_length_mismatch;
              int shorten_by;
  
              if (get_bits(&gb, 16) != 0xD234)
-                 return -1;
+                 return AVERROR_INVALIDDATA;
  
              shorten_by = get_bits(&gb, 16);
              if      (m->avctx->codec_id == CODEC_ID_TRUEHD && shorten_by  & 0x2000)
                  s->blockpos -= FFMIN(shorten_by & 0x1FFF, s->blockpos);
              else if (m->avctx->codec_id == CODEC_ID_MLP    && shorten_by != 0xD234)
-                 return -1;
+                 return AVERROR_INVALIDDATA;
  
              if (substr == m->max_decoded_substream)
                  av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n");
@@@ -1164,18 -1127,18 +1168,18 @@@ next_substr
  
      rematrix_channels(m, m->max_decoded_substream);
  
-     if (output_data(m, m->max_decoded_substream, data, data_size) < 0)
-         return -1;
+     if ((ret = output_data(m, m->max_decoded_substream, data, data_size)) < 0)
+         return ret;
  
      return length;
  
  substream_length_mismatch:
      av_log(m->avctx, AV_LOG_ERROR, "substream %d length mismatch\n", substr);
-     return -1;
+     return AVERROR_INVALIDDATA;
  
  error:
      m->params_valid = 0;
-     return -1;
+     return AVERROR_INVALIDDATA;
  }
  
  AVCodec ff_mlp_decoder = {
diff --combined libavcodec/pcm.c
index c4928290c4090752a92c47c3e21e8e5d703c3d20,66edfba0f23d457c67f1e59d44586f2f089b606f..0c18e0f0d73581d44cba810d37d1afdb60c0e645
@@@ -2,20 -2,20 +2,20 @@@
   * PCM codecs
   * Copyright (c) 2001 Fabrice Bellard
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -236,7 -236,7 +236,7 @@@ static av_cold int pcm_decode_init(AVCo
  
  /**
   * Read PCM samples macro
-  * @param type Datatype of native machine format
+  * @param size Data size of native machine format
   * @param endian bytestream_get_xxx() endian suffix
   * @param src Source pointer (variable name)
   * @param dst Destination pointer (variable name)
   * @param shift Bitshift (bits)
   * @param offset Sample value offset
   */
- #define DECODE(type, endian, src, dst, n, shift, offset) \
-     dst_##type = (type*)dst; \
+ #define DECODE(size, endian, src, dst, n, shift, offset) \
      for(;n>0;n--) { \
-         register type v = bytestream_get_##endian(&src); \
-         *dst_##type++ = (v - offset) << shift; \
-     } \
-     dst = (short*)dst_##type;
+         uint##size##_t v = bytestream_get_##endian(&src); \
+         AV_WN##size##A(dst, (v - offset) << shift); \
+         dst += size / 8; \
+     }
  
  static int pcm_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
      int buf_size = avpkt->size;
      PCMDecode *s = avctx->priv_data;
      int sample_size, c, n, i;
-     short *samples;
+     uint8_t *samples;
      const uint8_t *src, *src8, *src2[MAX_CHANNELS];
-     uint8_t *dstu8;
-     int16_t *dst_int16_t;
      int32_t *dst_int32_t;
-     int64_t *dst_int64_t;
-     uint16_t *dst_uint16_t;
-     uint32_t *dst_uint32_t;
  
      samples = data;
      src = buf;
  
      switch(avctx->codec->id) {
      case CODEC_ID_PCM_U32LE:
-         DECODE(uint32_t, le32, src, samples, n, 0, 0x80000000)
+         DECODE(32, le32, src, samples, n, 0, 0x80000000)
          break;
      case CODEC_ID_PCM_U32BE:
-         DECODE(uint32_t, be32, src, samples, n, 0, 0x80000000)
+         DECODE(32, be32, src, samples, n, 0, 0x80000000)
          break;
      case CODEC_ID_PCM_S24LE:
-         DECODE(int32_t, le24, src, samples, n, 8, 0)
+         DECODE(32, le24, src, samples, n, 8, 0)
          break;
      case CODEC_ID_PCM_S24BE:
-         DECODE(int32_t, be24, src, samples, n, 8, 0)
+         DECODE(32, be24, src, samples, n, 8, 0)
          break;
      case CODEC_ID_PCM_U24LE:
-         DECODE(uint32_t, le24, src, samples, n, 8, 0x800000)
+         DECODE(32, le24, src, samples, n, 8, 0x800000)
          break;
      case CODEC_ID_PCM_U24BE:
-         DECODE(uint32_t, be24, src, samples, n, 8, 0x800000)
+         DECODE(32, be24, src, samples, n, 8, 0x800000)
          break;
      case CODEC_ID_PCM_S24DAUD:
          for(;n>0;n--) {
            uint32_t v = bytestream_get_be24(&src);
            v >>= 4; // sync flags are here
-           *samples++ = av_reverse[(v >> 8) & 0xff] +
-                        (av_reverse[v & 0xff] << 8);
+           AV_WN16A(samples, av_reverse[(v >> 8) & 0xff] +
+                            (av_reverse[v & 0xff] << 8));
+           samples += 2;
          }
          break;
      case CODEC_ID_PCM_S16LE_PLANAR:
          for(c=0;c<avctx->channels;c++)
              src2[c] = &src[c*n*2];
          for(;n>0;n--)
-             for(c=0;c<avctx->channels;c++)
-                 *samples++ = bytestream_get_le16(&src2[c]);
+             for(c=0;c<avctx->channels;c++) {
+                 AV_WN16A(samples, bytestream_get_le16(&src2[c]));
+                 samples += 2;
+             }
          src = src2[avctx->channels-1];
          break;
      case CODEC_ID_PCM_U16LE:
-         DECODE(uint16_t, le16, src, samples, n, 0, 0x8000)
+         DECODE(16, le16, src, samples, n, 0, 0x8000)
          break;
      case CODEC_ID_PCM_U16BE:
-         DECODE(uint16_t, be16, src, samples, n, 0, 0x8000)
+         DECODE(16, be16, src, samples, n, 0, 0x8000)
          break;
      case CODEC_ID_PCM_S8:
-         dstu8= (uint8_t*)samples;
          for(;n>0;n--) {
-             *dstu8++ = *src++ + 128;
+             *samples++ = *src++ + 128;
          }
-         samples= (short*)dstu8;
          break;
  #if HAVE_BIGENDIAN
      case CODEC_ID_PCM_F64LE:
-         DECODE(int64_t, le64, src, samples, n, 0, 0)
+         DECODE(64, le64, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_S32LE:
      case CODEC_ID_PCM_F32LE:
-         DECODE(int32_t, le32, src, samples, n, 0, 0)
+         DECODE(32, le32, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_S16LE:
-         DECODE(int16_t, le16, src, samples, n, 0, 0)
+         DECODE(16, le16, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_F64BE:
      case CODEC_ID_PCM_F32BE:
      case CODEC_ID_PCM_S16BE:
  #else
      case CODEC_ID_PCM_F64BE:
-         DECODE(int64_t, be64, src, samples, n, 0, 0)
+         DECODE(64, be64, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_F32BE:
      case CODEC_ID_PCM_S32BE:
-         DECODE(int32_t, be32, src, samples, n, 0, 0)
+         DECODE(32, be32, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_S16BE:
-         DECODE(int16_t, be16, src, samples, n, 0, 0)
+         DECODE(16, be16, src, samples, n, 0, 0)
          break;
      case CODEC_ID_PCM_F64LE:
      case CODEC_ID_PCM_F32LE:
      case CODEC_ID_PCM_U8:
          memcpy(samples, src, n*sample_size);
          src += n*sample_size;
-         samples = (short*)((uint8_t*)data + n*sample_size);
+         samples += n * sample_size;
          break;
      case CODEC_ID_PCM_ZORK:
          for(;n>0;n--) {
              int x= *src++;
              if(x&128) x-= 128;
              else      x = -x;
-             *samples++ = x << 8;
+             AV_WN16A(samples, x << 8);
+             samples += 2;
          }
          break;
      case CODEC_ID_PCM_ALAW:
      case CODEC_ID_PCM_MULAW:
          for(;n>0;n--) {
-             *samples++ = s->table[*src++];
+             AV_WN16A(samples, s->table[*src++]);
+             samples += 2;
          }
          break;
      case CODEC_ID_PCM_DVD:
              }
              break;
          default:
 -            av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n");
 +            av_log(avctx, AV_LOG_ERROR,
 +                   "PCM DVD unsupported sample depth %i\n",
 +                   avctx->bits_per_coded_sample);
              return -1;
          }
-         samples = (short *) dst_int32_t;
+         samples = (uint8_t *) dst_int32_t;
          break;
      case CODEC_ID_PCM_LXF:
          dst_int32_t = data;
              }
          }
          src += n * avctx->channels * 5;
-         samples = (short *) dst_int32_t;
+         samples = (uint8_t *) dst_int32_t;
          break;
      default:
          return -1;
      }
-     *data_size = (uint8_t *)samples - (uint8_t *)data;
+     *data_size = samples - (uint8_t *)data;
      return src - buf;
  }
  
diff --combined libavcodec/shorten.c
index ebc429036f1ce2934ae60ac4bf5c7688c43d84cf,dd1bef8a181973bed9b797cdae23f15dbf950788..15afc42a61af80b085558f5e001563a2ab36d58c
@@@ -2,20 -2,20 +2,20 @@@
   * Shorten decoder
   * Copyright (c) 2005 Jeff Muizelaar
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -534,13 -534,6 +534,6 @@@ static av_cold int shorten_decode_close
      return 0;
  }
  
- static void shorten_flush(AVCodecContext *avctx){
-     ShortenContext *s = avctx->priv_data;
-     s->bitstream_size=
-         s->bitstream_index= 0;
- }
  AVCodec ff_shorten_decoder = {
      .name           = "shorten",
      .type           = AVMEDIA_TYPE_AUDIO,
      .init           = shorten_decode_init,
      .close          = shorten_decode_close,
      .decode         = shorten_decode_frame,
-     .flush= shorten_flush,
      .long_name= NULL_IF_CONFIG_SMALL("Shorten"),
  };
diff --combined libavcodec/truespeech.c
index 1b98b140b9281bd860dfdb41433260f5769ceeb9,7747fca6b20fe75b947d02100c14bcf988c0ab21..8cd05145dbf98e6d8a5813878b2ed9a3a7d829a5
@@@ -2,25 -2,27 +2,27 @@@
   * DSP Group TrueSpeech compatible decoder
   * Copyright (c) 2005 Konstantin Shishkov
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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 "libavutil/intreadwrite.h"
  #include "avcodec.h"
+ #include "dsputil.h"
+ #include "get_bits.h"
  
  #include "truespeech_data.h"
  /**
@@@ -32,7 -34,9 +34,9 @@@
   * TrueSpeech decoder context
   */
  typedef struct {
+     DSPContext dsp;
      /* input data */
+     uint8_t buffer[32];
      int16_t vector[8];  ///< input vector: 5/5/4/4/4/3/3/3
      int offset1[2];     ///< 8-bit value, used in one copying offset
      int offset2[4];     ///< 7-bit value, encodes offsets for copying and for two-point filter
  
  static av_cold int truespeech_decode_init(AVCodecContext * avctx)
  {
- //    TSContext *c = avctx->priv_data;
+     TSContext *c = avctx->priv_data;
+     if (avctx->channels != 1) {
+         av_log_ask_for_sample(avctx, "Unsupported channel count: %d\n", avctx->channels);
+         return AVERROR(EINVAL);
+     }
  
      avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+     dsputil_init(&c->dsp, avctx);
      return 0;
  }
  
  static void truespeech_read_frame(TSContext *dec, const uint8_t *input)
  {
-     uint32_t t;
-     /* first dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->flag = t & 1;
-     dec->vector[0] = ts_codebook[0][(t >>  1) & 0x1F];
-     dec->vector[1] = ts_codebook[1][(t >>  6) & 0x1F];
-     dec->vector[2] = ts_codebook[2][(t >> 11) &  0xF];
-     dec->vector[3] = ts_codebook[3][(t >> 15) &  0xF];
-     dec->vector[4] = ts_codebook[4][(t >> 19) &  0xF];
-     dec->vector[5] = ts_codebook[5][(t >> 23) &  0x7];
-     dec->vector[6] = ts_codebook[6][(t >> 26) &  0x7];
-     dec->vector[7] = ts_codebook[7][(t >> 29) &  0x7];
-     /* second dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->offset2[0] = (t >>  0) & 0x7F;
-     dec->offset2[1] = (t >>  7) & 0x7F;
-     dec->offset2[2] = (t >> 14) & 0x7F;
-     dec->offset2[3] = (t >> 21) & 0x7F;
-     dec->offset1[0] = ((t >> 28) & 0xF) << 4;
-     /* third dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulseval[0] = (t >>  0) & 0x3FFF;
-     dec->pulseval[1] = (t >> 14) & 0x3FFF;
-     dec->offset1[1] = (t >> 28) & 0x0F;
-     /* fourth dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulseval[2] = (t >>  0) & 0x3FFF;
-     dec->pulseval[3] = (t >> 14) & 0x3FFF;
-     dec->offset1[1] |= ((t >> 28) & 0x0F) << 4;
-     /* fifth dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF;
-     dec->pulseoff[0] = (t >> 0) & 0xF;
-     dec->offset1[0] |= (t >> 31) & 1;
-     /* sixth dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF;
-     dec->pulseoff[1] = (t >> 0) & 0xF;
-     dec->offset1[0] |= ((t >> 31) & 1) << 1;
-     /* seventh dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF;
-     dec->pulseoff[2] = (t >> 0) & 0xF;
-     dec->offset1[0] |= ((t >> 31) & 1) << 2;
-     /* eighth dword */
-     t = AV_RL32(input);
-     input += 4;
-     dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF;
-     dec->pulseoff[3] = (t >> 0) & 0xF;
-     dec->offset1[0] |= ((t >> 31) & 1) << 3;
+     GetBitContext gb;
+     dec->dsp.bswap_buf((uint32_t *)dec->buffer, (const uint32_t *)input, 8);
+     init_get_bits(&gb, dec->buffer, 32 * 8);
+     dec->vector[7] = ts_codebook[7][get_bits(&gb, 3)];
+     dec->vector[6] = ts_codebook[6][get_bits(&gb, 3)];
+     dec->vector[5] = ts_codebook[5][get_bits(&gb, 3)];
+     dec->vector[4] = ts_codebook[4][get_bits(&gb, 4)];
+     dec->vector[3] = ts_codebook[3][get_bits(&gb, 4)];
+     dec->vector[2] = ts_codebook[2][get_bits(&gb, 4)];
+     dec->vector[1] = ts_codebook[1][get_bits(&gb, 5)];
+     dec->vector[0] = ts_codebook[0][get_bits(&gb, 5)];
+     dec->flag      = get_bits1(&gb);
+     dec->offset1[0] = get_bits(&gb, 4) << 4;
+     dec->offset2[3] = get_bits(&gb, 7);
+     dec->offset2[2] = get_bits(&gb, 7);
+     dec->offset2[1] = get_bits(&gb, 7);
+     dec->offset2[0] = get_bits(&gb, 7);
+     dec->offset1[1]  = get_bits(&gb, 4);
+     dec->pulseval[1] = get_bits(&gb, 14);
+     dec->pulseval[0] = get_bits(&gb, 14);
+     dec->offset1[1] |= get_bits(&gb, 4) << 4;
+     dec->pulseval[3] = get_bits(&gb, 14);
+     dec->pulseval[2] = get_bits(&gb, 14);
+     dec->offset1[0] |= get_bits1(&gb);
+     dec->pulsepos[0] = get_bits_long(&gb, 27);
+     dec->pulseoff[0] = get_bits(&gb, 4);
+     dec->offset1[0] |= get_bits1(&gb) << 1;
+     dec->pulsepos[1] = get_bits_long(&gb, 27);
+     dec->pulseoff[1] = get_bits(&gb, 4);
+     dec->offset1[0] |= get_bits1(&gb) << 2;
+     dec->pulsepos[2] = get_bits_long(&gb, 27);
+     dec->pulseoff[2] = get_bits(&gb, 4);
+     dec->offset1[0] |= get_bits1(&gb) << 3;
+     dec->pulsepos[3] = get_bits_long(&gb, 27);
+     dec->pulseoff[3] = get_bits(&gb, 4);
  }
  
  static void truespeech_correlate_filter(TSContext *dec)
  
      for(i = 0; i < 8; i++){
          if(i > 0){
-             memcpy(tmp, dec->cvector, i * 2);
+             memcpy(tmp, dec->cvector, i * sizeof(*tmp));
              for(j = 0; j < i; j++)
                  dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) +
                                     (dec->cvector[j] << 15) + 0x4000) >> 15;
@@@ -199,7 -169,7 +169,7 @@@ static void truespeech_apply_twopoint_f
  
      t = dec->offset2[quart];
      if(t == 127){
-         memset(dec->newvec, 0, 60 * 2);
+         memset(dec->newvec, 0, 60 * sizeof(*dec->newvec));
          return;
      }
      for(i = 0; i < 146; i++)
@@@ -224,7 -194,7 +194,7 @@@ static void truespeech_place_pulses(TSC
      int16_t *ptr2;
      int coef;
  
-     memset(out, 0, 60 * 2);
+     memset(out, 0, 60 * sizeof(*out));
      for(i = 0; i < 7; i++) {
          t = dec->pulseval[quart] & 3;
          dec->pulseval[quart] >>= 2;
@@@ -340,45 -310,45 +310,45 @@@ static int truespeech_decode_frame(AVCo
  
      int i, j;
      short *samples = data;
-     int consumed = 0;
-     int16_t out_buf[240];
-     int iterations;
+     int iterations, out_size;
  
-     if (!buf_size)
-         return 0;
+     iterations = buf_size / 32;
  
-     if (buf_size < 32) {
+     if (!iterations) {
          av_log(avctx, AV_LOG_ERROR,
                 "Too small input buffer (%d bytes), need at least 32 bytes\n", buf_size);
          return -1;
      }
-     iterations = FFMIN(buf_size / 32, *data_size / 480);
+     out_size = iterations * 240 * av_get_bytes_per_sample(avctx->sample_fmt);
+     if (*data_size < out_size) {
+         av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
+         return AVERROR(EINVAL);
+     }
+     memset(samples, 0, out_size);
      for(j = 0; j < iterations; j++) {
-         truespeech_read_frame(c, buf + consumed);
-         consumed += 32;
+         truespeech_read_frame(c, buf);
+         buf += 32;
  
          truespeech_correlate_filter(c);
          truespeech_filters_merge(c);
  
-         memset(out_buf, 0, 240 * 2);
          for(i = 0; i < 4; i++) {
              truespeech_apply_twopoint_filter(c, i);
-             truespeech_place_pulses(c, out_buf + i * 60, i);
-             truespeech_update_filters(c, out_buf + i * 60, i);
-             truespeech_synth(c, out_buf + i * 60, i);
+             truespeech_place_pulses  (c, samples, i);
+             truespeech_update_filters(c, samples, i);
+             truespeech_synth         (c, samples, i);
+             samples += 60;
          }
  
          truespeech_save_prevvec(c);
-         /* finally output decoded frame */
-         for(i = 0; i < 240; i++)
-             *samples++ = out_buf[i];
      }
  
-     *data_size = consumed * 15;
+     *data_size = out_size;
  
-     return consumed;
+     return buf_size;
  }
  
  AVCodec ff_truespeech_decoder = {
diff --combined libavcodec/vc1.c
index d715ffefe8e8d2d177e19202fcc1b9587828fc23,cb228e610787e913415490aa9911e8b2afdea9cd..7c4eb2e1570c6d13baa410c6e0c8b6089786dcfd
@@@ -4,20 -4,20 +4,20 @@@
   * Copyright (c) 2006-2007 Konstantin Shishkov
   * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -380,9 -380,8 +380,9 @@@ int vc1_decode_sequence_header(AVCodecC
      v->finterpflag = get_bits1(gb); //common
  
      if (v->res_sprite) {
 -        v->s.avctx->width  = v->s.avctx->coded_width  = get_bits(gb, 11);
 -        v->s.avctx->height = v->s.avctx->coded_height = get_bits(gb, 11);
 +        int w = get_bits(gb, 11);
 +        int h = get_bits(gb, 11);
 +        avcodec_set_dimensions(v->s.avctx, w, h);
          skip_bits(gb, 5); //frame rate
          v->res_x8 = get_bits1(gb);
          if (get_bits1(gb)) { // something to do with DC VLC selection
  
  static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
  {
 +    int w, h;
      v->res_rtm_flag = 1;
      v->level = get_bits(gb, 3);
      if (v->level >= 5) {
      v->bitrtq_postproc       = get_bits(gb, 5); //common
      v->postprocflag          = get_bits1(gb);   //common
  
 -    v->s.avctx->coded_width  = (get_bits(gb, 12) + 1) << 1;
 -    v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
 -    v->s.avctx->width        = v->s.avctx->coded_width;
 -    v->s.avctx->height       = v->s.avctx->coded_height;
 +    w = (get_bits(gb, 12) + 1) << 1;
 +    h = (get_bits(gb, 12) + 1) << 1;
 +    avcodec_set_dimensions(v->s.avctx, w, h);
      v->broadcast             = get_bits1(gb);
      v->interlace             = get_bits1(gb);
      v->tfcntrflag            = get_bits1(gb);
@@@ -548,10 -547,9 +548,10 @@@ int vc1_decode_entry_point(AVCodecConte
          }
      }
  
 -    if (get_bits1(gb)) {
 -        avctx->width  = avctx->coded_width  = (get_bits(gb, 12) + 1) << 1;
 -        avctx->height = avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
 +    if(get_bits1(gb)){
 +        int w = (get_bits(gb, 12)+1)<<1;
 +        int h = (get_bits(gb, 12)+1)<<1;
 +        avcodec_set_dimensions(avctx, w, h);
      }
      if (v->extended_mv)
          v->extended_dmv = get_bits1(gb);
@@@ -824,9 -822,6 +824,9 @@@ int vc1_parse_frame_header_adv(VC1Conte
      int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
      int scale, shift, i; /* for initializing LUT for intensity compensation */
  
 +    v->numref=0;
 +    v->fcm=0;
 +    v->field_mode=0;
      v->p_frame_skipped = 0;
      if (v->second_field) {
          v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
              goto parse_common_info;
      }
  
+     v->field_mode = 0;
      if (v->interlace) {
          v->fcm = decode012(gb);
          if (v->fcm) {
              if (v->fcm == 2)
                  v->field_mode = 1;
-             else
-                 v->field_mode = 0;
              if (!v->warn_interlaced++)
                  av_log(v->s.avctx, AV_LOG_ERROR,
                         "Interlaced frames/fields support is incomplete\n");
          }
+     } else {
+         v->fcm = 0;
      }
  
      if (v->field_mode) {
  
          if (v->field_mode) {
              int mvmode;
 +            av_log(v->s.avctx, AV_LOG_ERROR, "B Fields do not work currently\n");
 +            return -1;
              if (v->extended_dmv)
                  v->dmvrange = get_unary(gb, 0, 3);
              mvmode = get_unary(gb, 1, 3);
diff --combined libavformat/avformat.h
index c785a13ea7db022abca53f9eb5ffc4e3ab8e4b36,70d466e0d1ed5285b20df14e98c5391918c0a707..49fe08ec60c0a82041b74a113a694a8fd8b2aa9a
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * copyright (c) 2001 Fabrice Bellard
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -53,7 -53,7 +53,7 @@@ struct AVFormatContext
   * @defgroup metadata_api Public Metadata API
   * @{
   * The metadata API allows libavformat to export metadata tags to a client
 - * application using a sequence of key/value pairs. Like all strings in Libav,
 + * application using a sequence of key/value pairs. Like all strings in FFmpeg,
   * metadata must be stored as UTF-8 encoded Unicode. Note that metadata
   * exported by demuxers isn't checked to be valid UTF-8 in most cases.
   * Important concepts to keep in mind:
@@@ -274,9 -274,7 +274,10 @@@ typedef struct AVFormatParameters 
  #define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
  #define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fallback to binary search via read_timestamp */
  #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
- #define AVFMT_TS_NONSTRICT  0x8000 /**< Format does not require strictly
-                                           increasing timestamps, but they must
-                                           still be monotonic */
+ #define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
++#define AVFMT_TS_NONSTRICT  0x8000000 /**< Format does not require strictly
++                                           increasing timestamps, but they must
++                                           still be monotonic */
  
  typedef struct AVOutputFormat {
      const char *name;
       * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS
       */
      int flags;
 -    /**
 -     * Currently only used to set pixel format if not YUV420P.
 -     */
 -    int (*set_parameters)(struct AVFormatContext *, AVFormatParameters *);
 +
 +    void *dummy;
 +
      int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
                               AVPacket *in, int flush);
  
       */
      int (*query_codec)(enum CodecID id, int std_compliance);
  
 +    void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
 +                                 int64_t *dts, int64_t *wall);
 +
      /* private fields */
      struct AVOutputFormat *next;
  } AVOutputFormat;
@@@ -411,7 -407,9 +412,9 @@@ typedef struct AVInputFormat 
                                int64_t *pos, int64_t pos_limit);
  
      /**
-      * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER.
+      * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
+      * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+      * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK.
       */
      int flags;
  
@@@ -469,12 -467,7 +472,12 @@@ enum AVStreamParseType 
  
  typedef struct AVIndexEntry {
      int64_t pos;
 -    int64_t timestamp;
 +    int64_t timestamp;        /**<
 +                               * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available
 +                               * when seeking to this entry. That means preferable PTS on keyframe based formats.
 +                               * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better
 +                               * is known
 +                               */
  #define AVINDEX_KEYFRAME 0x0001
      int flags:2;
      int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment).
@@@ -551,12 -544,10 +554,12 @@@ typedef struct AVStream 
  #endif
  
      /**
 -     * Decoding: pts of the first frame of the stream, in stream time base.
 +     * Decoding: pts of the first frame of the stream in presentation order, in stream time base.
       * Only set this if you are absolutely 100% sure that the value you set
       * it to really is the pts of the first frame.
       * This may be undefined (AV_NOPTS_VALUE).
 +     * @note The ASF header does NOT contain a correct start_time the ASF
 +     * demuxer must NOT set this.
       */
      int64_t start_time;
  
       */
      int codec_info_nb_frames;
  
 +    /**
 +     * Stream Identifier
 +     * This is the MPEG-TS stream identifier +1
 +     * 0 means unknown
 +     */
 +    int stream_identifier;
 +
      /**
       * Stream informations used internally by av_find_stream_info()
       */
          int64_t last_dts;
          int64_t duration_gcd;
          int duration_count;
 -        double duration_error[MAX_STD_TIMEBASES];
 +        double duration_error[2][2][MAX_STD_TIMEBASES];
          int64_t codec_info_duration;
      } *info;
 +
 +    /**
 +     * flag to indicate that probing is requested
 +     * NOT PART OF PUBLIC API
 +     */
 +    int request_probe;
  } AVStream;
  
  #define AV_PROGRAM_RUNNING 1
@@@ -677,10 -655,6 +680,10 @@@ typedef struct AVProgram 
      unsigned int   *stream_index;
      unsigned int   nb_stream_indexes;
      AVDictionary *metadata;
 +
 +    int program_num;
 +    int pmt_pid;
 +    int pcr_pid;
  } AVProgram;
  
  #define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
@@@ -750,7 -724,7 +753,7 @@@ typedef struct AVFormatContext 
      /**
       * Decoding: total stream bitrate in bit/s, 0 if not
       * available. Never set it directly if the file_size and the
 -     * duration are known as Libav can compute it automatically.
 +     * duration are known as FFmpeg can compute it automatically.
       */
      int bit_rate;
  
  #endif
  #define AVFMT_FLAG_CUSTOM_IO    0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.
  #define AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted
 +#define AVFMT_FLAG_MP4A_LATM    0x8000 ///< Enable RTP MP4A-LATM payload
 +#define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
 +#define AVFMT_FLAG_PRIV_OPT    0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted)
 +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Dont merge side data but keep it seperate.
  
  #if FF_API_LOOP_INPUT
      /**
       * - decoding: Set by user.
       */
      int error_recognition;
 +
 +    /**
 +     * Transport stream id.
 +     * This will be moved into demuxer private options. Thus no API/ABI compatibility
 +     */
 +    int ts_id;
  } AVFormatContext;
  
  typedef struct AVPacketList {
@@@ -1077,15 -1041,6 +1080,15 @@@ AVInputFormat *av_probe_input_format(AV
   */
  AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max);
  
 +/**
 + * Guess the file format.
 + *
 + * @param is_opened Whether the file is already opened; determines whether
 + *                  demuxers with or without AVFMT_NOFILE are probed.
 + * @param score_ret The score of the best detection.
 + */
 +AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret);
 +
  /**
   * Probe a bytestream to determine the input format. Each time a probe returns
   * with a score that is too low, the probe buffer size is increased and another
@@@ -1156,8 -1111,6 +1159,8 @@@ attribute_deprecated int av_open_input_
   */
  int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
  
 +int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap);
 +
  /**
   * Allocate an AVFormatContext.
   * avformat_free_context() can be used to free the context and everything
   */
  AVFormatContext *avformat_alloc_context(void);
  
 +#if FF_API_ALLOC_OUTPUT_CONTEXT
 +/**
 + * @deprecated deprecated in favor of avformat_alloc_output_context2()
 + */
 +attribute_deprecated
 +AVFormatContext *avformat_alloc_output_context(const char *format,
 +                                               AVOutputFormat *oformat,
 +                                               const char *filename);
 +#endif
 +
 +/**
 + * Allocate an AVFormatContext for an output format.
 + * avformat_free_context() can be used to free the context and
 + * everything allocated by the framework within it.
 + *
 + * @param *ctx is set to the created format context, or to NULL in
 + * case of failure
 + * @param oformat format to use for allocating the context, if NULL
 + * format_name and filename are used instead
 + * @param format_name the name of output format to use for allocating the
 + * context, if NULL filename is used instead
 + * @param filename the name of the filename to use for allocating the
 + * context, may be NULL
 + * @return >= 0 in case of success, a negative AVERROR code in case of
 + * failure
 + */
 +int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
 +                                   const char *format_name, const char *filename);
 +
  #if FF_API_FORMAT_PARAMETERS
  /**
   * Read packets of a media file to get stream information. This
@@@ -1237,18 -1161,6 +1240,18 @@@ int av_find_stream_info(AVFormatContex
   */
  int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
  
 +/**
 + * Find the programs which belong to a given stream.
 + *
 + * @param ic    media file handle
 + * @param last  the last found program, the search will start after this
 + *              program, or from the beginning if it is NULL
 + * @param s     stream index
 + * @return the next program which belongs to s, NULL if no program is found or
 + *         the last program is not among the programs of ic.
 + */
 +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s);
 +
  /**
   * Find the "best" stream in the file.
   * The best stream is determined according to various heuristics as the most
@@@ -1607,28 -1519,7 +1610,28 @@@ int av_interleave_packet_per_dts(AVForm
   */
  int av_write_trailer(AVFormatContext *s);
  
 +/**
 + * Get timing information for the data currently output.
 + * The exact meaning of "currently output" depends on the format.
 + * It is mostly relevant for devices that have an internal buffer and/or
 + * work in real time.
 + * @param s          media file handle
 + * @param stream     stream in the media file
 + * @param dts[out]   DTS of the last packet output for the stream, in stream
 + *                   time_base units
 + * @param wall[out]  absolute time when that packet whas output,
 + *                   in microsecond
 + * @return  0 if OK, AVERROR(ENOSYS) if the format does not support it
 + * Note: some formats or devices may not allow to measure dts and wall
 + * atomically.
 + */
 +int av_get_output_timestamp(struct AVFormatContext *s, int stream,
 +                            int64_t *dts, int64_t *wall);
 +
  #if FF_API_DUMP_FORMAT
 +/**
 + * @deprecated Deprecated in favor of av_dump_format().
 + */
  attribute_deprecated void dump_format(AVFormatContext *ic,
                                        int index,
                                        const char *url,
diff --combined libavformat/id3v2.c
index 22a2df79e0d09c588faa11a1997a01704d4bdf04,c593007e876bb707f43bc9fe3bc0a0aca93d8bbe..32870648cf87598993499e0075715ac3fe50cdc3
@@@ -1,31 -1,24 +1,31 @@@
  /*
 - * ID3v2 header parser
   * Copyright (c) 2003 Fabrice Bellard
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
 +/**
 + * @file
 + * ID3v2 header parser
 + *
 + * Specifications available at:
 + * http://id3.org/Developer_Information
 + */
 +
  #include "id3v2.h"
  #include "id3v1.h"
  #include "libavutil/avstring.h"
  #include "libavutil/dict.h"
  #include "avio_internal.h"
  
+ const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
+     { "TALB", "album"},
+     { "TCOM", "composer"},
+     { "TCON", "genre"},
+     { "TCOP", "copyright"},
+     { "TENC", "encoded_by"},
+     { "TIT2", "title"},
+     { "TLAN", "language"},
+     { "TPE1", "artist"},
+     { "TPE2", "album_artist"},
+     { "TPE3", "performer"},
+     { "TPOS", "disc"},
+     { "TPUB", "publisher"},
+     { "TRCK", "track"},
+     { "TSSE", "encoder"},
+     { 0 }
+ };
+ const AVMetadataConv ff_id3v2_4_metadata_conv[] = {
+     { "TDRL", "date"},
+     { "TDRC", "date"},
+     { "TDEN", "creation_time"},
+     { "TSOA", "album-sort"},
+     { "TSOP", "artist-sort"},
+     { "TSOT", "title-sort"},
+     { 0 }
+ };
+ static const AVMetadataConv id3v2_2_metadata_conv[] = {
+     { "TAL",  "album"},
+     { "TCO",  "genre"},
+     { "TT2",  "title"},
+     { "TEN",  "encoded_by"},
+     { "TP1",  "artist"},
+     { "TP2",  "album_artist"},
+     { "TP3",  "performer"},
+     { "TRK",  "track"},
+     { 0 }
+ };
+ const char ff_id3v2_tags[][4] = {
+    "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDLY", "TENC", "TEXT",
+    "TFLT", "TIT1", "TIT2", "TIT3", "TKEY", "TLAN", "TLEN", "TMED",
+    "TOAL", "TOFN", "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3",
+    "TPE4", "TPOS", "TPUB", "TRCK", "TRSN", "TRSO", "TSRC", "TSSE",
+    { 0 },
+ };
+ const char ff_id3v2_4_tags[][4] = {
+    "TDEN", "TDOR", "TDRC", "TDRL", "TDTG", "TIPL", "TMCL", "TMOO",
+    "TPRO", "TSOA", "TSOP", "TSOT", "TSST",
+    { 0 },
+ };
+ const char ff_id3v2_3_tags[][4] = {
+    "TDAT", "TIME", "TORY", "TRDA", "TSIZ", "TYER",
+    { 0 },
+ };
  int ff_id3v2_match(const uint8_t *buf, const char * magic)
  {
      return  buf[0]         == magic[0] &&
@@@ -69,9 -122,8 +129,9 @@@ static unsigned int get_size(AVIOContex
  /**
   * Free GEOB type extra metadata.
   */
 -static void free_geobtag(ID3v2ExtraMetaGEOB *geob)
 +static void free_geobtag(void *obj)
  {
 +    ID3v2ExtraMetaGEOB *geob = obj;
      av_free(geob->mime_type);
      av_free(geob->file_name);
      av_free(geob->description);
@@@ -328,6 -380,18 +388,18 @@@ finish
          av_dict_set(m, "date", date, 0);
  }
  
 -    void (*free)();
+ typedef struct ID3v2EMFunc {
+     const char *tag3;
+     const char *tag4;
+     void (*read)(AVFormatContext*, AVIOContext*, int, char*, ID3v2ExtraMeta **);
++    void (*free)(void *);
+ } ID3v2EMFunc;
+ static const ID3v2EMFunc id3v2_extra_meta_funcs[] = {
+     { "GEO", "GEOB", read_geobtag, free_geobtag },
+     { NULL }
+ };
  /**
   * Get the corresponding ID3v2EMFunc struct for a tag.
   * @param isv34 Determines if v2.2 or v2.3/4 strings are used
  static const ID3v2EMFunc *get_extra_meta_func(const char *tag, int isv34)
  {
      int i = 0;
-     while (ff_id3v2_extra_meta_funcs[i].tag3) {
+     while (id3v2_extra_meta_funcs[i].tag3) {
          if (!memcmp(tag,
-                     (isv34 ?
-                         ff_id3v2_extra_meta_funcs[i].tag4 :
-                         ff_id3v2_extra_meta_funcs[i].tag3),
+                     (isv34 ? id3v2_extra_meta_funcs[i].tag4 :
+                              id3v2_extra_meta_funcs[i].tag3),
                      (isv34 ? 4 : 3)))
-             return &ff_id3v2_extra_meta_funcs[i];
+             return &id3v2_extra_meta_funcs[i];
          i++;
      }
-     return &ff_id3v2_extra_meta_funcs[i];
 -    return NULL;
++    return &id3v2_extra_meta_funcs[i];
  }
  
  static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags, ID3v2ExtraMeta **extra_meta)
  {
 -    int isv34, tlen, unsync;
 +    int isv34, unsync;
 +    unsigned tlen;
      char tag[5];
      int64_t next, end = avio_tell(s->pb) + len;
      int taghdrlen;
              tag[3] = 0;
              tlen = avio_rb24(s->pb);
          }
 -        if (tlen < 0 || tlen > len - taghdrlen) {
 -            av_log(s, AV_LOG_WARNING, "Invalid size in frame %s, skipping the rest of tag.\n", tag);
 +        if (tlen > (1<<28))
              break;
 -        }
          len -= taghdrlen + tlen;
 +
 +        if (len < 0)
 +            break;
 +
          next = avio_tell(s->pb) + tlen;
  
          if (!tlen) {
          }
  
          if (tflags & ID3v2_FLAG_DATALEN) {
 +            if (tlen < 4)
 +                break;
              avio_rb32(s->pb);
              tlen -= 4;
          }
@@@ -508,7 -566,7 +579,7 @@@ void ff_id3v2_read_all(AVFormatContext 
          }
      } while (found_header);
      ff_metadata_conv(&s->metadata, NULL, ff_id3v2_34_metadata_conv);
-     ff_metadata_conv(&s->metadata, NULL, ff_id3v2_2_metadata_conv);
+     ff_metadata_conv(&s->metadata, NULL, id3v2_2_metadata_conv);
      ff_metadata_conv(&s->metadata, NULL, ff_id3v2_4_metadata_conv);
      merge_date(&s->metadata);
  }
@@@ -531,68 -589,3 +602,3 @@@ void ff_id3v2_free_extra_meta(ID3v2Extr
          current = next;
      }
  }
- const ID3v2EMFunc ff_id3v2_extra_meta_funcs[] = {
-     { "GEO", "GEOB", read_geobtag, free_geobtag },
-     { NULL,  NULL,   NULL,         NULL }
- };
- const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
-     { "TALB", "album"},
-     { "TCOM", "composer"},
-     { "TCON", "genre"},
-     { "TCOP", "copyright"},
-     { "TENC", "encoded_by"},
-     { "TIT2", "title"},
-     { "TLAN", "language"},
-     { "TPE1", "artist"},
-     { "TPE2", "album_artist"},
-     { "TPE3", "performer"},
-     { "TPOS", "disc"},
-     { "TPUB", "publisher"},
-     { "TRCK", "track"},
-     { "TSSE", "encoder"},
-     { 0 }
- };
- const AVMetadataConv ff_id3v2_4_metadata_conv[] = {
-     { "TDRL", "date"},
-     { "TDRC", "date"},
-     { "TDEN", "creation_time"},
-     { "TSOA", "album-sort"},
-     { "TSOP", "artist-sort"},
-     { "TSOT", "title-sort"},
-     { 0 }
- };
- const AVMetadataConv ff_id3v2_2_metadata_conv[] = {
-     { "TAL",  "album"},
-     { "TCO",  "genre"},
-     { "TT2",  "title"},
-     { "TEN",  "encoded_by"},
-     { "TP1",  "artist"},
-     { "TP2",  "album_artist"},
-     { "TP3",  "performer"},
-     { "TRK",  "track"},
-     { 0 }
- };
- const char ff_id3v2_tags[][4] = {
-    "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDLY", "TENC", "TEXT",
-    "TFLT", "TIT1", "TIT2", "TIT3", "TKEY", "TLAN", "TLEN", "TMED",
-    "TOAL", "TOFN", "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3",
-    "TPE4", "TPOS", "TPUB", "TRCK", "TRSN", "TRSO", "TSRC", "TSSE",
-    { 0 },
- };
- const char ff_id3v2_4_tags[][4] = {
-    "TDEN", "TDOR", "TDRC", "TDRL", "TDTG", "TIPL", "TMCL", "TMOO",
-    "TPRO", "TSOA", "TSOP", "TSOT", "TSST",
-    { 0 },
- };
- const char ff_id3v2_3_tags[][4] = {
-    "TDAT", "TIME", "TORY", "TRDA", "TSIZ", "TYER",
-    { 0 },
- };
diff --combined libavformat/id3v2.h
index 76c00d108ed32ede67ad410778fe131931da958e,4fb738a7649d7f2e8e1177304321c5b7835a2dca..58cacdfeda83410e91a83f12d4796ceba8bd470e
@@@ -2,20 -2,20 +2,20 @@@
   * ID3v2 header parser
   * Copyright (c) 2003 Fabrice Bellard
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -59,13 -59,6 +59,6 @@@ typedef struct ID3v2ExtraMetaGEOB 
      uint8_t *data;
  } ID3v2ExtraMetaGEOB;
  
- typedef struct ID3v2EMFunc {
-     const char *tag3;
-     const char *tag4;
-     void (*read)(AVFormatContext*, AVIOContext*, int, char*, ID3v2ExtraMeta **);
-     void (*free)(void *);
- } ID3v2EMFunc;
  /**
   * Detect ID3v2 Header.
   * @param buf   must be ID3v2_HEADER_SIZE byte long
@@@ -99,11 -92,8 +92,8 @@@ void ff_id3v2_read_all(AVFormatContext 
   */
  void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta);
  
- extern const ID3v2EMFunc ff_id3v2_extra_meta_funcs[];
  extern const AVMetadataConv ff_id3v2_34_metadata_conv[];
  extern const AVMetadataConv ff_id3v2_4_metadata_conv[];
- extern const AVMetadataConv ff_id3v2_2_metadata_conv[];
  
  /**
   * A list of text information frames allowed in both ID3 v2.3 and v2.4
diff --combined libavformat/rawdec.c
index c3be73cf77c0793eeaea85349f205a648d162d28,c4c027ab06f68e32ea9f58c2a6156abe1ec23db3..7726f02708106d7fcc024a43452067c6b99f4db0
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 Fabrice Bellard
   * Copyright (c) 2005 Alex Beregszaszi
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -128,7 -128,6 +128,7 @@@ int ff_raw_audio_read_header(AVFormatCo
      st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
      st->codec->codec_id = s->iformat->value;
      st->need_parsing = AVSTREAM_PARSE_FULL;
 +    st->start_time = 0;
      /* the parameters will be extracted from the compressed bitstream */
  
      return 0;
@@@ -245,7 -244,7 +245,7 @@@ AVInputFormat ff_shorten_demuxer = 
      .long_name      = NULL_IF_CONFIG_SMALL("raw Shorten"),
      .read_header    = ff_raw_audio_read_header,
      .read_packet    = ff_raw_read_partial_packet,
-     .flags= AVFMT_GENERIC_INDEX,
+     .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK,
      .extensions = "shn",
      .value = CODEC_ID_SHORTEN,
  };
diff --combined libavformat/utils.c
index 58982955de2d65b483f158777eda21d28e1e5c51,3115723668aa78ca3292c5e30fd5a326bc59f3a8..c7eb93f3b0cdfc5f796d090a9edc37e98fab360d
@@@ -1,21 -1,21 +1,21 @@@
  /*
 - * various utility functions for use within Libav
 + * various utility functions for use within FFmpeg
   * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -25,7 -25,6 +25,7 @@@
  #include "avio_internal.h"
  #include "internal.h"
  #include "libavcodec/internal.h"
 +#include "libavcodec/raw.h"
  #include "libavutil/opt.h"
  #include "libavutil/dict.h"
  #include "libavutil/pixdesc.h"
@@@ -49,7 -48,7 +49,7 @@@
  
  /**
   * @file
 - * various utility functions for use within Libav
 + * various utility functions for use within FFmpeg
   */
  
  unsigned avformat_version(void)
  
  const char *avformat_configuration(void)
  {
 -    return LIBAV_CONFIGURATION;
 +    return FFMPEG_CONFIGURATION;
  }
  
  const char *avformat_license(void)
  {
  #define LICENSE_PREFIX "libavformat license: "
 -    return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
  }
  
  /* fraction handling */
@@@ -305,11 -304,11 +305,11 @@@ int av_filename_number_test(const char 
      return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
  }
  
 -AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
 +AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
  {
      AVProbeData lpd = *pd;
      AVInputFormat *fmt1 = NULL, *fmt;
 -    int score, id3 = 0;
 +    int score, score_max=0;
  
      if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
          int id3len = ff_id3v2_tag_len(lpd.buf);
              lpd.buf += id3len;
              lpd.buf_size -= id3len;
          }
 -        id3 = 1;
      }
  
      fmt = NULL;
          score = 0;
          if (fmt1->read_probe) {
              score = fmt1->read_probe(&lpd);
 +            if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
 +                score = 1;
          } else if (fmt1->extensions) {
              if (av_match_ext(lpd.filename, fmt1->extensions)) {
                  score = 50;
              }
          }
 -        if (score > *score_max) {
 -            *score_max = score;
 +        if (score > score_max) {
 +            score_max = score;
              fmt = fmt1;
 -        }else if (score == *score_max)
 +        }else if (score == score_max)
              fmt = NULL;
      }
 -
 -    /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
 -    if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_MAX/4;
 -                break;
 -            }
 -    }
 -
 +    *score_ret= score_max;
      return fmt;
  }
  
 +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
 +{
 +    int score_ret;
 +    AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
 +    if(score_ret > *score_max){
 +        *score_max= score_ret;
 +        return fmt;
 +    }else
 +        return NULL;
 +}
 +
  AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
      int score=0;
      return av_probe_input_format2(pd, is_opened, &score);
  }
  
 -static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
 +static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
  {
      static const struct {
          const char *name; enum CodecID id; enum AVMediaType type;
          { "dts"      , CODEC_ID_DTS       , AVMEDIA_TYPE_AUDIO },
          { "eac3"     , CODEC_ID_EAC3      , AVMEDIA_TYPE_AUDIO },
          { "h264"     , CODEC_ID_H264      , AVMEDIA_TYPE_VIDEO },
 +        { "loas"     , CODEC_ID_AAC_LATM  , AVMEDIA_TYPE_AUDIO },
          { "m4v"      , CODEC_ID_MPEG4     , AVMEDIA_TYPE_VIDEO },
          { "mp3"      , CODEC_ID_MP3       , AVMEDIA_TYPE_AUDIO },
          { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
          { 0 }
      };
 -    AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
 +    int score;
 +    AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
  
      if (fmt) {
          int i;
              }
          }
      }
 -    return !!fmt;
 +    return score;
  }
  
  /************************************************************/
@@@ -405,7 -399,6 +405,7 @@@ static AVDictionary *convert_format_par
      if (!ap)
          return NULL;
  
 +    AV_NOWARN_DEPRECATED(
      if (ap->time_base.num) {
          snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
          av_dict_set(&opts, "framerate", buf, 0);
      if (ap->initial_pause) {
          av_dict_set(&opts, "initial_pause", "1", 0);
      }
 +    )
      return opts;
  }
  
@@@ -460,12 -452,10 +460,12 @@@ int av_open_input_stream(AVFormatContex
      }
      opts = convert_format_parameters(ap);
  
 +    AV_NOWARN_DEPRECATED(
      if(!ap->prealloced_context)
 -        ic = avformat_alloc_context();
 +        *ic_ptr = ic = avformat_alloc_context();
      else
          ic = *ic_ptr;
 +    )
      if (!ic) {
          err = AVERROR(ENOMEM);
          goto fail;
@@@ -487,22 -477,6 +487,22 @@@ fail
  }
  #endif
  
 +int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
 +    int err;
 +
 +    if (ic->iformat->read_header) {
 +        err = ic->iformat->read_header(ic, ap);
 +        if (err < 0)
 +            return err;
 +    }
 +
 +    if (ic->pb && !ic->data_offset)
 +        ic->data_offset = avio_tell(ic->pb);
 +
 +    return 0;
 +}
 +
 +
  /** size of probe buffer, for guessing file type from file contents */
  #define PROBE_BUF_MIN 2048
  #define PROBE_BUF_MAX (1<<20)
@@@ -531,19 -505,13 +531,19 @@@ int av_probe_input_buffer(AVIOContext *
          probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
          int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
          int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
 +        void *buftmp;
  
          if (probe_size < offset) {
              continue;
          }
  
          /* read probe data */
 -        buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
 +        buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
 +        if(!buftmp){
 +            av_free(buf);
 +            return AVERROR(ENOMEM);
 +        }
 +        buf=buftmp;
          if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
              /* fail if error was not end of file, otherwise, lower score */
              if (ret != AVERROR_EOF) {
          *fmt = av_probe_input_format2(&pd, 1, &score);
          if(*fmt){
              if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
 -                av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
 +                av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
              }else
 -                av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
 +                av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
          }
      }
  
@@@ -589,10 -557,8 +589,10 @@@ int av_open_input_file(AVFormatContext 
      int err;
      AVDictionary *opts = convert_format_parameters(ap);
  
 +    AV_NOWARN_DEPRECATED(
      if (!ap || !ap->prealloced_context)
          *ic_ptr = NULL;
 +    )
  
      err = avformat_open_input(ic_ptr, filename, fmt, &opts);
  
@@@ -612,8 -578,7 +612,8 @@@ static int init_input(AVFormatContext *
          if (!s->iformat)
              return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
          else if (s->iformat->flags & AVFMT_NOFILE)
 -            return AVERROR(EINVAL);
 +            av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
 +                                      "will be ignored with AVFMT_NOFILE format.\n");
          return 0;
      }
  
@@@ -678,11 -643,11 +678,11 @@@ int avformat_open_input(AVFormatContex
      if (s->pb)
          ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
  
 -    if (s->iformat->read_header)
 +    if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
          if ((ret = s->iformat->read_header(s, &ap)) < 0)
              goto fail;
  
 -    if (s->pb && !s->data_offset)
 +    if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
          s->data_offset = avio_tell(s->pb);
  
      s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
@@@ -732,7 -697,12 +732,7 @@@ int av_read_packet(AVFormatContext *s, 
  
          if (pktl) {
              *pkt = pktl->pkt;
 -            if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
 -               !s->streams[pkt->stream_index]->probe_packets ||
 -               s->raw_packet_buffer_remaining_size < pkt->size){
 -                AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
 -                av_freep(&pd->buf);
 -                pd->buf_size = 0;
 +            if(s->streams[pkt->stream_index]->request_probe <= 0){
                  s->raw_packet_buffer = pktl->next;
                  s->raw_packet_buffer_remaining_size += pkt->size;
                  av_free(pktl);
              if (!pktl || ret == AVERROR(EAGAIN))
                  return ret;
              for (i = 0; i < s->nb_streams; i++)
 -                s->streams[i]->probe_packets = 0;
 +                if(s->streams[i]->request_probe > 0)
 +                    s->streams[i]->request_probe = -1;
              continue;
          }
  
              continue;
          }
  
 +        if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
 +            av_packet_merge_side_data(pkt);
 +
 +        if(pkt->stream_index >= (unsigned)s->nb_streams){
 +            av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
 +            continue;
 +        }
 +
          st= s->streams[pkt->stream_index];
  
          switch(st->codec->codec_type){
              break;
          }
  
 -        if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
 -                     !st->probe_packets))
 +        if(!pktl && st->request_probe <= 0)
              return ret;
  
          add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
          s->raw_packet_buffer_remaining_size -= pkt->size;
  
 -        if(st->codec->codec_id == CODEC_ID_PROBE){
 +        if(st->request_probe>0){
              AVProbeData *pd = &st->probe_data;
 -            av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
 +            int end;
 +            av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
              --st->probe_packets;
  
              pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
              pd->buf_size += pkt->size;
              memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
  
 -            if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
 -                //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
 -                set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
 -                if(st->codec->codec_id != CODEC_ID_PROBE){
 +            end=    s->raw_packet_buffer_remaining_size <= 0
 +                 || st->probe_packets<=0;
 +
 +            if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
 +                int score= set_codec_from_probe_data(s, st, pd);
 +                if(    (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
 +                    || end){
                      pd->buf_size=0;
                      av_freep(&pd->buf);
 +                    st->request_probe= -1;
 +                    if(st->codec->codec_id != CODEC_ID_NONE){
                      av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
 +                    }else
 +                        av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
                  }
              }
          }
@@@ -1011,7 -965,8 +1011,7 @@@ static void compute_pkt_fields(AVFormat
          pc && pc->pict_type != AV_PICTURE_TYPE_B)
          presentation_delayed = 1;
  
 -    if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
 -       /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
 +    if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts && st->pts_wrap_bits<63){
          pkt->dts -= 1LL<<st->pts_wrap_bits;
      }
  
      // we take the conservative approach and discard both
      // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
      if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
 -        av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
 +        av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
          pkt->dts= pkt->pts= AV_NOPTS_VALUE;
      }
  
@@@ -1157,10 -1112,7 +1157,10 @@@ static int read_frame_internal(AVFormat
              if (!st->need_parsing || !st->parser) {
                  /* no parsing needed: we just output the packet as is */
                  /* raw data support */
 -                *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
 +                *pkt = st->cur_pkt;
 +                st->cur_pkt.data= NULL;
 +                st->cur_pkt.side_data_elems = 0;
 +                st->cur_pkt.side_data = NULL;
                  compute_pkt_fields(s, st, NULL, pkt);
                  s->cur_st = NULL;
                  if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
                      compute_pkt_fields(s, st, st->parser, pkt);
  
                      if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
 +                        int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
                          ff_reduce_index(s, st->index);
 -                        av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
 +                        av_add_index_entry(st, pos, pkt->dts,
                                             0, 0, AVINDEX_KEYFRAME);
                      }
  
              if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
                  st->parser = av_parser_init(st->codec->codec_id);
                  if (!st->parser) {
 +                    av_log(s, AV_LOG_WARNING, "parser not found for codec "
 +                           "%s, packets or times may be invalid.\n",
 +                           avcodec_get_name(st->codec->codec_id));
                      /* no parser available: just output the raw packets */
                      st->need_parsing = AVSTREAM_PARSE_NONE;
                  }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
@@@ -1754,7 -1702,6 +1754,7 @@@ static int seek_frame_generic(AVFormatC
  
      if(index < 0 || index==st->nb_index_entries-1){
          AVPacket pkt;
 +        int nonkey=0;
  
          if(st->nb_index_entries){
              assert(st->index_entries);
              if (read_status < 0)
                  break;
              av_free_packet(&pkt);
 -            if(stream_index == pkt.stream_index){
 -                if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
 +            if(stream_index == pkt.stream_index && pkt.dts > timestamp){
 +                if(pkt.flags & AV_PKT_FLAG_KEY)
                      break;
 +                if(nonkey++ > 1000){
 +                    av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
 +                    break;
 +                }
              }
          }
          index = av_index_search_timestamp(st, timestamp, flags);
          return -1;
  
      ff_read_frame_flush(s);
 +    AV_NOWARN_DEPRECATED(
      if (s->iformat->read_seek){
          if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
              return 0;
      }
 +    )
      ie = &st->index_entries[index];
      if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
          return ret;
@@@ -1808,10 -1749,12 +1808,12 @@@ int av_seek_frame(AVFormatContext *s, i
      int ret;
      AVStream *st;
  
-     ff_read_frame_flush(s);
-     if(flags & AVSEEK_FLAG_BYTE)
+     if (flags & AVSEEK_FLAG_BYTE) {
+         if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
+             return -1;
+         ff_read_frame_flush(s);
          return seek_frame_byte(s, stream_index, timestamp, flags);
+     }
  
      if(stream_index < 0){
          stream_index= av_find_default_stream_index(s);
      }
  
      /* first, we try the format specific seek */
-     if (s->iformat->read_seek)
 +    AV_NOWARN_DEPRECATED(
+     if (s->iformat->read_seek) {
+         ff_read_frame_flush(s);
          ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
-     else
+     else
          ret = -1;
 +    )
      if (ret >= 0) {
          return 0;
      }
  
-     if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
+     if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
+         ff_read_frame_flush(s);
          return av_seek_frame_binary(s, stream_index, timestamp, flags);
-     else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
+     } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
+         ff_read_frame_flush(s);
          return seek_frame_generic(s, stream_index, timestamp, flags);
+     }
      else
          return -1;
  }
@@@ -1847,10 -1792,10 +1853,10 @@@ int avformat_seek_file(AVFormatContext 
      if(min_ts > ts || max_ts < ts)
          return -1;
  
-     ff_read_frame_flush(s);
-     if (s->iformat->read_seek2)
+     if (s->iformat->read_seek2) {
+         ff_read_frame_flush(s);
          return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
+     }
  
      if(s->iformat->read_timestamp){
          //try to seek via read_timestamp()
  
      //Fallback to old API if new is not implemented but old is
      //Note the old has somewat different sematics
 +    AV_NOWARN_DEPRECATED(
      if(s->iformat->read_seek || 1)
          return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
 +    )
  
      // try some generic seek like seek_frame_generic() but with new ts semantics
  }
@@@ -1877,8 -1820,6 +1883,8 @@@ static int has_duration(AVFormatContex
  {
      int i;
      AVStream *st;
 +    if(ic->duration != AV_NOPTS_VALUE)
 +        return 1;
  
      for(i = 0;i < ic->nb_streams; i++) {
          st = ic->streams[i];
   */
  static void update_stream_timings(AVFormatContext *ic)
  {
 -    int64_t start_time, start_time1, end_time, end_time1;
 +    int64_t start_time, start_time1, start_time_text, end_time, end_time1;
      int64_t duration, duration1;
      int i;
      AVStream *st;
  
      start_time = INT64_MAX;
 +    start_time_text = INT64_MAX;
      end_time = INT64_MIN;
      duration = INT64_MIN;
      for(i = 0;i < ic->nb_streams; i++) {
          st = ic->streams[i];
          if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
              start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
 +            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 +                if (start_time1 < start_time_text)
 +                    start_time_text = start_time1;
 +            } else
              if (start_time1 < start_time)
                  start_time = start_time1;
              if (st->duration != AV_NOPTS_VALUE) {
                  duration = duration1;
          }
      }
 +    if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
 +        start_time = start_time_text;
      if (start_time != INT64_MAX) {
          ic->start_time = start_time;
          if (end_time != INT64_MIN) {
                  duration = end_time - start_time;
          }
      }
 -    if (duration != INT64_MIN) {
 +    if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
          ic->duration = duration;
 -        if (ic->file_size > 0) {
 +    }
 +        if (ic->file_size > 0 && ic->duration != AV_NOPTS_VALUE) {
              /* compute the bitrate */
              ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
                  (double)ic->duration;
          }
 -    }
  }
  
  static void fill_all_stream_timings(AVFormatContext *ic)
@@@ -2145,8 -2079,6 +2151,8 @@@ static int has_codec_parameters(AVCodec
      case AVMEDIA_TYPE_VIDEO:
          val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
          break;
 +    case AVMEDIA_TYPE_DATA:
 +        if(avctx->codec_id == CODEC_ID_NONE) return 1;
      default:
          val = 1;
          break;
@@@ -2334,15 -2266,8 +2340,15 @@@ int avformat_find_stream_info(AVFormatC
  
          //try to just open decoders, in case this is enough to get parameters
          if(!has_codec_parameters(st->codec)){
 -            if (codec && !st->codec->codec)
 -                avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
 +            if (codec && !st->codec->codec){
 +                AVDictionary *tmp = NULL;
 +                if (options){
 +                    av_dict_copy(&tmp, options[i], 0);
 +                    av_dict_set(&tmp, "threads", 0, 0);
 +                }
 +                avcodec_open2(st->codec, codec, options ? &tmp : NULL);
 +                av_dict_free(&tmp);
 +            }
          }
      }
  
                  break;
              if(st->parser && st->parser->parser->split && !st->codec->extradata)
                  break;
 -            if(st->first_dts == AV_NOPTS_VALUE)
 +            if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
                  break;
          }
          if (i == ic->nb_streams) {
  
          st = ic->streams[pkt->stream_index];
          if (st->codec_info_nb_frames>1) {
 -            if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
 -                av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
 +            int64_t t;
 +            if (st->time_base.den > 0 && (t=av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q)) >= ic->max_analyze_duration) {
 +                av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
                  break;
              }
              st->info->codec_info_duration += pkt->duration;
              int64_t last = st->info->last_dts;
  
              if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
 +                double dts= pkt->dts * av_q2d(st->time_base);
                  int64_t duration= pkt->dts - last;
 -                double dur= duration * av_q2d(st->time_base);
  
  //                if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
  //                    av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
 -                if (st->info->duration_count < 2)
 -                    memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
 -                for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
 +                for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
                      int framerate= get_std_framerate(i);
 -                    int ticks= lrintf(dur*framerate/(1001*12));
 -                    double error= dur - ticks*1001*12/(double)framerate;
 -                    st->info->duration_error[i] += error*error;
 +                    double sdts= dts*framerate/(1001*12);
 +                    for(j=0; j<2; j++){
 +                        int ticks= lrintf(sdts+j*0.5);
 +                        double error= sdts - ticks + j*0.5;
 +                        st->info->duration_error[j][0][i] += error;
 +                        st->info->duration_error[j][1][i] += error*error;
 +                    }
                  }
                  st->info->duration_count++;
                  // ignore the first 4 values, they might have some random jitter
                       (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
                        st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
          if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +            if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
 +                uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
 +                if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
 +                    st->codec->codec_tag= tag;
 +            }
 +
              // the check for tb_unreliable() is not completely correct, since this is not about handling
              // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
              // ipmovie.c produces.
 -            if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
 +            if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
                  av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
              if (st->info->duration_count && !st->r_frame_rate.num
                 && tb_unreliable(st->codec) /*&&
                 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
                 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
                  int num = 0;
 -                double best_error= 2*av_q2d(st->time_base);
 -                best_error = best_error*best_error*st->info->duration_count*1000*12*30;
 -
 -                for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
 -                    double error = st->info->duration_error[j] * get_std_framerate(j);
 -//                    if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 -//                        av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
 -                    if(error < best_error){
 -                        best_error= error;
 -                        num = get_std_framerate(j);
 +                double best_error= 0.01;
 +
 +                for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
 +                    int k;
 +
 +                    if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
 +                        continue;
 +                    for(k=0; k<2; k++){
 +                        int n= st->info->duration_count;
 +                        double a= st->info->duration_error[k][0][j] / n;
 +                        double error= st->info->duration_error[k][1][j]/n - a*a;
 +
 +                        if(error < best_error && best_error> 0.000000001){
 +                            best_error= error;
 +                            num = get_std_framerate(j);
 +                        }
 +                        if(error < 0.02)
 +                            av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
                      }
                  }
                  // do not increase frame rate by more than 1 % in order to match a standard rate.
      return ret;
  }
  
 -static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
 +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
  {
      int i, j;
  
 -    for (i = 0; i < ic->nb_programs; i++)
 -        for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
 -            if (ic->programs[i]->stream_index[j] == s)
 -                return ic->programs[i];
 +    for (i = 0; i < ic->nb_programs; i++) {
 +        if (ic->programs[i] == last) {
 +            last = NULL;
 +        } else {
 +            if (!last)
 +                for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
 +                    if (ic->programs[i]->stream_index[j] == s)
 +                        return ic->programs[i];
 +        }
 +    }
      return NULL;
  }
  
@@@ -2638,7 -2540,7 +2644,7 @@@ int av_find_best_stream(AVFormatContex
      AVCodec *decoder = NULL, *best_decoder = NULL;
  
      if (related_stream >= 0 && wanted_stream_nb < 0) {
 -        AVProgram *p = find_program_from_stream(ic, related_stream);
 +        AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
          if (p) {
              program = p->stream_index;
              nb_streams = p->nb_stream_indexes;
@@@ -2723,13 -2625,13 +2729,13 @@@ void avformat_free_context(AVFormatCont
              av_free_packet(&st->cur_pkt);
          }
          av_dict_free(&st->metadata);
 -        av_free(st->index_entries);
 -        av_free(st->codec->extradata);
 -        av_free(st->codec->subtitle_header);
 -        av_free(st->codec);
 -        av_free(st->priv_data);
 -        av_free(st->info);
 -        av_free(st);
 +        av_freep(&st->index_entries);
 +        av_freep(&st->codec->extradata);
 +        av_freep(&st->codec->subtitle_header);
 +        av_freep(&st->codec);
 +        av_freep(&st->priv_data);
 +        av_freep(&st->info);
 +        av_freep(&st);
      }
      for(i=s->nb_programs-1; i>=0; i--) {
          av_dict_free(&s->programs[i]->metadata);
      av_freep(&s->priv_data);
      while(s->nb_chapters--) {
          av_dict_free(&s->chapters[s->nb_chapters]->metadata);
 -        av_free(s->chapters[s->nb_chapters]);
 +        av_freep(&s->chapters[s->nb_chapters]);
      }
      av_freep(&s->chapters);
      av_dict_free(&s->metadata);
@@@ -2861,6 -2763,8 +2867,6 @@@ AVChapter *ff_new_chapter(AVFormatConte
  #if FF_API_FORMAT_PARAMETERS
  int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
  {
 -    int ret;
 -
      if (s->oformat->priv_data_size > 0) {
          s->priv_data = av_mallocz(s->oformat->priv_data_size);
          if (!s->priv_data)
      } else
          s->priv_data = NULL;
  
 -    if (s->oformat->set_parameters) {
 -        ret = s->oformat->set_parameters(s, ap);
 -        if (ret < 0)
 -            return ret;
 +    return 0;
 +}
 +#endif
 +
 +int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
 +                                   const char *format, const char *filename)
 +{
 +    AVFormatContext *s = avformat_alloc_context();
 +    int ret = 0;
 +
 +    *avctx = NULL;
 +    if (!s)
 +        goto nomem;
 +
 +    if (!oformat) {
 +        if (format) {
 +            oformat = av_guess_format(format, NULL, NULL);
 +            if (!oformat) {
 +                av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
 +                ret = AVERROR(EINVAL);
 +                goto error;
 +            }
 +        } else {
 +            oformat = av_guess_format(NULL, filename, NULL);
 +            if (!oformat) {
 +                ret = AVERROR(EINVAL);
 +                av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
 +                       filename);
 +                goto error;
 +            }
 +        }
      }
 +
 +    s->oformat = oformat;
 +    if (s->oformat->priv_data_size > 0) {
 +        s->priv_data = av_mallocz(s->oformat->priv_data_size);
 +        if (!s->priv_data)
 +            goto nomem;
 +        if (s->oformat->priv_class) {
 +            *(const AVClass**)s->priv_data= s->oformat->priv_class;
 +            av_opt_set_defaults(s->priv_data);
 +        }
 +    } else
 +        s->priv_data = NULL;
 +
 +    if (filename)
 +        av_strlcpy(s->filename, filename, sizeof(s->filename));
 +    *avctx = s;
      return 0;
 +nomem:
 +    av_log(s, AV_LOG_ERROR, "Out of memory\n");
 +    ret = AVERROR(ENOMEM);
 +error:
 +    avformat_free_context(s);
 +    return ret;
 +}
 +
 +#if FF_API_ALLOC_OUTPUT_CONTEXT
 +AVFormatContext *avformat_alloc_output_context(const char *format,
 +                                               AVOutputFormat *oformat, const char *filename)
 +{
 +    AVFormatContext *avctx;
 +    int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
 +    return ret < 0 ? NULL : avctx;
  }
  #endif
  
@@@ -2989,9 -2835,6 +2995,9 @@@ int avformat_write_header(AVFormatConte
          av_dict_copy(&tmp, *options, 0);
      if ((ret = av_opt_set_dict(s, &tmp)) < 0)
          goto fail;
 +    if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
 +        (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
 +        goto fail;
  
      // some sanity checks
      if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
                  ret = AVERROR(EINVAL);
                  goto fail;
              }
 -            if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
 +            if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
 +               && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
 +            ){
                  av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
                  ret = AVERROR(EINVAL);
                  goto fail;
@@@ -3158,7 -2999,7 +3164,7 @@@ static int compute_pkt_fields2(AVFormat
          pkt->dts= st->pts_buffer[0];
      }
  
 -    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
 +    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
          av_log(s, AV_LOG_ERROR,
                 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
                 st->index, st->cur_dts, pkt->dts);
@@@ -3258,44 -3099,17 +3264,44 @@@ static int ff_interleave_compare_dts(AV
  
  int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
      AVPacketList *pktl;
 -    int stream_count=0;
 +    int stream_count=0, noninterleaved_count=0;
 +    int64_t delta_dts_max = 0;
      int i;
  
      if(pkt){
          ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
      }
  
 -    for(i=0; i < s->nb_streams; i++)
 -        stream_count+= !!s->streams[i]->last_in_packet_buffer;
 +    for(i=0; i < s->nb_streams; i++) {
 +        if (s->streams[i]->last_in_packet_buffer) {
 +            ++stream_count;
 +        } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 +            ++noninterleaved_count;
 +        }
 +    }
  
 -    if(stream_count && (s->nb_streams == stream_count || flush)){
 +    if (s->nb_streams == stream_count) {
 +        flush = 1;
 +    } else if (!flush){
 +        for(i=0; i < s->nb_streams; i++) {
 +            if (s->streams[i]->last_in_packet_buffer) {
 +                int64_t delta_dts =
 +                    av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
 +                                s->streams[i]->time_base,
 +                                AV_TIME_BASE_Q) -
 +                    av_rescale_q(s->packet_buffer->pkt.dts,
 +                                s->streams[s->packet_buffer->pkt.stream_index]->time_base,
 +                                AV_TIME_BASE_Q);
 +                delta_dts_max= FFMAX(delta_dts_max, delta_dts);
 +            }
 +        }
 +        if(s->nb_streams == stream_count+noninterleaved_count &&
 +           delta_dts_max > 20*AV_TIME_BASE) {
 +            av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
 +            flush = 1;
 +        }
 +    }
 +    if(stream_count && flush){
          pktl= s->packet_buffer;
          *out= pktl->pkt;
  
@@@ -3360,8 -3174,6 +3366,8 @@@ int av_interleaved_write_frame(AVFormat
  
          if(ret<0)
              return ret;
 +        if(s->pb && s->pb->error)
 +            return s->pb->error;
      }
  }
  
@@@ -3385,15 -3197,11 +3391,15 @@@ int av_write_trailer(AVFormatContext *s
  
          if(ret<0)
              goto fail;
 +        if(s->pb && s->pb->error)
 +            goto fail;
      }
  
      if(s->oformat->write_trailer)
          ret = s->oformat->write_trailer(s);
  fail:
 +    if(ret == 0)
 +       ret = s->pb ? s->pb->error : 0;
      for(i=0;i<s->nb_streams;i++) {
          av_freep(&s->streams[i]->priv_data);
          av_freep(&s->streams[i]->index_entries);
      return ret;
  }
  
 +int av_get_output_timestamp(struct AVFormatContext *s, int stream,
 +                            int64_t *dts, int64_t *wall)
 +{
 +    if (!s->oformat || !s->oformat->get_output_timestamp)
 +        return AVERROR(ENOSYS);
 +    s->oformat->get_output_timestamp(s, stream, dts, wall);
 +    return 0;
 +}
 +
  void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
  {
      int i, j;
@@@ -3455,13 -3254,8 +3461,13 @@@ static void dump_metadata(void *ctx, AV
  
          av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
          while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
 -            if(strcmp("language", tag->key))
 -                av_log(ctx, AV_LOG_INFO, "%s  %-16s: %s\n", indent, tag->key, tag->value);
 +            if(strcmp("language", tag->key)){
 +                char tmp[256];
 +                int i;
 +                av_strlcpy(tmp, tag->value, sizeof(tmp));
 +                for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
 +                av_log(ctx, AV_LOG_INFO, "%s  %-16s: %s\n", indent, tag->key, tmp);
 +            }
          }
      }
  }
@@@ -3475,7 -3269,7 +3481,7 @@@ static void dump_stream_format(AVFormat
      int g = av_gcd(st->time_base.num, st->time_base.den);
      AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
      avcodec_string(buf, sizeof(buf), st->codec, is_output);
 -    av_log(NULL, AV_LOG_INFO, "    Stream #%d.%d", index, i);
 +    av_log(NULL, AV_LOG_INFO, "    Stream #%d:%d", index, i);
      /* the pid is an important information, so we display it */
      /* XXX: add a generic system */
      if (flags & AVFMT_SHOW_IDS)
                    st->codec->width*st->sample_aspect_ratio.num,
                    st->codec->height*st->sample_aspect_ratio.den,
                    1024*1024);
 -        av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
 +        av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
                   st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
                   display_aspect_ratio.num, display_aspect_ratio.den);
      }
diff --combined libavformat/version.h
index d2f9786a0dc88d1038cc40e4fab0dac60c6b6775,53c585a06b4178fe3b5c2c55b6dd0d8b41400e6c..fc27815f41b152af8867dc81d112ebcb88cb2fd3
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Version macros.
   *
 - * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 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
   */
  
@@@ -24,7 -24,7 +24,7 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 53
- #define LIBAVFORMAT_VERSION_MINOR 15
 -#define LIBAVFORMAT_VERSION_MINOR  9
++#define LIBAVFORMAT_VERSION_MINOR 16
  #define LIBAVFORMAT_VERSION_MICRO  0
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
@@@ -68,9 -68,6 +68,9 @@@
  #ifndef FF_API_SDP_CREATE
  #define FF_API_SDP_CREATE              (LIBAVFORMAT_VERSION_MAJOR < 54)
  #endif
 +#ifndef FF_API_ALLOC_OUTPUT_CONTEXT
 +#define FF_API_ALLOC_OUTPUT_CONTEXT    (LIBAVFORMAT_VERSION_MAJOR < 54)
 +#endif
  #ifndef FF_API_FORMAT_PARAMETERS
  #define FF_API_FORMAT_PARAMETERS       (LIBAVFORMAT_VERSION_MAJOR < 54)
  #endif
diff --combined tests/Makefile
index ff0aaa0def112a44c85f4f8978666735c15b2447,1ec9dc342c33e8c4772d4d67b633ba7d932f2af7..0a3e55e9d97ed7e576cef835d01785fb0883ed8c
@@@ -1,5 -1,3 +1,5 @@@
 +FFSERVER_REFFILE = $(SRC_PATH)/tests/ffserver.regression.ref
 +
  AREF = fate-acodec-aref
  VREF = fate-vsynth1-vref fate-vsynth2-vref
  REFS = $(AREF) $(VREF)
@@@ -7,13 -5,6 +7,13 @@@
  $(VREF): avconv$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm
  $(AREF): avconv$(EXESUF) tests/data/asynth1.sw
  
 +ffservertest: ffserver$(EXESUF) tests/vsynth1/00.pgm tests/data/asynth1.sw
 +      @echo
 +      @echo "Unfortunately ffserver is broken and therefore its regression"
 +      @echo "test fails randomly. Treat the results accordingly."
 +      @echo
 +      $(SRC_PATH)/tests/ffserver-regression.sh $(FFSERVER_REFFILE) $(SRC_PATH)/tests/ffserver.conf
 +
  tests/vsynth1/00.pgm: tests/videogen$(HOSTEXESUF)
        @mkdir -p tests/vsynth1
        $(M)./$< 'tests/vsynth1/'
@@@ -40,6 -31,7 +40,7 @@@ include $(SRC_PATH)/tests/fate/fft.ma
  include $(SRC_PATH)/tests/fate/h264.mak
  include $(SRC_PATH)/tests/fate/libavutil.mak
  include $(SRC_PATH)/tests/fate/mp3.mak
 -include $(SRC_PATH)/tests/fate/prores.mak
++#include $(SRC_PATH)/tests/fate/prores.mak
  include $(SRC_PATH)/tests/fate/vorbis.mak
  include $(SRC_PATH)/tests/fate/vp8.mak
  
@@@ -84,7 -76,7 +85,7 @@@ fate-seek:   $(FATE_SEEK
  ifdef SAMPLES
  FATE += $(FATE_TESTS) $(FATE_TESTS-yes)
  fate-rsync:
 -      rsync -vaLW rsync://fate-suite.libav.org/fate-suite/ $(SAMPLES)
 +      rsync -vaLW rsync://fate.ffmpeg.org/fate-suite/ $(SAMPLES)
  else
  fate-rsync:
        @echo "use 'make fate-rsync SAMPLES=/path/to/samples' to sync the fate suite"
@@@ -94,13 -86,11 +95,13 @@@ endi
  
  FATE_UTILS = base64 tiny_psnr
  
 +TOOL = ffmpeg
 +
  fate: $(FATE)
  
 -$(FATE): avconv$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
 +$(FATE): $(TOOL)$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
        @echo "TEST    $(@:fate-%=%)"
 -      $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)'
 +      $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' '$(TOOL)'
  
  fate-list:
        @printf '%s\n' $(sort $(FATE))
  clean:: testclean
  
  testclean:
 -      $(RM) -r tests/vsynth1 tests/vsynth2 tests/data
 +      $(RM) -r tests/vsynth1 tests/vsynth2 tests/data tools/lavfi-showfiltfmts$(EXESUF)
        $(RM) $(CLEANSUFFIXES:%=tests/%)
        $(RM) $(TESTTOOLS:%=tests/%$(HOSTEXESUF))