Merge commit '25b32586566f285d797737863c97a1c5c9c84e2b'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 24 Mar 2014 12:41:49 +0000 (13:41 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 24 Mar 2014 12:41:49 +0000 (13:41 +0100)
* commit '25b32586566f285d797737863c97a1c5c9c84e2b':
  lavf: add an AVStream field for exporting stream-global side data

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

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/APIchanges
libavformat/avformat.h
libavformat/utils.c
libavformat/version.h

diff --combined doc/APIchanges
@@@ -1,5 -1,5 +1,5 @@@
  Never assume the API of libav* to be stable unless at least 1 month has passed
 -since the last major version increase.
 +since the last major version increase or the API was added.
  
  The last version increases were:
  libavcodec:    2013-03-xx
@@@ -7,479 -7,185 +7,483 @@@ libavdevice:   2013-03-x
  libavfilter:   2013-12-xx
  libavformat:   2013-03-xx
  libavresample: 2012-10-05
 +libpostproc:   2011-04-18
 +libswresample: 2011-09-19
  libswscale:    2011-06-20
 -libavutil:     2013-12-xx
 +libavutil:     2012-10-22
  
  
  API changes, most recent first:
  
+ 2014-02-xx - xxxxxxx - lavf 55.13.0 - avformat.h
+   Add AVStream.side_data and AVStream.nb_side_data for exporting stream-global
+   side data (e.g. replaygain tags, video rotation)
  2014-02-xx - xxxxxxx - lavc 55.35.0 - avcodec.h
    Give the name AVPacketSideData to the previously anonymous struct used for
    AVPacket.side_data.
  
 +2014-03-18 - 37c07d4 - lsws 2.5.102
 +  Make gray16 full-scale.
 +
  2014-xx-xx - xxxxxxx - lavu 53.06.0 - pixfmt.h
 -  Add RGBA64 pixel format and variants.
 +  Add RGBA64_LIBAV pixel format and variants for compatibility
 +
 +2014-03-11 - 3f3229c - lavf 55.34.101 - avformat.h
 +  Set AVFormatContext.start_time_realtime when demuxing.
 +
 +2014-xx-xx - xxxxxx - lavd 55.11.100 - avdevice.h
 +  Add av_input_audio_device_next().
 +  Add av_input_video_device_next().
 +  Add av_output_audio_device_next().
 +  Add av_output_video_device_next().
  
 -2014-xx-xx - xxxxxxx - lavu 53.05.0 - frame.h
 +2014-02-24 - fff5262 / 1155fd0 - lavu 52.66.100 / 53.5.0 - frame.h
    Add av_frame_copy() for copying the frame data.
  
 -2014-02-xx - xxxxxxx - lavr 1.2.0 - avresample.h
 +2014-02-24 - a66be60 - lswr 0.18.100 - swresample.h
 +  Add swr_is_initialized() for checking whether a resample context is initialized.
 +
 +2014-02-22 - 5367c0b / 7e86c27 - lavr 1.2.0 - avresample.h
    Add avresample_is_open() for checking whether a resample context is open.
  
 -2014-xx-xx - xxxxxxx - lavu 53.04.0  - opt.h
 +2014-02-19 - 6a24d77 / c3ecd96 - lavu 52.65.100 / 53.4.0  - opt.h
    Add AV_OPT_FLAG_EXPORT and AV_OPT_FLAG_READONLY to mark options meant (only)
    for reading.
  
 -2014-xx-xx - xxxxxxx - lavu 53.03.01 - opt.h
 +2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h
    Deprecate unused AV_OPT_FLAG_METADATA.
  
 -2014-02-xx - xxxxxxx - lavu 53.3.0 - frame.h
 +2014-02-xx - xxxxxxx - lavd 55.10.100 - avdevice.h
 +  Add avdevice_list_devices() and avdevice_free_list_devices()
 +
 +2014-02-16 - db3c970 - lavf 55.33.100 - avio.h
 +  Add avio_find_protocol_name() to find out the name of the protocol that would
 +  be selected for a given URL.
 +
 +2014-02-15 - a2bc6c1 / c98f316 - lavu 52.64.100 / 53.3.0 - frame.h
    Add AV_FRAME_DATA_DOWNMIX_INFO value to the AVFrameSideDataType enum and
    downmix_info.h API, which identify downmix-related metadata.
  
 -2014-02-04 - d9ae103 - lavf 55.11.0 - avformat.h
 +2014-02-11 - 1b05ac2 - lavf 55.32.100 - avformat.h
 +  Add av_write_uncoded_frame() and av_interleaved_write_uncoded_frame().
 +
 +2014-02-04 - 3adb5f8 / d9ae103 - lavf 55.30.100 / 55.11.0 - avformat.h
    Add AVFormatContext.max_interleave_delta for controlling amount of buffering
    when interleaving.
  
 -2014-01-20 - 93c553c - lavc 55.32.1 - avcodec.h
 +2014-02-02 - 5871ee5 - lavf 55.29.100 - avformat.h
 +  Add output_ts_offset muxing option to AVFormatContext.
 +
 +2014-01-27 - 102bd64 - lavd 55.7.100 - avdevice.h
 +                       lavf 55.28.100 - avformat.h
 +  Add avdevice_dev_to_app_control_message() function.
 +
 +2014-01-27 - 7151411 - lavd 55.6.100 - avdevice.h
 +                       lavf 55.27.100 - avformat.h
 +  Add avdevice_app_to_dev_control_message() function.
 +
 +2014-01-24 - 86bee79 - lavf 55.26.100 - avformat.h
 +  Add AVFormatContext option metadata_header_padding to allow control over the
 +  amount of padding added.
 +
 +2014-01-20 - eef74b2 / 93c553c - lavc 55.48.102 / 55.32.1 - avcodec.h
    Edges are not required anymore on video buffers allocated by get_buffer2()
    (i.e. as if the CODEC_FLAG_EMU_EDGE flag was always on). Deprecate
    CODEC_FLAG_EMU_EDGE and avcodec_get_edge_width().
  
 -2014-01-05 - 5b4797a - lavu 53.2.0 - frame.h
 +2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
 +  Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
 +
 +2014-01-19 - xxxxxxx - lavu 52.63.100 - rational.h
 +  Add av_make_q() function.
 +
 +2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h
    Add AV_FRAME_DATA_MATRIXENCODING value to the AVFrameSideDataType enum, which
    identifies AVMatrixEncoding data.
  
 -2014-01-05 - 5c437fb - lavu 53.1.0 - channel_layout.h
 +2014-01-05 - 751385f / 5c437fb - lavu 52.61.100 / 53.1.0 - channel_layout.h
    Add values for various Dolby flags to the AVMatrixEncoding enum.
  
 -2013-12-20 - 2a41826 - lavc 55.30.0 - avcodec.h
 -  Add HEVC profiles
 +2014-01-04 - b317f94 - lavu 52.60.100 - mathematics.h
 +  Add av_add_stable() function.
 +
 +2013-12-22 - 911676c - lavu 52.59.100 - avstring.h
 +  Add av_strnlen() function.
  
 -2013-12-11 - b9fb59d,9431356,d7b3ee9 - lavc 55.28.1 - avcodec.h
 +2013-12-09 - 64f73ac - lavu 52.57.100 - opencl.h
 +  Add av_opencl_benchmark() function.
 +
 +2013-11-30 - 82b2e9c - lavu 52.56.100 - ffversion.h
 +  Moves version.h to libavutil/ffversion.h.
 +  Install ffversion.h and make it public.
 +
 +2013-12-11 - 29c83d2 / b9fb59d,409a143 / 9431356,44967ab / d7b3ee9 - lavc 55.45.101 / 55.28.1 - avcodec.h
    av_frame_alloc(), av_frame_unref() and av_frame_free() now can and should be
    used instead of avcodec_alloc_frame(), avcodec_get_frame_defaults() and
    avcodec_free_frame() respectively. The latter three functions are deprecated.
  
 -2013-12-09 - 7e244c6- - lavu 52.20.0 - frame.h
 +2013-12-09 - 7a60348 / 7e244c6- - lavu 52.58.100 / 52.20.0 - frame.h
    Add AV_FRAME_DATA_STEREO3D value to the AVFrameSideDataType enum and
    stereo3d.h API, that identify codec-independent stereo3d information.
  
 -2013-11-26 - 1eaac1d- - lavu 52.19.0 - frame.h
 +2013-11-26 - 625b290 / 1eaac1d- - lavu 52.55.100 / 52.19.0 - frame.h
    Add AV_FRAME_DATA_A53_CC value to the AVFrameSideDataType enum, which
    identifies ATSC A53 Part 4 Closed Captions data.
  
 -2013-11-14 - cce3e0a - lavu 52.18.0 - mem.h
 +2013-11-22 - 6859065 - lavu 52.54.100 - avstring.h
 +  Add av_utf8_decode() function.
 +
 +2013-11-22 - fb7d70c - lavc 55.44.100 - avcodec.h
 +  Add HEVC profiles
 +
 +2013-11-20 - c28b61c - lavc 55.44.100 - avcodec.h
 +  Add av_packet_{un,}pack_dictionary()
 +  Add AV_PKT_METADATA_UPDATE side data type, used to transmit key/value
 +  strings between a stream and the application.
 +
 +2013-11-14 - 7c888ae / cce3e0a - lavu 52.53.100 / 52.18.0 - mem.h
    Move av_fast_malloc() and av_fast_realloc() for libavcodec to libavutil.
  
 -2013-11-14 - 8941971 - lavc 55.27.0 - avcodec.h
 +2013-11-14 - b71e4d8 / 8941971 - lavc 55.43.100 / 55.27.0 - avcodec.h
    Deprecate AVCodecContext.error_rate, it is replaced by the 'error_rate'
    private option of the mpegvideo encoder family.
  
 -2013-11-14 - 728c465 - lavc 55.26.0 - vdpau.h
 +2013-11-14 - 31c09b7 / 728c465 - lavc 55.42.100 / 55.26.0 - vdpau.h
    Add av_vdpau_get_profile().
    Add av_vdpau_alloc_context(). This function must from now on be
    used for allocating AVVDPAUContext.
  
 -2013-11-04 - cd8f772 - lavc 55.25.0 - avcodec.h
 +2013-11-04 - be41f21 / cd8f772 - lavc 55.41.100 / 55.25.0 - avcodec.h
 +                       lavu 52.51.100 - frame.h
    Add ITU-R BT.2020 and other not yet included values to color primaries,
    transfer characteristics and colorspaces.
  
 -2013-10-31 - 28096e0 - lavu 52.17.0 - frame.h
 +2013-11-04 - 85cabf1 - lavu 52.50.100 - avutil.h
 +  Add av_fopen_utf8()
 +
 +2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h
    Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT.
  
 -2013-09-28 - 0767bfd - lavfi 3.11.0 - avfilter.h
 +2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h
 +  Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2.
 +
 +2013-10-27 - d61617a - lavu 52.48.100 - parseutils.h
 +  Add av_get_known_color_name().
 +
 +2013-10-17 - 8696e51 - lavu 52.47.100 - opt.h
 +  Add AV_OPT_TYPE_CHANNEL_LAYOUT and channel layout option handlers
 +  av_opt_get_channel_layout() and av_opt_set_channel_layout().
 +
 +2013-10-06 - ccf96f8 -libswscale 2.5.101 - options.c
 +  Change default scaler to bicubic
 +
 +2013-10-03 - e57dba0 - lavc 55.34.100 - avcodec.h
 +  Add av_codec_get_max_lowres()
 +
 +2013-10-02 - 5082fcc - lavf 55.19.100 - avformat.h
 +  Add audio/video/subtitle AVCodec fields to AVFormatContext to force specific
 +  decoders
 +
 +2013-09-28 - 7381d31 / 0767bfd - lavfi 3.88.100 / 3.11.0 - avfilter.h
    Add AVFilterGraph.execute and AVFilterGraph.opaque for custom slice threading
    implementations.
  
 -2013-09-21 - e208e6d - lavu 52.16.0 - pixfmt.h
 +2013-09-21 - 85f8a3c / e208e6d - lavu 52.46.100 / 52.16.0 - pixfmt.h
    Add interleaved 4:2:2 8/10-bit formats AV_PIX_FMT_NV16 and
    AV_PIX_FMT_NV20.
  
 -2013-09-16 - 3feb3d6 - lavu 52.15.0 - mem.h
 +2013-09-16 - c74c3fb / 3feb3d6 - lavu 52.44.100 / 52.15.0 - mem.h
    Add av_reallocp.
  
 -2013-08-10 - 5a9a9d4 - lavc 55.16.0 - avcodec.h
 +2013-09-04 - 3e1f507 - lavc 55.31.101 - avcodec.h
 +  avcodec_close() argument can be NULL.
 +
 +2013-09-04 - 36cd017 - lavf 55.16.101 - avformat.h
 +  avformat_close_input() argument can be NULL and point on NULL.
 +
 +2013-08-29 - e31db62 - lavf 55.15.100 - avformat.h
 +  Add av_format_get_probe_score().
 +
 +2013-08-15 - 1e0e193 - lsws 2.5.100 -
 +  Add a sws_dither AVOption, allowing to set the dither algorithm used
 +
 +2013-08-11 - d404fe35 - lavc 55.27.100 - vdpau.h
 +  Add a render2 alternative to the render callback function.
 +
 +2013-08-11 - af05edc - lavc 55.26.100 - vdpau.h
 +  Add allocation function for AVVDPAUContext, allowing
 +  to extend it in the future without breaking ABI/API.
 +
 +2013-08-10 - 67a580f / 5a9a9d4 - lavc 55.25.100 / 55.16.0 - avcodec.h
    Extend AVPacket API with av_packet_unref, av_packet_ref,
    av_packet_move_ref, av_packet_copy_props, av_packet_free_side_data.
  
 -2013-08-05 - f824535 - lavc 55.13.0 - avcodec.h
 +2013-08-05 - 9547e3e / f824535 - lavc 55.22.100 / 55.13.0 - avcodec.h
    Deprecate the bitstream-related members from struct AVVDPAUContext.
    The bistream buffers no longer need to be explicitly freed.
  
 -2013-08-05 - 549294f - lavc 55.12.0 - avcodec.h
 +2013-08-05 - 3b805dc / 549294f - lavc 55.21.100 / 55.12.0 - avcodec.h
    Deprecate the CODEC_CAP_HWACCEL_VDPAU codec capability. Use CODEC_CAP_HWACCEL
    and select the AV_PIX_FMT_VDPAU format with get_format() instead.
  
 -2013-08-05 - a0ad5d0 - lavu 52.14.0 - pixfmt.h
 +2013-08-05 - 4ee0984 / a0ad5d0 - lavu 52.41.100 / 52.14.0 - pixfmt.h
    Deprecate AV_PIX_FMT_VDPAU_*. Use AV_PIX_FMT_VDPAU instead.
  
 -2013-08-02 - a8b1927 - lavc 55.11.0 - avcodec.h
 +2013-08-02 - 82fdfe8 / a8b1927 - lavc 55.20.100 / 55.11.0 - avcodec.h
    Add output_picture_number to AVCodecParserContext.
  
 -2013-06-24 - 95d5246 - lavc 55.10.0 - avcodec.h
 +2013-07-23 - abc8110 - lavc 55.19.100 - avcodec.h
 +  Add avcodec_chroma_pos_to_enum()
 +  Add avcodec_enum_to_chroma_pos()
 +
 +2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h
 +  Deprecate avfilter_graph_parse() in favor of the equivalent
 +  avfilter_graph_parse_ptr().
 +
 +2013-06-24 - af5f9c0 / 95d5246 - lavc 55.17.100 / 55.10.0 - avcodec.h
    Add MPEG-2 AAC profiles
  
 -2013-06-04 - fc962d4 - lavu 52.13.0 - mem.h
 +2013-06-25 - af5f9c0 / 95d5246 - lavf 55.10.100 - avformat.h
 +  Add AV_DISPOSITION_* flags to indicate text track kind.
 +
 +2013-06-15 - 99b8cd0 - lavu 52.36.100
 +  Add AVRIPEMD:
 +   av_ripemd_alloc()
 +   av_ripemd_init()
 +   av_ripemd_update()
 +   av_ripemd_final()
 +
 +2013-06-04 - 30b491f / fc962d4 - lavu 52.35.100 / 52.13.0 - mem.h
    Add av_realloc_array and av_reallocp_array
  
 -2013-05-24 - 129bb23 - lavfi 3.10.0 - avfilter.h
 +2013-05-30 - 682b227 - lavu 52.35.100
 +  Add AVSHA512:
 +   av_sha512_alloc()
 +   av_sha512_init()
 +   av_sha512_update()
 +   av_sha512_final()
 +
 +2013-05-24 - 8d4e969 / 129bb23 - lavfi 3.10.0 / 3.70.100 - avfilter.h
    Add support for slice multithreading to lavfi. Filters supporting threading
    are marked with AVFILTER_FLAG_SLICE_THREADS.
    New fields AVFilterContext.thread_type, AVFilterGraph.thread_type and
    AVFilterGraph.nb_threads (accessible directly or through AVOptions) may be
    used to configure multithreading.
  
 -2013-05-24 - 2a6eaea - lavu 52.12.0 - cpu.h
 +2013-05-24 - fe40a9f / 2a6eaea - lavu 52.12.0 / 52.34.100 - cpu.h
    Add av_cpu_count() function for getting the number of logical CPUs.
  
 -2013-05-24 - b493847 - lavc 55.7.0 - avcodec.h
 +2013-05-24 - 0c25c39 / b493847 - lavc 55.7.0 / 55.12.100 - avcodec.h
    Add picture_structure to AVCodecParserContext.
  
 -2013-05-15 - e6c4ac7 - lavu 52.11.0 - pixdesc.h
 +2013-05-17 - 3a751ea - lavu 52.33.100 - opt.h
 +  Add AV_OPT_TYPE_COLOR value to AVOptionType enum.
 +
 +2013-05-13 - e398416 - lavu 52.31.100 - mem.h
 +  Add av_dynarray2_add().
 +
 +2013-05-12 - 1776177 - lavfi 3.65.100
 +  Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
 +
 +2013-04-19 - 380cfce - lavc 55.4.100
 +  Add AV_CODEC_PROP_TEXT_SUB property for text based subtitles codec.
 +
 +2013-04-18 - 7c1a002 - lavf 55.3.100
 +  The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default starting lavf 56.0.100.
 +
 +2013-04-10 - af0d270 - lavu 25.26.100 - avutil.h,opt.h
 +  Add av_int_list_length()
 +  and av_opt_set_int_list().
 +
 +2013-03-30 - 5c73645 - lavu 52.24.100 - samplefmt.h
 +  Add av_samples_alloc_array_and_samples().
 +
 +2013-03-29 - ef7b6b4 - lavf 55.1.100 - avformat.h
 +  Add av_guess_frame_rate()
 +
 +2013-03-20 - 8d928a9 - lavu 52.22.100 - opt.h
 +  Add AV_OPT_TYPE_DURATION value to AVOptionType enum.
 +
 +2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h
 +  Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
 +
 +2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h
 +  Add av_escape() and av_bprint_escape() API.
 +
 +2013-02-24 - b59cd08 - lavfi 3.41.100 - buffersink.h
 +  Add sample_rates field to AVABufferSinkParams.
 +
 +2013-01-17 - a1a707f - lavf 54.61.100
 +  Add av_codec_get_tag2().
 +
 +2013-01-01 - 2eb2e17 - lavfi 3.34.100
 +  Add avfilter_get_audio_buffer_ref_from_arrays_channels.
 +
 +2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
 +  Add AVFilterLink.channels, avfilter_link_get_channels()
 +  and avfilter_ref_get_channels().
 +
 +2012-12-15 - 96d815fc - lavc 54.80.100 - avcodec.h
 +  Add pkt_size field to AVFrame.
 +
 +2012-11-25 - c70ec631 - lavu 52.9.100 - opt.h
 +  Add the following convenience functions to opt.h:
 +   av_opt_get_image_size
 +   av_opt_get_pixel_fmt
 +   av_opt_get_sample_fmt
 +   av_opt_set_image_size
 +   av_opt_set_pixel_fmt
 +   av_opt_set_sample_fmt
 +
 +2012-11-17 - 4cd74c81 - lavu 52.8.100 - bprint.h
 +  Add av_bprint_strftime().
 +
 +2012-11-15 - 92648107 - lavu 52.7.100 - opt.h
 +  Add av_opt_get_key_value().
 +
 +2012-11-13 - 79456652 - lavfi 3.23.100 - avfilter.h
 +  Add channels field to AVFilterBufferRefAudioProps.
 +
 +2012-11-03 - 481fdeee - lavu 52.3.100 - opt.h
 +  Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
 +
 +2012-10-21 - 6fb2fd8 - lavc  54.68.100 - avcodec.h
 +                       lavfi  3.20.100 - avfilter.h
 +  Add AV_PKT_DATA_STRINGS_METADATA side data type, used to transmit key/value
 +  strings between AVPacket and AVFrame, and add metadata field to
 +  AVCodecContext (which shall not be accessed by users; see AVFrame metadata
 +  instead).
 +
 +2012-09-27 - a70b493 - lavd 54.3.100 - version.h
 +  Add LIBAVDEVICE_IDENT symbol.
 +
 +2012-09-27 - a70b493 - lavfi 3.18.100 - version.h
 +  Add LIBAVFILTER_IDENT symbol.
 +
 +2012-09-27 - a70b493 - libswr 0.16.100 - version.h
 +  Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
 +  and LIBSWRESAMPLE_IDENT symbols.
 +
 +2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
 +  Add av_small_strptime() time parsing function.
 +
 +  Can be used as a stripped-down replacement for strptime(), on
 +  systems which do not support it.
 +
 +2012-08-25 - 2626cc4 - lavf 54.28.100
 +  Matroska demuxer now identifies SRT subtitles as AV_CODEC_ID_SUBRIP instead
 +  of AV_CODEC_ID_TEXT.
 +
 +2012-08-13 - 5c0d8bc - lavfi 3.8.100 - avfilter.h
 +  Add avfilter_get_class() function, and priv_class field to AVFilter
 +  struct.
 +
 +2012-08-12 - a25346e - lavu 51.69.100 - opt.h
 +  Add AV_OPT_FLAG_FILTERING_PARAM symbol in opt.h.
 +
 +2012-07-31 - 23fc4dd - lavc 54.46.100
 +  Add channels field to AVFrame.
 +
 +2012-07-30 - f893904 - lavu 51.66.100
 +  Add av_get_channel_description()
 +  and av_get_standard_channel_layout() functions.
 +
 +2012-07-21 - 016a472 - lavc 54.43.100
 +  Add decode_error_flags field to AVFrame.
 +
 +2012-07-20 - b062936 - lavf 54.18.100
 +  Add avformat_match_stream_specifier() function.
 +
 +2012-07-14 - f49ec1b - lavc 54.38.100 - avcodec.h
 +  Add metadata to AVFrame, and the accessor functions
 +  av_frame_get_metadata() and av_frame_set_metadata().
 +
 +2012-07-10 - 0e003d8 - lavc 54.33.100
 +  Add av_fast_padded_mallocz().
 +
 +2012-07-10 - 21d5609 - lavfi 3.2.0 - avfilter.h
 +  Add init_opaque() callback to AVFilter struct.
 +
 +2012-06-26 - e6674e4 - lavu 51.63.100 - imgutils.h
 +  Add functions to libavutil/imgutils.h:
 +  av_image_get_buffer_size()
 +  av_image_fill_arrays()
 +  av_image_copy_to_buffer()
 +
 +2012-06-24 - c41899a - lavu 51.62.100 - version.h
 +  version moved from avutil.h to version.h
 +
 +2012-04-11 - 359abb1 - lavu 51.58.100 - error.h
 +  Add av_make_error_string() and av_err2str() utilities to
 +  libavutil/error.h.
 +
 +2012-06-05 - 62b39d4 - lavc 54.24.100
 +  Add pkt_duration field to AVFrame.
 +
 +2012-05-24 - f2ee065 - lavu 51.54.100
 +  Move AVPALETTE_SIZE and AVPALETTE_COUNT macros from
 +  libavcodec/avcodec.h to libavutil/pixfmt.h.
 +
 +2012-05-14 - 94a9ac1 - lavf 54.5.100
 +  Add av_guess_sample_aspect_ratio() function.
 +
 +2012-04-20 - 65fa7bc - lavfi 2.70.100
 +  Add avfilter_unref_bufferp() to avfilter.h.
 +
 +2012-04-13 - 162e400 - lavfi 2.68.100
 +  Install libavfilter/asrc_abuffer.h public header.
 +
 +2012-03-26 - a67d9cf - lavfi 2.66.100
 +  Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
 +
 +2013-05-15 - ff46809 / e6c4ac7 - lavu 52.32.100 / 52.11.0 - pixdesc.h
    Replace PIX_FMT_* flags with AV_PIX_FMT_FLAG_*.
  
 -2013-04-03 - 507b1e4 - lavc 55.4.0 - avcodec.h
 +2013-04-03 - 6fc58a8 / 507b1e4 - lavc 55.7.100 / 55.4.0 - avcodec.h
    Add field_order to AVCodecParserContext.
  
 -2013-04-19 - 5e83d9a - lavc 55.2.0 - avcodec.h
 +2013-04-19 - f4b05cd / 5e83d9a - lavc 55.5.100 / 55.2.0 - avcodec.h
    Add CODEC_FLAG_UNALIGNED to allow decoders to produce unaligned output.
  
 -2013-04-11 - lavfi 3.8.0
 -  38f0c07 - Move all content from avfiltergraph.h to avfilter.h. Deprecate
 +2013-04-11 - lavfi 3.53.100 / 3.8.0
 +  231fd44 / 38f0c07 - Move all content from avfiltergraph.h to avfilter.h. Deprecate
              avfilterhraph.h, user applications should include just avfilter.h
 -  bc1a985 - Add avfilter_graph_alloc_filter(), deprecate avfilter_open() and
 +  86070b8 / bc1a985 - Add avfilter_graph_alloc_filter(), deprecate avfilter_open() and
              avfilter_graph_add_filter().
 -  1113672 - Add AVFilterContext.graph pointing to the AVFilterGraph that contains the
 +  4fde705 / 1113672 - Add AVFilterContext.graph pointing to the AVFilterGraph that contains the
              filter.
 -  48a5ada - Add avfilter_init_str(), deprecate avfilter_init_filter().
 -  1ba95a9 - Add avfilter_init_dict().
 -  7cdd737 - Add AVFilter.flags field and AVFILTER_FLAG_DYNAMIC_{INPUTS,OUTPUTS} flags.
 -  7e8fe4b - Add avfilter_pad_count() for counting filter inputs/outputs.
 -  fa2a34c - Add avfilter_next(), deprecate av_filter_next().
 +  710b0aa / 48a5ada - Add avfilter_init_str(), deprecate avfilter_init_filter().
 +  46de9ba / 1ba95a9 - Add avfilter_init_dict().
 +  16fc24b / 7cdd737 - Add AVFilter.flags field and AVFILTER_FLAG_DYNAMIC_{INPUTS,OUTPUTS} flags.
 +  f4db6bf / 7e8fe4b - Add avfilter_pad_count() for counting filter inputs/outputs.
 +  835cc0f / fa2a34c - Add avfilter_next(), deprecate av_filter_next().
              Deprecate avfilter_uninit().
  
 -2013-04-09 - lavfi 3.7.0 - avfilter.h
 -  b439c99 - Add AVFilter.priv_class for exporting filter options through the
 +2013-04-09 - lavfi 3.51.100 / 3.7.0 - avfilter.h
 +  0594ef0 / b439c99 - Add AVFilter.priv_class for exporting filter options through the
              AVOptions API in the similar way private options work in lavc and lavf.
 -  8114c10 - Add avfilter_get_class().
 +  44d4488 / 8114c10 - Add avfilter_get_class().
    Switch all filters to use AVOptions.
  
 -2013-03-19 - 2c328a9 - lavu 52.9.0 - pixdesc.h
 +2013-03-19 - 17ebef2 / 2c328a9 - lavu 52.20.100 / 52.9.0 - pixdesc.h
    Add av_pix_fmt_count_planes() function for counting planes in a pixel format.
  
 -2013-03-16 - 42c7c61 - lavfi 3.6.0
 +2013-03-16 - ecade98 / 42c7c61 - lavfi 3.47.100 / 3.6.0
    Add AVFilterGraph.nb_filters, deprecate AVFilterGraph.filter_count.
  
 -2013-03-08 - Reference counted buffers - lavu 52.8.0, lavc 55.0.0, lavf 55.0.0,
 -lavd 54.0.0, lavfi 3.5.0
 -  8e401db, 1cec062 - add a new API for reference counted buffers and buffer
 +2013-03-08 - Reference counted buffers - lavu 52.8.0, lavc 55.0.100 / 55.0.0, lavf 55.0.100 / 55.0.0,
 +lavd 54.4.100 / 54.0.0, lavfi 3.5.0
 +  36099df / 8e401db, 532f31a / 1cec062 - add a new API for reference counted buffers and buffer
                       pools (new header libavutil/buffer.h).
 -  1afddbe - add AVPacket.buf to allow reference counting for the AVPacket data.
 +  2653e12 / 1afddbe - add AVPacket.buf to allow reference counting for the AVPacket data.
              Add av_packet_from_data() function for constructing packets from
              av_malloc()ed data.
 -  7ecc2d4 - move AVFrame from lavc to lavu (new header libavutil/frame.h), add
 +  c4e8821 / 7ecc2d4 - move AVFrame from lavc to lavu (new header libavutil/frame.h), add
              AVFrame.buf/extended_buf to allow reference counting for the AVFrame
              data. Add new API for working with reference-counted AVFrames.
 -  759001c - add the refcounted_frames field to AVCodecContext to make audio and
 +  80e9e63 / 759001c - add the refcounted_frames field to AVCodecContext to make audio and
              video decoders return reference-counted frames. Add get_buffer2()
              callback to AVCodecContext which allocates reference-counted frames.
              Add avcodec_default_get_buffer2() as the default get_buffer2()
                  * qscale_table, qstride, qscale_type, mbskip_table, motion_val,
                    mb_type, dct_coeff, ref_index -- mpegvideo-specific tables,
                    which are not exported anymore.
 -  7e35037 - switch libavfilter to use AVFrame instead of AVFilterBufferRef. Add
 +  a05a44e / 7e35037 - switch libavfilter to use AVFrame instead of AVFilterBufferRef. Add
              av_buffersrc_add_frame(), deprecate av_buffersrc_buffer().
              Add av_buffersink_get_frame() and av_buffersink_get_samples(),
              deprecate av_buffersink_read() and av_buffersink_read_samples().
              Deprecate AVFilterBufferRef and all functions for working with it.
  
 -2013-03-17 - 12c5c1d - lavu 52.8.0 - avstring.h
 +2013-03-17 - 6c17ff8 / 12c5c1d - lavu 52.19.100 / 52.8.0 - avstring.h
    Add av_isdigit, av_isgraph, av_isspace, av_isxdigit.
  
 -2013-02-23 - 9f12235 - lavfi 3.4.0 - avfiltergraph.h
 +2013-02-23 - 71cf094 / 9f12235 - lavfi 3.40.100 / 3.4.0 - avfiltergraph.h
    Add resample_lavr_opts to AVFilterGraph for setting libavresample options
    for auto-inserted resample filters.
  
 -2013-01-25 - 38c1466 - lavu 52.7.0 - dict.h
 +2013-01-25 - e7e14bc / 38c1466 - lavu 52.17.100 / 52.7.0 - dict.h
    Add av_dict_parse_string() to set multiple key/value pairs at once from a
    string.
  
 -2013-01-25 - b85a5e8 - lavu 52.6.0 - avstring.h
 +2013-01-25 - 25be630 / b85a5e8 - lavu 52.16.100 / 52.6.0 - avstring.h
    Add av_strnstr()
  
 -2013-01-15 - 8ee288d - lavu 52.5.0 - hmac.h
 +2013-01-15 - e7e0186 / 8ee288d - lavu 52.15.100 / 52.5.0 - hmac.h
    Add AVHMAC.
  
 -2013-01-13 - 44e065d - lavc 54.36.0 - vdpau.h
 +2013-01-13 - 8ee7b38 / 44e065d - lavc 54.87.100 / 54.36.0 - vdpau.h
    Add AVVDPAUContext struct for VDPAU hardware-accelerated decoding.
  
 -2013-01-12 - 169fb94 - lavu 52.4.0 - pixdesc.h
 +2013-01-12 - dae382b / 169fb94 - lavu 52.14.100 / 52.4.0 - pixdesc.h
    Add AV_PIX_FMT_VDPAU flag.
  
 -2013-01-07 - 074a00d - lavr 1.1.0
 +2013-01-07 - 249fca3 / 074a00d - lavr 1.1.0
    Add avresample_set_channel_mapping() for input channel reordering,
    duplication, and silencing.
  
 -------------------------------8<-------------------------------------
 -                   9 branch was cut here
 ------------------------------>8--------------------------------------
 -
 -2012-12-29 - d8fd06c - lavu 52.3.0 - avstring.h
 +2012-12-29 - 2ce43b3 / d8fd06c - lavu 52.13.100 / 52.3.0 - avstring.h
    Add av_basename() and av_dirname().
  
 -2012-11-11 - 5980f5d - lavu 52.2.0 - audioconvert.h
 +2012-11-11 - 03b0787 / 5980f5d - lavu 52.6.100 / 52.2.0 - audioconvert.h
    Rename audioconvert.h to channel_layout.h. audioconvert.h is now deprecated.
  
 -2012-11-05 - dfde8a3 - lavu 52.1.0 - intmath.h
 +2012-11-05 - 7d26be6 / dfde8a3 - lavu 52.5.100 / 52.1.0 - intmath.h
    Add av_ctz() for trailing zero bit count
  
 -2012-10-21 - a893655 - lavu 51.45.0 - error.h
 +2012-10-21 - e3a91c5 / a893655 - lavu 51.77.100 / 51.45.0 - error.h
    Add AVERROR_EXPERIMENTAL
  
 -2012-10-12 - d2fcb35 - lavu 51.44.0 - pixdesc.h
 +2012-10-12 - a33ed6b / d2fcb35 - lavu 51.76.100 / 51.44.0 - pixdesc.h
    Add functions for accessing pixel format descriptors.
    Accessing the av_pix_fmt_descriptors array directly is now
    deprecated.
  
 -2012-10-11 - 9a92aea - lavu 51.43.0 - aes.h, md5.h, sha.h, tree.h
 +2012-10-11 - f391e40 / 9a92aea - lavu 51.75.100 / 51.43.0 - aes.h, md5.h, sha.h, tree.h
    Add functions for allocating the opaque contexts for the algorithms,
 -  deprecate the context size variables.
  
 -2012-10-10 - b522000 - lavf 54.18.0 - avio.h
 +2012-10-10 - de31814 / b522000 - lavf 54.32.100 / 54.18.0 - avio.h
    Add avio_closep to complement avio_close.
  
 -2012-10-08 - 78071a1 - lavu 51.42.0 - pixfmt.h
 +2012-10-08 - ae77266 / 78071a1 - lavu 51.74.100 / 51.42.0 - pixfmt.h
    Rename PixelFormat to AVPixelFormat and all PIX_FMT_* to AV_PIX_FMT_*.
    To provide backwards compatibility, PixelFormat is now #defined as
    AVPixelFormat.
    'PixelFormat' identifier. Such code should either #undef PixelFormat
    or stop using the PixelFormat name.
  
 -2012-10-05 - e7ba5b1 - lavr 1.0.0 - avresample.h
 +2012-10-05 - 55c49af / e7ba5b1 - lavr 1.0.0 - avresample.h
    Data planes parameters to avresample_convert() and
    avresample_read() are now uint8_t** instead of void**.
    Libavresample is now stable.
  
 -2012-09-24 - a42aada - lavc 54.28.0 - avcodec.h
 +2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
    Add avcodec_free_frame(). This function must now
    be used for freeing an AVFrame.
  
 -2012-09-12 - 8919fee - lavu 51.41.0 - audioconvert.h
 +2012-09-12 - e3e09f2 / 8919fee - lavu 51.73.100 / 51.41.0 - audioconvert.h
    Added AV_CH_LOW_FREQUENCY_2 channel mask value.
  
 -2012-09-04 - 686a329 - lavu 51.40.0 - opt.h
 +2012-09-04 - b21b5b0 / 686a329 - lavu 51.71.100 / 51.40.0 - opt.h
    Reordered the fields in default_val in AVOption, changed which
    default_val field is used for which AVOptionType.
  
 -2012-08-30 - a231832 - lavc 54.26.1 - avcodec.h
 +2012-08-30 - 98298eb / a231832 - lavc 54.54.101 / 54.26.1 - avcodec.h
    Add codec descriptor properties AV_CODEC_PROP_LOSSY and
    AV_CODEC_PROP_LOSSLESS.
  
    Add codec descriptors for accessing codec properties without having
    to refer to a specific decoder or encoder.
  
 -  c223d79 - Add an AVCodecDescriptor struct and functions
 +  f5f3684 / c223d79 - Add an AVCodecDescriptor struct and functions
              avcodec_descriptor_get() and avcodec_descriptor_next().
 -  51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY.
 -  91e59fe - Add avcodec_descriptor_get_by_name().
 -
 +  f5f3684 / 51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY.
 +  6c180b3 / 91e59fe - Add avcodec_descriptor_get_by_name().
  
 -2012-08-08 - 1d9c2dc - lavu 51.39 - avutil.h
 -  Don't implicitly include libavutil/common.h in avutil.h
 -
 -2012-08-08 - 987170c - lavu 51.38 - dict.h
 +2012-08-08 - f5f3684 / 987170c - lavu 51.68.100 / 51.38.0 - dict.h
    Add av_dict_count().
  
 -2012-08-07 - 104e10f - lavc 54.25 - avcodec.h
 +2012-08-07 - 7a72695 / 104e10f - lavc 54.51.100 / 54.25.0 - avcodec.h
    Rename CodecID to AVCodecID and all CODEC_ID_* to AV_CODEC_ID_*.
    To provide backwards compatibility, CodecID is now #defined as AVCodecID.
    Note that this can break user code that includes avcodec.h and uses the
    'CodecID' identifier. Such code should either #undef CodecID or stop using the
    CodecID name.
  
 -2012-08-03 - 239fdf1 - lavu 51.37.1 - cpu.h
 +2012-08-03 - e776ee8 / 239fdf1 - lavu 51.66.101 / 51.37.1 - cpu.h
                         lsws 2.1.1   - swscale.h
    Rename AV_CPU_FLAG_MMX2  ---> AV_CPU_FLAG_MMXEXT.
    Rename SWS_CPU_CAPS_MMX2 ---> SWS_CPU_CAPS_MMXEXT.
  
 -2012-07-29 - 681ed00 - lavf 54.13.0 - avformat.h
 +2012-07-29 - 7c26761 / 681ed00 - lavf 54.22.100 / 54.13.0 - avformat.h
    Add AVFMT_FLAG_NOBUFFER for low latency use cases.
  
 -2012-07-20 - b70d89a - lavfi 3.0.0 - avfilter.h
 -  Add avfilter_unref_bufferp().
 -
 -2012-07-10 - 5fade8a - lavu 51.37.0
 +2012-07-10 - fbe0245 / f3e5e6f - lavu 51.65.100 / 51.37.0
    Add av_malloc_array() and av_mallocz_array()
  
 -2012-06-22 - d3d3a32 - lavu 51.34.0
 +2012-06-22 - e847f41 / d3d3a32 - lavu 51.61.100 / 51.34.0
    Add av_usleep()
  
 -2012-06-20 - ae0a301 - lavu 51.33.0
 +2012-06-20 - 4da42eb / ae0a301 - lavu 51.60.100 / 51.33.0
    Move av_gettime() to libavutil, add libavutil/time.h
  
 -2012-06-09 - 3971be0 - lavr 0.0.3
 +2012-06-09 - 82edf67 / 3971be0 - lavr 0.0.3
    Add a parameter to avresample_build_matrix() for Dolby/DPLII downmixing.
  
 -2012-06-12 - 9baeff9 - lavfi 2.23.0 - avfilter.h
 +2012-06-12 - c7b9eab / 9baeff9 - lavfi 2.79.100 / 2.23.0 - avfilter.h
    Add AVFilterContext.nb_inputs/outputs. Deprecate
    AVFilterContext.input/output_count.
  
 -2012-06-12 - 84b9fbe - lavfi 2.22.0 - avfilter.h
 +2012-06-12 - c7b9eab / 84b9fbe - lavfi 2.79.100 / 2.22.0 - avfilter.h
    Add avfilter_pad_get_type() and avfilter_pad_get_name(). Those
    should now be used instead of accessing AVFilterPad members
    directly.
  
 -2012-06-12 - b0f0dfc - lavu 51.32.0 - audioconvert.h
 +2012-06-12 - 3630a07 / b0f0dfc - lavu 51.57.100 / 51.32.0 - audioconvert.h
    Add av_get_channel_layout_channel_index(), av_get_channel_name()
    and av_channel_layout_extract_channel().
  
 -2012-05-25 - 154486f - lavu 51.31.0 - opt.h
 +2012-05-25 - 53ce990 / 154486f - lavu 51.55.100 / 51.31.0 - opt.h
    Add av_opt_set_bin()
  
 -2012-05-26 - e9cef89 - lavf 54.3.0
 -  Add AVFMT_TS_NONSTRICT format flag to indicate that a muxer supports
 -  non-increasing monotone timestamps.
 -
 -2012-05-15 - lavfi 2.17.0
 +2012-05-15 - lavfi 2.74.100 / 2.17.0
    Add support for audio filters
 -  ac71230/a2cd9be - add video/audio buffer sink in a new installed
 +  61930bd / ac71230, 1cbf7fb / a2cd9be - add video/audio buffer sink in a new installed
                      header buffersink.h
 -  720c6b7 - add av_buffersrc_write_frame(), deprecate
 +  1cbf7fb / 720c6b7 - add av_buffersrc_write_frame(), deprecate
              av_vsrc_buffer_add_frame()
 -  ab16504 - add avfilter_copy_buf_props()
 -  9453c9e - add extended_data to AVFilterBuffer
 -  1b8c927 - add avfilter_get_audio_buffer_ref_from_arrays()
 +  61930bd / ab16504 - add avfilter_copy_buf_props()
 +  61930bd / 9453c9e - add extended_data to AVFilterBuffer
 +  61930bd / 1b8c927 - add avfilter_get_audio_buffer_ref_from_arrays()
  
 -2012-05-09 - lavu 51.30.0 - samplefmt.h
 -  142e740 - add av_samples_copy()
 -  6d7f617 - add av_samples_set_silence()
 +2012-05-09 - lavu 51.53.100 / 51.30.0 - samplefmt.h
 +  61930bd / 142e740 - add av_samples_copy()
 +  61930bd / 6d7f617 - add av_samples_set_silence()
  
 -2012-05-09 - a5117a2 - lavc 54.13.1
 +2012-05-09 - 61930bd / a5117a2 - lavc 54.21.101 / 54.13.1
    For audio formats with fixed frame size, the last frame
    no longer needs to be padded with silence, libavcodec
    will handle this internally (effectively all encoders
    behave as if they had CODEC_CAP_SMALL_LAST_FRAME set).
  
 -2012-05-07 - 828bd08 - lavc 54.13.0 - avcodec.h
 +2012-05-07 - 653d117 / 828bd08 - lavc 54.20.100 / 54.13.0 - avcodec.h
    Add sample_rate and channel_layout fields to AVFrame.
  
 -2012-05-01 - 4010d72 - lavr 0.0.1
 +2012-05-01 - 2330eb1 / 4010d72 - lavr 0.0.1
    Change AV_MIX_COEFF_TYPE_Q6 to AV_MIX_COEFF_TYPE_Q8.
  
 -2012-04-25 - 3527a73 - lavu 51.29.0 - cpu.h
 +2012-04-25 - e890b68 / 3527a73 - lavu 51.48.100 / 51.29.0 - cpu.h
    Add av_parse_cpu_flags()
  
 -2012-04-24 - c8af852 - lavr 0.0.0
 +2012-04-24 - 3ead79e / c8af852 - lavr 0.0.0
    Add libavresample audio conversion library
  
 -2012-04-20 - 0c0d1bc - lavu 51.28.0 - audio_fifo.h
 +2012-04-20 - 3194ab7 / 0c0d1bc - lavu 51.47.100 / 51.28.0 - audio_fifo.h
    Add audio FIFO functions:
      av_audio_fifo_free()
      av_audio_fifo_alloc()
      av_audio_fifo_size()
      av_audio_fifo_space()
  
 -2012-04-14 - lavfi 2.16.0 - avfiltergraph.h
 -  d7bcc71 Add avfilter_graph_parse2().
 -  91d3cbe Add avfilter_inout_alloc() and avfilter_inout_free().
 +2012-04-14 - lavfi 2.70.100 / 2.16.0 - avfiltergraph.h
 +  7432bcf / d7bcc71 Add avfilter_graph_parse2().
  
 -2012-04-08 - 4d693b0 - lavu 51.27.0 - samplefmt.h
 +2012-04-08 - 6bfb304 / 4d693b0 - lavu 51.46.100 / 51.27.0 - samplefmt.h
    Add av_get_packed_sample_fmt() and av_get_planar_sample_fmt()
  
 -2012-04-05 - 5cc51a5 - lavu 51.26.0 - audioconvert.h
 -  Add av_get_default_channel_layout()
 +2012-03-21 - b75c67d - lavu 51.43.100
 +  Add bprint.h for bprint API.
 +
 +2012-02-21 - 9cbf17e - lavc 54.4.100
 +  Add av_get_pcm_codec() function.
 +
 +2012-02-16 - 560b224 - libswr 0.7.100
 +  Add swr_set_matrix() function.
 +
 +2012-02-09 - c28e7af - lavu 51.39.100
 +  Add a new installed header libavutil/timestamp.h with timestamp
 +  utilities.
 +
 +2012-02-06 - 70ffda3 - lavu 51.38.100
 +  Add av_parse_ratio() function to parseutils.h.
  
 -2012-03-20 - 3c90cc2 - lavfo 54.2.0
 +2012-02-06 - 70ffda3 - lavu 51.38.100
 +  Add AV_LOG_MAX_OFFSET macro to log.h.
 +
 +2012-02-02 - 0eaa123 - lavu 51.37.100
 +  Add public timecode helpers.
 +
 +2012-01-24 - 0c3577b - lavfi 2.60.100
 +  Add avfilter_graph_dump.
 +
 +2012-03-20 - 0ebd836 / 3c90cc2 - lavfo 54.2.0
    Deprecate av_read_packet(), use av_read_frame() with
    AVFMT_FLAG_NOPARSE | AVFMT_FLAG_NOFILLIN in AVFormatContext.flags
  
 -2012-03-06 - 4d851f8 - lavu 51.25.0 - cpu.h
 -  Add av_set_cpu_flags_mask().
 +2012-03-05 - lavc 54.10.100 / 54.8.0
 +  f095391 / 6699d07 Add av_get_exact_bits_per_sample()
 +  f095391 / 9524cf7 Add av_get_audio_frame_duration()
  
 -2012-03-05 - lavc 54.8.0
 -  6699d07 Add av_get_exact_bits_per_sample()
 -  9524cf7 Add av_get_audio_frame_duration()
 -
 -2012-03-04 - 44fe77b - lavc 54.7.0 - avcodec.h
 +2012-03-04 - 2af8f2c / 44fe77b - lavc 54.8.100 / 54.7.0 - avcodec.h
    Add av_codec_is_encoder/decoder().
  
 -2012-03-01 - 442c132 - lavc 54.3.0 - avcodec.h
 +2012-03-01 - 1eb7f39 / 442c132 - lavc 54.5.100 / 54.3.0 - avcodec.h
    Add av_packet_shrink_side_data.
  
 -2012-02-29 - dd2a4bc - lavf 54.2.0 - avformat.h
 +2012-02-29 - 79ae084 / dd2a4bc - lavf 54.2.100 / 54.2.0 - avformat.h
    Add AVStream.attached_pic and AV_DISPOSITION_ATTACHED_PIC,
    used for dealing with attached pictures/cover art.
  
 -2012-02-25 - c9bca80 - lavu 51.24.0 - error.h
 +2012-02-25 - 305e4b3 / c9bca80 - lavu 51.41.100 / 51.24.0 - error.h
    Add AVERROR_UNKNOWN
    NOTE: this was backported to 0.8
  
 -2012-02-20 - e9cda85 - lavc 54.2.0
 +2012-02-20 - eadd426 / e9cda85 - lavc 54.2.100 / 54.2.0
    Add duration field to AVCodecParserContext
  
 -2012-02-20 - 0b42a93 - lavu 51.23.1 - mathematics.h
 +2012-02-20 - eadd426 / 0b42a93 - lavu 51.40.100 / 51.23.1 - mathematics.h
    Add av_rescale_q_rnd()
  
 -2012-02-08 - 38d5533 - lavu 51.22.1 - pixdesc.h
 +2012-02-08 - f2b20b7 / 38d5533 - lavu 51.38.101 / 51.22.1 - pixdesc.h
    Add PIX_FMT_PSEUDOPAL flag.
  
 -2012-02-08 - 52f82a1 - lavc 54.01.0
 +2012-02-08 - f2b20b7 / 52f82a1 - lavc 54.2.100 / 54.1.0
    Add avcodec_encode_video2() and deprecate avcodec_encode_video().
  
 -2012-02-01 - 316fc74 - lavc 54.01.0
 +2012-02-01 - 4c677df / 316fc74 - lavc 54.1.0
    Add av_fast_padded_malloc() as alternative for av_realloc() when aligned
    memory is required. The buffer will always have FF_INPUT_BUFFER_PADDING_SIZE
    zero-padded bytes at the end.
  
 -2012-01-31 - dd6d3b0 - lavf 54.01.0
 +2012-01-31 - a369a6b / dd6d3b0 - lavf 54.1.0
    Add avformat_get_riff_video_tags() and avformat_get_riff_audio_tags().
    NOTE: this was backported to 0.8
  
 -2012-01-31 - af08d9a - lavc 54.01.0
 +2012-01-31 - a369a6b / af08d9a - lavc 54.1.0
    Add avcodec_is_open() function.
    NOTE: this was backported to 0.8
  
 -2012-01-30 - 8b93312 - lavu 51.22.0 - intfloat.h
 +2012-01-30 - 151ecc2 / 8b93312 - lavu 51.36.100 / 51.22.0 - intfloat.h
    Add a new installed header libavutil/intfloat.h with int/float punning
    functions.
    NOTE: this was backported to 0.8
  
 -2012-01-25 - lavf 53.22.0
 -  f1caf01 Allow doing av_write_frame(ctx, NULL) for flushing possible
 +2012-01-25 - lavf 53.31.100 / 53.22.0
 +  3c5fe5b / f1caf01 Allow doing av_write_frame(ctx, NULL) for flushing possible
            buffered data within a muxer. Added AVFMT_ALLOW_FLUSH for
            muxers supporting it (av_write_frame makes sure it is called
            only for muxers with this flag).
  
 -------------------------------8<-------------------------------------
 -                   0.8 branch was cut here
 ------------------------------>8--------------------------------------
 -
 -2012-01-15 - lavc 53.34.0
 +2012-01-15 - lavc 53.56.105 / 53.34.0
    New audio encoding API:
 -  b2c75b6 Add CODEC_CAP_VARIABLE_FRAME_SIZE capability for use by audio
 +  67f5650 / b2c75b6 Add CODEC_CAP_VARIABLE_FRAME_SIZE capability for use by audio
            encoders.
 -  5ee5fa0 Add avcodec_fill_audio_frame() as a convenience function.
 -  b2c75b6 Add avcodec_encode_audio2() and deprecate avcodec_encode_audio().
 +  67f5650 / 5ee5fa0 Add avcodec_fill_audio_frame() as a convenience function.
 +  67f5650 / b2c75b6 Add avcodec_encode_audio2() and deprecate avcodec_encode_audio().
            Add AVCodec.encode2().
  
 -2012-01-12 - 3167dc9 - lavfi 2.15.0
 +2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0
    Add a new installed header -- libavfilter/version.h -- with version macros.
  
 -2011-01-03 - b73ec05 - lavu 51.21.0
 +2011-12-08 - a502939 - lavfi 2.52.0
 +  Add av_buffersink_poll_frame() to buffersink.h.
 +
 +2011-12-08 - 26c6fec - lavu 51.31.0
 +  Add av_log_format_line.
 +
 +2011-12-03 - 976b095 - lavu 51.30.0
 +  Add AVERROR_BUG.
 +
 +2011-11-24 - 573ffbb - lavu 51.28.1
 +  Add av_get_alt_sample_fmt() to samplefmt.h.
 +
 +2011-11-03 - 96949da - lavu 51.23.0
 +  Add av_strcasecmp() and av_strncasecmp() to avstring.h.
 +
 +2011-10-20 - b35e9e1 - lavu 51.22.0
 +  Add av_strtok() to avstring.h.
 +
 +2012-01-03 - ad1c8dd / b73ec05 - lavu 51.34.100 / 51.21.0
    Add av_popcount64
  
 -2011-12-25 - lavfi 2.14.0
 -  e1d9dbf Add a new installed header - buffersrc.h
 -  It contains a new function av_buffersrc_buffer() that allows passing
 -  frames to the 'buffer' filter, but unlike av_vsrc_buffer_add_frame()
 -  it allows for direct rendering.
 -  1c9e340 Add avfilter_copy_frame_props() for copying properties from
 -  AVFrame to AVFilterBufferRef.
 -
 -2011-12-25 - lavc 53.31.0
 -  Add the following new fields to AVFrame:
 -    b58dbb5 sample_aspect_ratio
 -    3a2ddf7 width, height
 -    8a4a5f6 format
 -
 -2011-12-18 - 8400b12 - lavc 53.28.1
 +2011-12-18 - 7c29313 / 8400b12 - lavc 53.46.1 / 53.28.1
    Deprecate AVFrame.age. The field is unused.
  
 -2011-12-12 - 5266045 - lavf 53.17.0
 +2011-12-12 - 8bc7fe4 / 5266045 - lavf 53.25.0 / 53.17.0
    Add avformat_close_input().
    Deprecate av_close_input_file() and av_close_input_stream().
  
 -2011-12-02 - 0eea212 - lavc 53.25.0
 +2011-12-02 - e4de716 / 0eea212 - lavc 53.40.0 / 53.25.0
    Add nb_samples and extended_data fields to AVFrame.
    Deprecate AVCODEC_MAX_AUDIO_FRAME_SIZE.
    Deprecate avcodec_decode_audio3() in favor of avcodec_decode_audio4().
    avcodec_decode_audio4() writes output samples to an AVFrame, which allows
    audio decoders to use get_buffer().
  
 -2011-12-04 - 560f773 - lavc 53.24.0
 +2011-12-04 - e4de716 / 560f773 - lavc 53.40.0 / 53.24.0
    Change AVFrame.data[4]/base[4]/linesize[4]/error[4] to [8] at next major bump.
    Change AVPicture.data[4]/linesize[4] to [8] at next major bump.
    Change AVCodecContext.error[4] to [8] at next major bump.
    Add AV_NUM_DATA_POINTERS to simplify the bump transition.
  
 -2011-11-23 - bbb46f3 - lavu 51.18.0
 +2011-11-23 - 8e576d5 / bbb46f3 - lavu 51.27.0 / 51.18.0
    Add av_samples_get_buffer_size(), av_samples_fill_arrays(), and
    av_samples_alloc(), to samplefmt.h.
  
 -2011-11-23 - 8889cc4 - lavu 51.17.0
 +2011-11-23 - 8e576d5 / 8889cc4 - lavu 51.27.0 / 51.17.0
    Add planar sample formats and av_sample_fmt_is_planar() to samplefmt.h.
  
 -2011-11-19 - f3a29b7 - lavc 53.21.0
 +2011-11-19 - dbb38bc / f3a29b7 - lavc 53.36.0 / 53.21.0
    Move some AVCodecContext fields to a new private struct, AVCodecInternal,
    which is accessed from a new field, AVCodecContext.internal.
    - fields moved:
        AVCodecContext.internal_buffer_count --> AVCodecInternal.buffer_count
        AVCodecContext.is_copy               --> AVCodecInternal.is_copy
  
 -2011-11-16 - 6270671 - lavu 51.16.0
 +2011-11-16 - 8709ba9 / 6270671 - lavu 51.26.0 / 51.16.0
    Add av_timegm()
  
 -2011-11-13 - lavf 53.15.0
 +2011-11-13 - lavf 53.21.0 / 53.15.0
    New interrupt callback API, allowing per-AVFormatContext/AVIOContext
    interrupt callbacks.
 -  6aa0b98 Add AVIOInterruptCB struct and the interrupt_callback field to
 +  5f268ca / 6aa0b98 Add AVIOInterruptCB struct and the interrupt_callback field to
            AVFormatContext.
 -  1dee0ac Add avio_open2() with additional parameters. Those are
 +  5f268ca / 1dee0ac Add avio_open2() with additional parameters. Those are
            an interrupt callback and an options AVDictionary.
            This will allow passing AVOptions to protocols after lavf
            54.0.
  
 -2011-11-06 - ba04ecf - lavu 51.14.0
 +2011-11-06 - 13b7781 / ba04ecf - lavu 51.24.0 / 51.14.0
    Add av_strcasecmp() and av_strncasecmp() to avstring.h.
  
 -2011-11-06 - 07b172f - lavu 51.13.0
 +2011-11-06 - 13b7781 / 07b172f - lavu 51.24.0 / 51.13.0
    Add av_toupper()/av_tolower()
  
 -2011-11-05 - b6d08f4 - lavf 53.13.0
 +2011-11-05 - d8cab5c / b6d08f4 - lavf 53.19.0 / 53.13.0
    Add avformat_network_init()/avformat_network_deinit()
  
 -2011-10-27 - 512557b - lavc 53.15.0
 +2011-10-27 - 6faf0a2 / 512557b - lavc 53.24.0 / 53.15.0
    Remove avcodec_parse_frame.
    Deprecate AVCodecContext.parse_only and CODEC_CAP_PARSE_ONLY.
  
 -2011-10-19 - 569129a - lavf 53.10.0
 +2011-10-19 - d049257 / 569129a - lavf 53.17.0 / 53.10.0
    Add avformat_new_stream(). Deprecate av_new_stream().
  
 -2011-10-13 - b631fba - lavf 53.9.0
 +2011-10-13 - 91eb1b1 / b631fba - lavf 53.16.0 / 53.9.0
    Add AVFMT_NO_BYTE_SEEK AVInputFormat flag.
  
 -2011-10-12 - lavu 51.12.0
 +2011-10-12 - lavu 51.21.0 / 51.12.0
    AVOptions API rewrite.
  
 -  - 145f741 FF_OPT_TYPE* renamed to AV_OPT_TYPE_*
 +  - f884ef0 / 145f741 FF_OPT_TYPE* renamed to AV_OPT_TYPE_*
    - new setting/getting functions with slightly different semantics:
 -        dac66da av_set_string3 -> av_opt_set
 +        f884ef0 / dac66da av_set_string3 -> av_opt_set
                  av_set_double  -> av_opt_set_double
                  av_set_q       -> av_opt_set_q
                  av_set_int     -> av_opt_set_int
  
 -        41d9d51 av_get_string  -> av_opt_get
 +        f884ef0 / 41d9d51 av_get_string  -> av_opt_get
                  av_get_double  -> av_opt_get_double
                  av_get_q       -> av_opt_get_q
                  av_get_int     -> av_opt_get_int
  
 -  - 8c5dcaa trivial rename av_next_option -> av_opt_next
 -  - 641c7af new functions - av_opt_child_next, av_opt_child_class_next
 +  - f884ef0 / 8c5dcaa trivial rename av_next_option -> av_opt_next
 +  - f884ef0 / 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 - a70e787 - lavu 51.17.0
 +  Add av_x_if_null().
 +
 +2011-09-18 - 645cebb - lavc 53.16.0
 +  Add showall flag2
 +
 +2011-09-16 - ea8de10 - lavfi 2.42.0
 +  Add avfilter_all_channel_layouts.
 +
 +2011-09-16 - 9899037 - 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 - 4381bdd - lavfi 2.40.0
 +  Change AVFilterBufferRefAudioProps.sample_rate type from uint32_t to int.
 +
 +2011-09-12 - 2c03174 - lavfi 2.40.0
 +  Simplify signature for avfilter_get_audio_buffer(), make it
 +  consistent with avfilter_get_video_buffer().
 +
 +2011-09-06 - 4f7dfe1 - lavfi 2.39.0
 +  Rename libavfilter/vsink_buffer.h to libavfilter/buffersink.h.
 +
 +2011-09-06 - c4415f6 - 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-04 - 61e2e29 - 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 - 1889c67 / 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 - 1889c67 / c11fb82 - lavu 51.15.0
    Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function.
  
 -2011-08-26 - lavu 51.9.0
 -  - f2011ed Add av_fifo_peek2(), deprecate av_fifo_peek().
 -  - add41de..abc78a5 Do not include intfloat_readwrite.h,
 +2011-08-14 - 323b930 - lavu 51.12.0
 +  Add av_fifo_peek2(), deprecate av_fifo_peek().
 +
 +2011-08-26 - lavu 51.14.0 / 51.9.0
 +  - 976a8b2 / add41de..976a8b2 / abc78a5 Do not include intfloat_readwrite.h,
      mathematics.h, rational.h, pixfmt.h, or log.h from avutil.h.
  
 -2011-08-16 - 48f9e45 - lavf 53.4.0
 +2011-08-16 - 27fbe31 / 48f9e45 - lavf 53.11.0 / 53.8.0
    Add avformat_query_codec().
  
 -2011-08-16 - bca06e7 - lavc 53.8.0
 +2011-08-16 - 27fbe31 / bca06e7 - lavc 53.11.0
    Add avcodec_get_type().
  
 -2011-08-06 - 2f63440 - lavf 53.4.0
 +2011-08-06 - 0cb233c / 2f63440 - lavf 53.7.0
    Add error_recognition to AVFormatContext.
  
 -2011-08-02 - 9d39cbf - lavc 53.7.1
 +2011-08-02 - 1d186e9 / 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 - 3602ad7 / a67c061 - lavf 53.6.0
    Add avformat_find_stream_info(), deprecate av_find_stream_info().
    NOTE: this was backported to 0.7
  
 -2011-07-10 - 0b950fe - lavc 53.6.0
 +2011-07-10 - 3602ad7 / 0b950fe - lavc 53.8.0
    Add avcodec_open2(), deprecate avcodec_open().
    NOTE: this was backported to 0.7
  
    Add avcodec_alloc_context3. Deprecate avcodec_alloc_context() and
    avcodec_alloc_context2().
  
 -2011-06-23 - 67e9ae1 - lavu 51.8.0 - attributes.h
 -  Add av_printf_format().
 +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.
  
 -------------------------------8<-------------------------------------
 -                   0.7 branch was cut here
 ------------------------------>8--------------------------------------
 +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-16 - 05e84c9, 25de595 - lavf 53.2.0 - avformat.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 - 686959e / 67e9ae1 - lavu 51.10.0 / 51.8.0 - attributes.h
 +  Add av_printf_format().
 +
 +2011-06-16 - 2905e3f / 05e84c9, 2905e3f / 25de595 - lavf 53.4.0 / 53.2.0 - avformat.h
    Add avformat_open_input and avformat_write_header().
    Deprecate av_open_input_stream, av_open_input_file,
    AVFormatParameters and av_write_header.
  
 -2011-06-16 - 7e83e1c, dc59ec5 - lavu 51.7.0 - opt.h
 +2011-06-16 - 2905e3f / 7e83e1c, 2905e3f / dc59ec5 - lavu 51.9.0 / 51.7.0 - opt.h
    Add av_opt_set_dict() and av_opt_find().
    Deprecate av_find_opt().
    Add AV_DICT_APPEND flag.
  
 -2011-06-10 - cb7c11c - lavu 51.6.0 - opt.h
 +2011-06-10 - 45fb647 / 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 - f9ecb84 / 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 - d552f61 / 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-05 - f956924 / 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 - 39e4206 / 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 - 75a37b5 / 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 - 59eb12f / 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-04-26 - bebe72f - lavu 51.1.0 - avutil.h
 +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 - d7e5aeb / 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
    libavcodec/avcodec.h.
  
 -2011-04-26 - 10d3940 - lavfi 2.3.0 - avfilter.h
 +2011-04-26 - d7e5aeb / 10d3940 - lavfi 2.3.0 - avfilter.h
    Add pict_type and key_frame fields to AVFilterBufferRefVideo.
  
 -2011-04-26 - 7a11c82 - lavfi 2.2.0 - vsrc_buffer
 +2011-04-26 - d7e5aeb / 7a11c82 - lavfi 2.2.0 - vsrc_buffer
    Add sample_aspect_ratio fields to vsrc_buffer arguments
  
 -2011-04-21 - 94f7451 - lavc 53.1.0 - avcodec.h
 +2011-04-21 - 8772156 / 94f7451 - lavc 53.1.0 - avcodec.h
    Add CODEC_CAP_SLICE_THREADS for codecs supporting sliced threading.
  
  2011-04-15 - lavc 52.120.0 - avcodec.h
    AVPacket structure got additional members for passing side information:
 -    4de339e introduce side information for AVPacket
 -    2d8591c make containers pass palette change in AVPacket
 +    c407984 / 4de339e introduce side information for AVPacket
 +    c407984 / 2d8591c make containers pass palette change in AVPacket
  
  2011-04-12 - lavf 52.107.0 - avio.h
    Avio cleanup, part II - deprecate the entire URLContext API:
 -    175389c add avio_check as a replacement for url_exist
 -    ff1ec0c add avio_pause and avio_seek_time as replacements
 +    c55780d / 175389c add avio_check as a replacement for url_exist
 +    9891004 / ff1ec0c add avio_pause and avio_seek_time as replacements
              for _av_url_read_fseek/fpause
 -    cdc6a87 deprecate av_protocol_next(), avio_enum_protocols
 +    d4d0932 / cdc6a87 deprecate av_protocol_next(), avio_enum_protocols
              should be used instead.
 -    80c6e23 rename url_set_interrupt_cb->avio_set_interrupt_cb.
 -    f87b1b3 rename open flags: URL_* -> AVIO_*
 -    f8270bb add avio_enum_protocols.
 -    5593f03 deprecate URLProtocol.
 -    c486dad deprecate URLContext.
 -    026e175 deprecate the typedef for URLInterruptCB
 -    8e76a19 deprecate av_register_protocol2.
 -    b840484 deprecate URL_PROTOCOL_FLAG_NESTED_SCHEME
 -    1305d93 deprecate av_url_read_seek
 -    fa104e1 deprecate av_url_read_pause
 -    727c7aa deprecate url_get_filename().
 -    5958df3 deprecate url_max_packet_size().
 -    1869ea0 deprecate url_get_file_handle().
 -    32a97d4 deprecate url_filesize().
 -    e52a914 deprecate url_close().
 -    58a48c6 deprecate url_seek().
 -    925e908 deprecate url_write().
 -    dce3756 deprecate url_read_complete().
 -    bc371ac deprecate url_read().
 -    0589da0 deprecate url_open().
 -    62eaaea deprecate url_connect.
 -    5652bb9 deprecate url_alloc.
 -    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
 +    c88caa5 / 80c6e23 rename url_set_interrupt_cb->avio_set_interrupt_cb.
 +    c88caa5 / f87b1b3 rename open flags: URL_* -> AVIO_*
 +    d4d0932 / f8270bb add avio_enum_protocols.
 +    d4d0932 / 5593f03 deprecate URLProtocol.
 +    d4d0932 / c486dad deprecate URLContext.
 +    d4d0932 / 026e175 deprecate the typedef for URLInterruptCB
 +    c88caa5 / 8e76a19 deprecate av_register_protocol2.
 +    11d7841 / b840484 deprecate URL_PROTOCOL_FLAG_NESTED_SCHEME
 +    11d7841 / 1305d93 deprecate av_url_read_seek
 +    11d7841 / fa104e1 deprecate av_url_read_pause
 +    434f248 / 727c7aa deprecate url_get_filename().
 +    434f248 / 5958df3 deprecate url_max_packet_size().
 +    434f248 / 1869ea0 deprecate url_get_file_handle().
 +    434f248 / 32a97d4 deprecate url_filesize().
 +    434f248 / e52a914 deprecate url_close().
 +    434f248 / 58a48c6 deprecate url_seek().
 +    434f248 / 925e908 deprecate url_write().
 +    434f248 / dce3756 deprecate url_read_complete().
 +    434f248 / bc371ac deprecate url_read().
 +    434f248 / 0589da0 deprecate url_open().
 +    434f248 / 62eaaea deprecate url_connect.
 +    434f248 / 5652bb9 deprecate url_alloc.
 +    434f248 / 333e894 deprecate url_open_protocol
 +    434f248 / e230705 deprecate url_poll and URLPollEntry
  
  2011-04-08 - lavf 52.106.0 - avformat.h
    Minor avformat.h cleanup:
 -    a9bf9d8 deprecate av_guess_image2_codec
 -    c3675df rename avf_sdp_create->av_sdp_create
 +    d4d0932 / a9bf9d8 deprecate av_guess_image2_codec
 +    d4d0932 / c3675df rename avf_sdp_create->av_sdp_create
  
  2011-04-03 - lavf 52.105.0 - avio.h
    Large-scale renaming/deprecating of AVIOContext-related functions:
 -    724f6a0 deprecate url_fdopen
 -    403ee83 deprecate url_open_dyn_packet_buf
 -    6dc7d80 rename url_close_dyn_buf       -> avio_close_dyn_buf
 -    b92c545 rename url_open_dyn_buf        -> avio_open_dyn_buf
 -    8978fed introduce an AVIOContext.seekable field as a replacement for
 +    2cae980 / 724f6a0 deprecate url_fdopen
 +    2cae980 / 403ee83 deprecate url_open_dyn_packet_buf
 +    2cae980 / 6dc7d80 rename url_close_dyn_buf       -> avio_close_dyn_buf
 +    2cae980 / b92c545 rename url_open_dyn_buf        -> avio_open_dyn_buf
 +    2cae980 / 8978fed introduce an AVIOContext.seekable field as a replacement for
              AVIOContext.is_streamed and url_is_streamed()
 -    b64030f deprecate get_checksum()
 -    4c4427a deprecate init_checksum()
 -    4ec153b deprecate udp_set_remote_url/get_local_port
 -    933e90a deprecate av_url_read_fseek/fpause
 -    8d9769a deprecate url_fileno
 -    b7f2fdd rename put_flush_packet -> avio_flush
 -    35f1023 deprecate url_close_buf
 -    83fddae deprecate url_open_buf
 -    d9d86e0 rename url_fprintf -> avio_printf
 -    59f65d9 deprecate url_setbufsize
 -    3e68b3b deprecate url_ferror
 -    66e5b1d deprecate url_feof
 +    1caa412 / b64030f deprecate get_checksum()
 +    1caa412 / 4c4427a deprecate init_checksum()
 +    2fd41c9 / 4ec153b deprecate udp_set_remote_url/get_local_port
 +    4fa0e24 / 933e90a deprecate av_url_read_fseek/fpause
 +    4fa0e24 / 8d9769a deprecate url_fileno
 +    0fecf26 / b7f2fdd rename put_flush_packet -> avio_flush
 +    0fecf26 / 35f1023 deprecate url_close_buf
 +    0fecf26 / 83fddae deprecate url_open_buf
 +    0fecf26 / d9d86e0 rename url_fprintf -> avio_printf
 +    0fecf26 / 59f65d9 deprecate url_setbufsize
 +    6947b0c / 3e68b3b deprecate url_ferror
      e8bb2e2 deprecate url_fget_max_packet_size
      76aa876 rename url_fsize -> avio_size
      e519753 deprecate url_fgetc
      b3db9ce deprecate get_partial_buffer
      8d9ac96 rename av_alloc_put_byte -> avio_alloc_context
  
 -2011-03-25 - 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type
 +2011-03-25 - 27ef7b1 / 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-10 - 12c14cd - lavf 52.99.0 - AVStream.disposition
    Add AV_DISPOSITION_HEARING_IMPAIRED and AV_DISPOSITION_VISUAL_IMPAIRED.
  
 -2011-02-09 - 5592734 - lavc 52.112.0 - avcodec_thread_init()
 +2011-02-09 - c0b102c - lavc 52.112.0 - avcodec_thread_init()
    Deprecate avcodec_thread_init()/avcodec_thread_free() use; instead
    set thread_count before calling avcodec_open.
  
 -2011-02-09 - 778b08a - lavc 52.111.0 - threading API
 +2011-02-09 - 37b00b4 - lavc 52.111.0 - threading API
    Add CODEC_CAP_FRAME_THREADS with new restrictions on get_buffer()/
    release_buffer()/draw_horiz_band() callbacks for appropriate codecs.
    Add thread_type and active_thread_type fields to AVCodecContext.
  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 - a242ac3 - lavfi 1.74.0 - AVFilterBufferRefAudioProps
    Rename AVFilterBufferRefAudioProps.samples_nb to nb_samples.
  
diff --combined libavformat/avformat.h
@@@ -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
   */
  
@@@ -50,7 -50,7 +50,7 @@@
   *
   * Main lavf structure used for both muxing and demuxing is AVFormatContext,
   * which exports all information about the file being read or written. As with
 - * most Libav structures, its size is not part of public ABI, so it cannot be
 + * most Libavformat structures, its size is not part of public ABI, so it cannot be
   * allocated on stack or directly with av_malloc(). To create an
   * AVFormatContext, use avformat_alloc_context() (some functions, like
   * avformat_open_input() might do that for you).
  
  struct AVFormatContext;
  
 +struct AVDeviceInfoList;
  
  /**
   * @defgroup metadata_api Public Metadata API
   *
   * Metadata is exported or set as pairs of key/value strings in the 'metadata'
   * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs
 - * using the @ref lavu_dict "AVDictionary" API. Like all strings in Libav,
 + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg,
   * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata
   * exported by demuxers isn't checked to be valid UTF-8 in most cases.
   *
@@@ -392,9 -391,6 +392,9 @@@ typedef struct AVProbeData 
      int buf_size;       /**< Size of buf except extra allocated bytes */
  } AVProbeData;
  
 +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)
 +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1)
 +
  #define AVPROBE_SCORE_EXTENSION  50 ///< score for file extension
  #define AVPROBE_SCORE_MAX       100 ///< maximum score
  
  #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fall back on generic search */
  #define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
  #define AVFMT_ALLOW_FLUSH  0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */
 -#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly
 +#if LIBAVFORMAT_VERSION_MAJOR <= 54
 +#define AVFMT_TS_NONSTRICT 0x8020000 //we try to be compatible to the ABIs of ffmpeg and major forks
 +#else
 +#define AVFMT_TS_NONSTRICT 0x20000
 +#endif
 +                                   /**< Format does not require strictly
                                          increasing timestamps, but they must
                                          still be monotonic */
  #define AVFMT_TS_NEGATIVE  0x40000 /**< Format allows muxing negative
                                          timestamps. If not set the timestamp
                                          will be shifted in av_write_frame and
                                          av_interleaved_write_frame so they
 -                                        start from 0. */
 +                                        start from 0.
 +                                        The user or muxer can override this through
 +                                        AVFormatContext.avoid_negative_ts
 +                                        */
 +
 +#define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */
  
  /**
   * @addtogroup lavf_encoding
@@@ -504,33 -490,8 +504,33 @@@ typedef struct AVOutputFormat 
       *
       * @return 1 if the codec is supported, 0 if it is not.
       *         A negative number if unknown.
 +     *         MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC
       */
      int (*query_codec)(enum AVCodecID id, int std_compliance);
 +
 +    void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
 +                                 int64_t *dts, int64_t *wall);
 +    /**
 +     * Allows sending messages from application to device.
 +     */
 +    int (*control_message)(struct AVFormatContext *s, int type,
 +                           void *data, size_t data_size);
 +
 +    /**
 +     * Write an uncoded AVFrame.
 +     *
 +     * See av_write_uncoded_frame() for details.
 +     *
 +     * The library will free *frame afterwards, but the muxer can prevent it
 +     * by setting the pointer to NULL.
 +     */
 +    int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,
 +                               AVFrame **frame, unsigned flags);
 +    /**
 +     * Returns device list with it properties.
 +     * @see avdevice_list_devices() for more details.
 +     */
 +    int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
  } AVOutputFormat;
  /**
   * @}
@@@ -557,7 -518,7 +557,7 @@@ typedef struct AVInputFormat 
      /**
       * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
       * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
 -     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK.
 +     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
       */
      int flags;
  
       * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
       */
      int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
 +
 +    /**
 +     * Returns device list with it properties.
 +     * @see avdevice_list_devices() for more details.
 +     */
 +    int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
  } AVInputFormat;
  /**
   * @}
@@@ -676,19 -631,11 +676,19 @@@ enum AVStreamParseType 
      AVSTREAM_PARSE_HEADERS,    /**< Only parse headers, do not repack. */
      AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */
      AVSTREAM_PARSE_FULL_ONCE,  /**< full parsing and repack of the first frame only, only implemented for H.264 currently */
 +    AVSTREAM_PARSE_FULL_RAW=MKTAG(0,'R','A','W'),       /**< full parsing and repack with timestamp and position generation by parser for raw
 +                                                             this assumes that each packet in the file contains no demuxer level headers and
 +                                                             just codec level data, otherwise position generation would fail */
  };
  
  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).
   */
  #define AV_DISPOSITION_ATTACHED_PIC      0x0400
  
 +/**
 + * To specify text track kind (different from subtitles default).
 + */
 +#define AV_DISPOSITION_CAPTIONS     0x10000
 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000
 +#define AV_DISPOSITION_METADATA     0x40000
 +
 +/**
 + * Options for behavior on timestamp wrap detection.
 + */
 +#define AV_PTS_WRAP_IGNORE      0   ///< ignore the wrap
 +#define AV_PTS_WRAP_ADD_OFFSET  1   ///< add the format specific offset on wrap detection
 +#define AV_PTS_WRAP_SUB_OFFSET  -1  ///< subtract the format specific offset on wrap detection
 +
  /**
   * Stream structure.
   * New fields can be added to the end with minor version bumps.
@@@ -779,12 -712,10 +779,12 @@@ typedef struct AVStream 
      AVRational time_base;
  
      /**
 -     * 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;
  
       */
      AVPacket attached_pic;
  
+     /**
+      * An array of side data that applies to the whole stream (i.e. the
+      * container does not allow it to change between packets).
+      *
+      * There may be no overlap between the side data in this array and side data
+      * in the packets. I.e. a given side data is either exported by the muxer
+      * (demuxing) / set by the caller (muxing) in this array, then it never
+      * appears in the packets, or the side data is exported / sent through
+      * the packets (always in the first packet where the value becomes known or
+      * changes), then it does not appear in this array.
+      *
+      * - demuxing: Set by libavformat when the stream is created.
+      * - muxing: May be set by the caller before avformat_write_header().
+      *
+      * Freed by libavformat in avformat_free_context().
+      */
+     AVPacketSideData *side_data;
+     /**
+      * The number of elements in the AVStream.side_data array.
+      */
+     int            nb_side_data;
      /*****************************************************************
       * All fields below this line are not part of the public API. They
       * may not be used outside of libavformat and can be changed and
      /**
       * Stream information used internally by av_find_stream_info()
       */
 -#define MAX_STD_TIMEBASES (60*12+5)
 +#define MAX_STD_TIMEBASES (60*12+6)
      struct {
 -        int nb_decoded_frames;
 +        int64_t last_dts;
 +        int64_t duration_gcd;
 +        int duration_count;
 +        int64_t rfps_duration_sum;
 +        double (*duration_error)[2][MAX_STD_TIMEBASES];
 +        int64_t codec_info_duration;
 +        int64_t codec_info_duration_fields;
          int found_decoder;
  
 +        int64_t last_duration;
 +
          /**
           * Those are used for average framerate estimation.
           */
      int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
  
  #if FF_API_REFERENCE_DTS
 -    /* a hack to keep ABI compatibility for avconv, which accesses parser even
 +    /* a hack to keep ABI compatibility for ffmpeg and other applications, which accesses parser even
       * though it should not */
      int64_t do_not_use;
  #endif
      // Timestamp generation support:
 +    /**
 +     * Timestamp corresponding to the last dts sync point.
 +     *
 +     * Initialized when AVCodecParserContext.dts_sync_point >= 0 and
 +     * a DTS is received from the underlying container. Otherwise set to
 +     * AV_NOPTS_VALUE by default.
 +     */
      int64_t first_dts;
      int64_t cur_dts;
      int64_t last_IP_pts;
                                      support seeking natively. */
      int nb_index_entries;
      unsigned int index_entries_allocated_size;
 +
 +    /**
 +     * Real base framerate of the stream.
 +     * This is the lowest framerate with which all timestamps can be
 +     * represented accurately (it is the least common multiple of all
 +     * framerates in the stream). Note, this value is just a guess!
 +     * For example, if the time base is 1/90000 and all frames have either
 +     * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
 +     *
 +     * Code outside avformat should access this field using:
 +     * av_stream_get/set_r_frame_rate(stream)
 +     */
 +    AVRational r_frame_rate;
 +
 +    /**
 +     * Stream Identifier
 +     * This is the MPEG-TS stream identifier +1
 +     * 0 means unknown
 +     */
 +    int stream_identifier;
 +
 +    int64_t interleaver_chunk_size;
 +    int64_t interleaver_chunk_duration;
 +
 +    /**
 +     * stream probing state
 +     * -1   -> probing finished
 +     *  0   -> no probing requested
 +     * rest -> perform probing with request_probe being the minimum score to accept.
 +     * NOT PART OF PUBLIC API
 +     */
 +    int request_probe;
 +    /**
 +     * Indicates that everything up to the next keyframe
 +     * should be discarded.
 +     */
 +    int skip_to_keyframe;
 +
 +    /**
 +     * Number of samples to skip at the start of the frame decoded from the next packet.
 +     */
 +    int skip_samples;
 +
 +    /**
 +     * Number of internally decoded frames, used internally in libavformat, do not access
 +     * its lifetime differs from info which is why it is not in that structure.
 +     */
 +    int nb_decoded_frames;
 +
 +    /**
 +     * Timestamp offset added to timestamps before muxing
 +     * NOT PART OF PUBLIC API
 +     */
 +    int64_t mux_ts_offset;
 +
 +    /**
 +     * Internal data to check for wrapping of the time stamp
 +     */
 +    int64_t pts_wrap_reference;
 +
 +    /**
 +     * Options for behavior, when a wrap is detected.
 +     *
 +     * Defined by AV_PTS_WRAP_ values.
 +     *
 +     * If correction is enabled, there are two possibilities:
 +     * If the first time stamp is near the wrap point, the wrap offset
 +     * will be subtracted, which will create negative time stamps.
 +     * Otherwise the offset will be added.
 +     */
 +    int pts_wrap_behavior;
 +
 +    /**
 +     * Internal data to prevent doing update_initial_durations() twice
 +     */
 +    int update_initial_durations_done;
 +
 +    /**
 +     * Internal data to generate dts from pts
 +     */
 +    int64_t pts_reorder_error[MAX_REORDER_DELAY+1];
 +    uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1];
 +
 +    /**
 +     * Internal data to analyze DTS and detect faulty mpeg streams
 +     */
 +    int64_t last_dts_for_order_check;
 +    uint8_t dts_ordered;
 +    uint8_t dts_misordered;
 +
  } AVStream;
  
 +AVRational av_stream_get_r_frame_rate(const AVStream *s);
 +void       av_stream_set_r_frame_rate(AVStream *s, AVRational r);
 +
  #define AV_PROGRAM_RUNNING 1
  
  /**
@@@ -1015,23 -860,6 +1037,23 @@@ typedef struct AVProgram 
      unsigned int   *stream_index;
      unsigned int   nb_stream_indexes;
      AVDictionary *metadata;
 +
 +    int program_num;
 +    int pmt_pid;
 +    int pcr_pid;
 +
 +    /*****************************************************************
 +     * All fields below this line are not part of the public API. They
 +     * may not be used outside of libavformat and can be changed and
 +     * removed at will.
 +     * New public fields should be added right above.
 +     *****************************************************************
 +     */
 +    int64_t start_time;
 +    int64_t end_time;
 +
 +    int64_t pts_wrap_reference;    ///< reference dts for wrap detection
 +    int pts_wrap_behavior;         ///< behavior on wrap detection
  } AVProgram;
  
  #define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
@@@ -1044,24 -872,6 +1066,24 @@@ typedef struct AVChapter 
      AVDictionary *metadata;
  } AVChapter;
  
 +
 +/**
 + * Callback used by devices to communicate with application.
 + */
 +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type,
 +                                         void *data, size_t data_size);
 +
 +
 +/**
 + * The duration of a video can be estimated through various ways, and this enum can be used
 + * to know how the duration was estimated.
 + */
 +enum AVDurationEstimationMethod {
 +    AVFMT_DURATION_FROM_PTS,    ///< Duration accurately estimated from PTSes
 +    AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration
 +    AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate)
 +};
 +
  typedef struct AVFormatInternal AVFormatInternal;
  
  /**
@@@ -1168,7 -978,7 +1190,7 @@@ typedef struct AVFormatContext 
      /**
       * 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;
  
  #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_FLUSH_PACKETS    0x0200 ///< Flush the AVIOContext every packet.
 +#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 ///< Don't merge side data but keep it separate.
  
      /**
       * Maximum size of the data read from input for determining
       * Start time of the stream in real world time, in microseconds
       * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the
       * stream was captured at this real world time.
 -     * Muxing only, set by the caller before avformat_write_header().
 +     * - muxing: Set by the caller before avformat_write_header(). If set to
 +     *           either 0 or AV_NOPTS_VALUE, then the current wall-time will
 +     *           be used.
 +     * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that
 +     *             the value may become known after some number of frames
 +     *             have been received.
       */
      int64_t start_time_realtime;
  
       */
      int64_t max_interleave_delta;
  
 +    /**
 +     * Transport stream id.
 +     * This will be moved into demuxer private options. Thus no API/ABI compatibility
 +     */
 +    int ts_id;
 +
 +    /**
 +     * Audio preload in microseconds.
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int audio_preload;
 +
 +    /**
 +     * Max chunk time in microseconds.
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int max_chunk_duration;
 +
 +    /**
 +     * Max chunk size in bytes
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int max_chunk_size;
 +
 +    /**
 +     * forces the use of wallclock timestamps as pts/dts of packets
 +     * This has undefined results in the presence of B frames.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int use_wallclock_as_timestamps;
 +
 +    /**
 +     * Avoid negative timestamps during muxing.
 +     *  0 -> allow negative timestamps
 +     *  1 -> avoid negative timestamps
 +     * -1 -> choose automatically (default)
 +     * Note, this only works when interleave_packet_per_dts is in use.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int avoid_negative_ts;
 +
 +    /**
 +     * avio flags, used to force AVIO_FLAG_DIRECT.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int avio_flags;
 +
 +    /**
 +     * The duration field can be estimated through various ways, and this field can be used
 +     * to know how the duration was estimated.
 +     * - encoding: unused
 +     * - decoding: Read by user via AVOptions (NO direct access)
 +     */
 +    enum AVDurationEstimationMethod duration_estimation_method;
 +
 +    /**
 +     * Skip initial bytes when opening stream
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    unsigned int skip_initial_bytes;
 +
 +    /**
 +     * Correct single timestamp overflows
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    unsigned int correct_ts_overflow;
 +
 +    /**
 +     * Force seeking to any (also non key) frames.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int seek2any;
 +
 +    /**
 +     * Flush the I/O context after each packet.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int flush_packets;
 +
 +    /**
 +     * format probing score.
 +     * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes
 +     * the format.
 +     * - encoding: unused
 +     * - decoding: set by avformat, read by user via av_format_get_probe_score() (NO direct access)
 +     */
 +    int probe_score;
 +
      /*****************************************************************
       * All fields below this line are not part of the public API. They
       * may not be used outside of libavformat and can be changed and
      /**
       * Offset to remap timestamps to be non-negative.
       * Expressed in timebase units.
 +     * @see AVStream.mux_ts_offset
       */
      int64_t offset;
  
       * Must not be accessed in any way by callers.
       */
      AVFormatInternal *internal;
 +
 +    /**
 +     * IO repositioned flag.
 +     * This is set by avformat when the underlaying IO context read pointer
 +     * is repositioned, for example when doing byte based seeking.
 +     * Demuxers can use the flag to detect such changes.
 +     */
 +    int io_repositioned;
 +
 +    /**
 +     * Forced video codec.
 +     * This allows forcing a specific decoder, even when there are multiple with
 +     * the same codec_id.
 +     * Demuxing: Set by user via av_format_set_video_codec (NO direct access).
 +     */
 +    AVCodec *video_codec;
 +
 +    /**
 +     * Forced audio codec.
 +     * This allows forcing a specific decoder, even when there are multiple with
 +     * the same codec_id.
 +     * Demuxing: Set by user via av_format_set_audio_codec (NO direct access).
 +     */
 +    AVCodec *audio_codec;
 +
 +    /**
 +     * Forced subtitle codec.
 +     * This allows forcing a specific decoder, even when there are multiple with
 +     * the same codec_id.
 +     * Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access).
 +     */
 +    AVCodec *subtitle_codec;
 +
 +    /**
 +     * Number of bytes to be written as padding in a metadata header.
 +     * Demuxing: Unused.
 +     * Muxing: Set by user via av_format_set_metadata_header_padding.
 +     */
 +    int metadata_header_padding;
 +
 +    /**
 +     * User data.
 +     * This is a place for some private data of the user.
 +     * Mostly usable with control_message_cb or any future callbacks in device's context.
 +     */
 +    void *opaque;
 +
 +    /**
 +     * Callback used by devices to communicate with application.
 +     */
 +    av_format_control_message control_message_cb;
 +
 +    /**
 +     * Output timestamp offset, in microseconds.
 +     * Muxing: set by user via AVOptions (NO direct access)
 +     */
 +    int64_t output_ts_offset;
  } AVFormatContext;
  
 +int av_format_get_probe_score(const AVFormatContext *s);
 +AVCodec * av_format_get_video_codec(const AVFormatContext *s);
 +void      av_format_set_video_codec(AVFormatContext *s, AVCodec *c);
 +AVCodec * av_format_get_audio_codec(const AVFormatContext *s);
 +void      av_format_set_audio_codec(AVFormatContext *s, AVCodec *c);
 +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s);
 +void      av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c);
 +int       av_format_get_metadata_header_padding(const AVFormatContext *s);
 +void      av_format_set_metadata_header_padding(AVFormatContext *s, int c);
 +void *    av_format_get_opaque(const AVFormatContext *s);
 +void      av_format_set_opaque(AVFormatContext *s, void *opaque);
 +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s);
 +void      av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback);
 +
 +/**
 + * Returns the method used to set ctx->duration.
 + *
 + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE.
 + */
 +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx);
 +
  typedef struct AVPacketList {
      AVPacket pkt;
      struct AVPacketList *next;
@@@ -1606,6 -1227,7 +1628,6 @@@ const char *avformat_license(void)
   *
   * @see av_register_input_format()
   * @see av_register_output_format()
 - * @see av_register_protocol()
   */
  void av_register_all(void);
  
@@@ -1671,9 -1293,6 +1693,9 @@@ const AVClass *avformat_get_class(void)
   *
   * When muxing, should be called by the user before avformat_write_header().
   *
 + * User is required to call avcodec_close() and avformat_free_context() to
 + * clean up the allocation by avformat_new_stream().
 + *
   * @param s media file handle
   * @param c If non-NULL, the AVCodecContext corresponding to the new stream
   * will be initialized to use this codec. This is needed for e.g. codec-specific
   *
   * @return newly created stream or NULL on error.
   */
 -AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c);
 +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
  
  AVProgram *av_new_program(AVFormatContext *s, int id);
  
   */
  
  
 +#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);
 +
  /**
   * @addtogroup lavf_decoding
   * @{
@@@ -1752,15 -1342,6 +1774,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
   * @param logctx the log context
   * @param offset the offset within the bytestream to probe from
   * @param max_probe_size the maximum probe buffer size (zero for default)
 - * @return 0 in case of success, a negative value corresponding to an
 + * @return the score in case of success, a negative value corresponding to an
 + *         the maximal score is AVPROBE_SCORE_MAX
   * AVERROR code otherwise
   */
 +int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
 +                           const char *filename, void *logctx,
 +                           unsigned int offset, unsigned int max_probe_size);
 +
 +/**
 + * Like av_probe_input_buffer2() but returns 0 on success
 + */
  int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
                            const char *filename, void *logctx,
                            unsigned int offset, unsigned int max_probe_size);
   */
  int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
  
 +attribute_deprecated
 +int av_demuxer_open(AVFormatContext *ic);
 +
 +#if FF_API_FORMAT_PARAMETERS
 +/**
 + * Read packets of a media file to get stream information. This
 + * is useful for file formats with no headers such as MPEG. This
 + * function also computes the real framerate in case of MPEG-2 repeat
 + * frame mode.
 + * The logical file position is not changed by this function;
 + * examined packets may be buffered for later processing.
 + *
 + * @param ic media file handle
 + * @return >=0 if OK, AVERROR_xxx on error
 + * @todo Let the user decide somehow what information is needed so that
 + *       we do not waste time getting stuff the user does not need.
 + *
 + * @deprecated use avformat_find_stream_info.
 + */
 +attribute_deprecated
 +int av_find_stream_info(AVFormatContext *ic);
 +#endif
 +
  /**
   * Read packets of a media file to get stream information. This
   * is useful for file formats with no headers such as MPEG. This
   */
  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
@@@ -1898,24 -1436,6 +1920,24 @@@ int av_find_best_stream(AVFormatContex
                          AVCodec **decoder_ret,
                          int flags);
  
 +#if FF_API_READ_PACKET
 +/**
 + * @deprecated use AVFMT_FLAG_NOFILLIN | AVFMT_FLAG_NOPARSE to read raw
 + * unprocessed packets
 + *
 + * Read a transport packet from a media file.
 + *
 + * This function is obsolete and should never be used.
 + * Use av_read_frame() instead.
 + *
 + * @param s media file handle
 + * @param pkt is filled
 + * @return 0 if OK, AVERROR_xxx on error
 + */
 +attribute_deprecated
 +int av_read_packet(AVFormatContext *s, AVPacket *pkt);
 +#endif
 +
  /**
   * Return the next frame of a stream.
   * This function returns what is stored in the file, and does not validate
@@@ -1972,7 -1492,6 +1994,7 @@@ int av_seek_frame(AVFormatContext *s, i
   * or if stream_index is -1, in AV_TIME_BASE units.
   * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as
   * keyframes (this may not be supported by all demuxers).
 + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored.
   *
   * @param s media file handle
   * @param stream_index index of the stream which is used as time base reference
@@@ -2001,17 -1520,6 +2023,17 @@@ int av_read_play(AVFormatContext *s)
   */
  int av_read_pause(AVFormatContext *s);
  
 +#if FF_API_CLOSE_INPUT_FILE
 +/**
 + * @deprecated use avformat_close_input()
 + * Close a media file (but not its codecs).
 + *
 + * @param s media file handle
 + */
 +attribute_deprecated
 +void av_close_input_file(AVFormatContext *s);
 +#endif
 +
  /**
   * Close an opened input AVFormatContext. Free it and all its contents
   * and set *s to NULL.
@@@ -2021,30 -1529,6 +2043,30 @@@ void avformat_close_input(AVFormatConte
   * @}
   */
  
 +#if FF_API_NEW_STREAM
 +/**
 + * Add a new stream to a media file.
 + *
 + * Can only be called in the read_header() function. If the flag
 + * AVFMTCTX_NOHEADER is in the format context, then new streams
 + * can be added in read_packet too.
 + *
 + * @param s media file handle
 + * @param id file-format-dependent stream ID
 + */
 +attribute_deprecated
 +AVStream *av_new_stream(AVFormatContext *s, int id);
 +#endif
 +
 +#if FF_API_SET_PTS_INFO
 +/**
 + * @deprecated this function is not supposed to be called outside of lavf
 + */
 +attribute_deprecated
 +void av_set_pts_info(AVStream *s, int pts_wrap_bits,
 +                     unsigned int pts_num, unsigned int pts_den);
 +#endif
 +
  #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
  #define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes
  #define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes
@@@ -2138,44 -1622,6 +2160,44 @@@ int av_write_frame(AVFormatContext *s, 
   */
  int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);
  
 +/**
 + * Write a uncoded frame to an output media file.
 + *
 + * The frame must be correctly interleaved according to the container
 + * specification; if not, then av_interleaved_write_frame() must be used.
 + *
 + * See av_interleaved_write_frame() for details.
 + */
 +int av_write_uncoded_frame(AVFormatContext *s, int stream_index,
 +                           AVFrame *frame);
 +
 +/**
 + * Write a uncoded frame to an output media file.
 + *
 + * If the muxer supports it, this function allows to write an AVFrame
 + * structure directly, without encoding it into a packet.
 + * It is mostly useful for devices and similar special muxers that use raw
 + * video or PCM data and will not serialize it into a byte stream.
 + *
 + * To test whether it is possible to use it with a given muxer and stream,
 + * use av_write_uncoded_frame_query().
 + *
 + * The caller gives up ownership of the frame and must not access it
 + * afterwards.
 + *
 + * @return  >=0 for success, a negative code on error
 + */
 +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index,
 +                                       AVFrame *frame);
 +
 +/**
 + * Test whether a muxer supports uncoded frame.
 + *
 + * @return  >=0 if an uncoded frame can be written to that muxer and stream,
 + *          <0 if not
 + */
 +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index);
 +
  /**
   * Write the stream trailer to an output media file and free the
   * file private data.
@@@ -2210,25 -1656,6 +2232,25 @@@ enum AVCodecID av_guess_codec(AVOutputF
                              const char *filename, const char *mime_type,
                              enum AVMediaType type);
  
 +/**
 + * 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[out] dts   DTS of the last packet output for the stream, in stream
 + *                   time_base units
 + * @param[out] wall  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);
 +
 +
  /**
   * @}
   */
@@@ -2313,18 -1740,6 +2335,18 @@@ enum AVCodecID av_codec_get_id(const st
   */
  unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id);
  
 +/**
 + * Get the codec tag for the given codec id.
 + *
 + * @param tags list of supported codec_id - codec_tag pairs, as stored
 + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
 + * @param id codec id that should be searched for in the list
 + * @param tag A pointer to the found tag
 + * @return 0 if id was not found in tags, > 0 if it was found
 + */
 +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id,
 +                      unsigned int *tag);
 +
  int av_find_default_stream_index(AVFormatContext *s);
  
  /**
@@@ -2376,13 -1791,7 +2398,13 @@@ void av_url_split(char *proto,         
                    char *path,          int path_size,
                    const char *url);
  
 -
 +/**
 + * log a nice Dump of input format context or output format context
 + * @param ic already initialized Format Context, must not be NULL.
 + * @param index index of the stream to dump information about
 + * @param url name of file or URL of stream to print information about
 + * @param is_output Select whether specified context is of input(0) or output(1)
 + */
  void av_dump_format(AVFormatContext *ic,
                      int index,
                      const char *url,
@@@ -2471,67 -1880,10 +2493,67 @@@ const struct AVCodecTag *avformat_get_r
   * @return the table mapping RIFF FourCCs for audio to AVCodecID.
   */
  const struct AVCodecTag *avformat_get_riff_audio_tags(void);
 +/**
 + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID.
 + */
 +const struct AVCodecTag *avformat_get_mov_video_tags(void);
 +/**
 + * @return the table mapping MOV FourCCs for audio to AVCodecID.
 + */
 +const struct AVCodecTag *avformat_get_mov_audio_tags(void);
 +
  /**
   * @}
   */
  
 +/**
 + * Guess the sample aspect ratio of a frame, based on both the stream and the
 + * frame aspect ratio.
 + *
 + * Since the frame aspect ratio is set by the codec but the stream aspect ratio
 + * is set by the demuxer, these two may not be equal. This function tries to
 + * return the value that you should use if you would like to display the frame.
 + *
 + * Basic logic is to use the stream aspect ratio if it is set to something sane
 + * otherwise use the frame aspect ratio. This way a container setting, which is
 + * usually easy to modify can override the coded value in the frames.
 + *
 + * @param format the format context which the stream is part of
 + * @param stream the stream which the frame is part of
 + * @param frame the frame with the aspect ratio to be determined
 + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea
 + */
 +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame);
 +
 +/**
 + * Guess the frame rate, based on both the container and codec information.
 + *
 + * @param ctx the format context which the stream is part of
 + * @param stream the stream which the frame is part of
 + * @param frame the frame for which the frame rate should be determined, may be NULL
 + * @return the guessed (valid) frame rate, 0/1 if no idea
 + */
 +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame);
 +
 +/**
 + * Check if the stream st contained in s is matched by the stream specifier
 + * spec.
 + *
 + * See the "stream specifiers" chapter in the documentation for the syntax
 + * of spec.
 + *
 + * @return  >0 if st is matched by spec;
 + *          0  if st is not matched by spec;
 + *          AVERROR code if spec is invalid
 + *
 + * @note  A stream specifier can match several streams in the format.
 + */
 +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
 +                                    const char *spec);
 +
 +int avformat_queue_attached_pictures(AVFormatContext *s);
 +
 +
  /**
   * @}
   */
diff --combined libavformat/utils.c
@@@ -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
   */
  
  #include "libavutil/parseutils.h"
  #include "libavutil/pixdesc.h"
  #include "libavutil/time.h"
 +#include "libavutil/timestamp.h"
  
  #include "libavcodec/bytestream.h"
  #include "libavcodec/internal.h"
 +#include "libavcodec/raw.h"
  
  #include "audiointerleave.h"
  #include "avformat.h"
  
  /**
   * @file
 - * various utility functions for use within Libav
 + * various utility functions for use within FFmpeg
   */
  
  unsigned avformat_version(void)
  {
 +    av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
      return LIBAVFORMAT_VERSION_INT;
  }
  
  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;
 +}
 +
 +#define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
 +
 +static int is_relative(int64_t ts) {
 +    return ts > (RELATIVE_TS_BASE - (1LL<<48));
 +}
 +
 +/**
 + * Wrap a given time stamp, if there is an indication for an overflow
 + *
 + * @param st stream
 + * @param timestamp the time stamp to wrap
 + * @return resulting time stamp
 + */
 +static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
 +{
 +    if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
 +        st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
 +        if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
 +            timestamp < st->pts_wrap_reference)
 +            return timestamp + (1ULL << st->pts_wrap_bits);
 +        else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
 +            timestamp >= st->pts_wrap_reference)
 +            return timestamp - (1ULL << st->pts_wrap_bits);
 +    }
 +    return timestamp;
 +}
 +
 +MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
 +MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
 +MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
 +MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
 +MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
 +MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
 +MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
 +
 +static AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
 +{
 +    if (st->codec->codec)
 +        return st->codec->codec;
 +
 +    switch (st->codec->codec_type) {
 +    case AVMEDIA_TYPE_VIDEO:
 +        if (s->video_codec)    return s->video_codec;
 +        break;
 +    case AVMEDIA_TYPE_AUDIO:
 +        if (s->audio_codec)    return s->audio_codec;
 +        break;
 +    case AVMEDIA_TYPE_SUBTITLE:
 +        if (s->subtitle_codec) return s->subtitle_codec;
 +        break;
 +    }
 +
 +    return avcodec_find_decoder(codec_id);
 +}
 +
 +int av_format_get_probe_score(const AVFormatContext *s)
 +{
 +    return s->probe_score;
  }
  
  /* an arbitrarily chosen "sane" max packet size -- 50M */
  #define SANE_CHUNK_SIZE (50000000)
  
 +int ffio_limit(AVIOContext *s, int size)
 +{
 +    if (s->maxsize>= 0) {
 +        int64_t remaining= s->maxsize - avio_tell(s);
 +        if (remaining < size) {
 +            int64_t newsize = avio_size(s);
 +            if (!s->maxsize || s->maxsize<newsize)
 +                s->maxsize = newsize - !newsize;
 +            remaining= s->maxsize - avio_tell(s);
 +            remaining= FFMAX(remaining, 0);
 +        }
 +
 +        if (s->maxsize>= 0 && remaining+1 < size) {
 +            av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
 +            size = remaining+1;
 +        }
 +    }
 +    return size;
 +}
 +
  /* Read the data in sane-sized chunks and append to pkt.
   * Return the number of bytes read or an error. */
  static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
  {
 -    int64_t chunk_size = size;
      int64_t orig_pos   = pkt->pos; // av_grow_packet might reset pos
      int orig_size      = pkt->size;
 -    int ret = 0;
 +    int ret;
  
      do {
          int prev_size = pkt->size;
  
          /* When the caller requests a lot of data, limit it to the amount
           * left in file or SANE_CHUNK_SIZE when it is not known. */
 -        if (size > SANE_CHUNK_SIZE) {
 -            int64_t filesize = avio_size(s) - avio_tell(s);
 -            chunk_size = FFMAX(filesize, SANE_CHUNK_SIZE);
 +        read_size = size;
 +        if (read_size > SANE_CHUNK_SIZE/10) {
 +            read_size = ffio_limit(s, read_size);
 +            // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
 +            if (s->maxsize < 0)
 +                read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
          }
 -        read_size = FFMIN(size, chunk_size);
  
          ret = av_grow_packet(pkt, read_size);
          if (ret < 0)
  
          size -= read_size;
      } while (size > 0);
 +    if (size > 0)
 +        pkt->flags |= AV_PKT_FLAG_CORRUPT;
  
      pkt->pos = orig_pos;
      if (!pkt->size)
@@@ -225,24 -139,20 +225,24 @@@ int av_filename_number_test(const char 
             (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, nodat = 0, score_max = 0;
 +    const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
 +
 +    if (!lpd.buf)
 +        lpd.buf = zerobuffer;
  
      if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
          int id3len = ff_id3v2_tag_len(lpd.buf);
          if (lpd.buf_size > id3len + 16) {
              lpd.buf      += id3len;
              lpd.buf_size -= id3len;
 -        }
 -        id3 = 1;
 +        } else
 +            nodat = 1;
      }
  
      fmt = NULL;
          score = 0;
          if (fmt1->read_probe) {
              score = fmt1->read_probe(&lpd);
 +            if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
 +                score = FFMAX(score, nodat ? AVPROBE_SCORE_EXTENSION / 2 - 1 : 1);
          } else if (fmt1->extensions) {
              if (av_match_ext(lpd.filename, fmt1->extensions))
                  score = AVPROBE_SCORE_EXTENSION;
          }
 -        if (score > *score_max) {
 -            *score_max = score;
 -            fmt        = fmt1;
 -        } else if (score == *score_max)
 +        if (score > score_max) {
 +            score_max = score;
 +            fmt       = fmt1;
 +        } else if (score == score_max)
              fmt = NULL;
      }
 -
 -    // A hack for files with huge id3v2 tags -- try to guess by file extension.
 -    if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions &&
 -                av_match_ext(lpd.filename, fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_EXTENSION / 2;
 -                break;
 -            }
 -    }
 -
 -    if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1;
 -                break;
 -            }
 -    }
 +    if (nodat)
 +        score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
 +    *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;
  }
  
  static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
 -                                     AVProbeData *pd, int score)
 +                                     AVProbeData *pd)
  {
      static const struct {
          const char *name;
          { "dts",       AV_CODEC_ID_DTS,        AVMEDIA_TYPE_AUDIO },
          { "eac3",      AV_CODEC_ID_EAC3,       AVMEDIA_TYPE_AUDIO },
          { "h264",      AV_CODEC_ID_H264,       AVMEDIA_TYPE_VIDEO },
 +        { "hevc",      AV_CODEC_ID_HEVC,       AVMEDIA_TYPE_VIDEO },
 +        { "loas",      AV_CODEC_ID_AAC_LATM,   AVMEDIA_TYPE_AUDIO },
          { "m4v",       AV_CODEC_ID_MPEG4,      AVMEDIA_TYPE_VIDEO },
          { "mp3",       AV_CODEC_ID_MP3,        AVMEDIA_TYPE_AUDIO },
          { "mpegvideo", AV_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) {
 +    if (fmt && st->request_probe <= score) {
          int i;
          av_log(s, AV_LOG_DEBUG,
                 "Probe with size=%d, packets=%d detected %s with score=%d\n",
              }
          }
      }
 -    return !!fmt;
 +    return score;
  }
  
  /************************************************************/
  /* input media file */
  
 -/** size of probe buffer, for guessing file type from file contents */
 -#define PROBE_BUF_MIN 2048
 -#define PROBE_BUF_MAX (1 << 20)
 +int av_demuxer_open(AVFormatContext *ic) {
 +    int err;
  
 -int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
 +    if (ic->iformat->read_header) {
 +        err = ic->iformat->read_header(ic);
 +        if (err < 0)
 +            return err;
 +    }
 +
 +    if (ic->pb && !ic->data_offset)
 +        ic->data_offset = avio_tell(ic->pb);
 +
 +    return 0;
 +}
 +
 +
 +int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
                            const char *filename, void *logctx,
                            unsigned int offset, unsigned int max_probe_size)
  {
      AVProbeData pd = { filename ? filename : "" };
      uint8_t *buf = NULL;
 -    int ret = 0, probe_size;
 +    uint8_t *mime_type;
 +    int ret = 0, probe_size, buf_offset = 0;
 +    int score = 0;
  
      if (!max_probe_size)
          max_probe_size = PROBE_BUF_MAX;
      else if (max_probe_size > PROBE_BUF_MAX)
          max_probe_size = PROBE_BUF_MAX;
 -    else if (max_probe_size < PROBE_BUF_MIN)
 +    else if (max_probe_size < PROBE_BUF_MIN) {
 +        av_log(logctx, AV_LOG_ERROR,
 +               "Specified probe size value %u cannot be < %u\n", max_probe_size, PROBE_BUF_MIN);
          return AVERROR(EINVAL);
 +    }
  
      if (offset >= max_probe_size)
          return AVERROR(EINVAL);
 -    avio_skip(pb, offset);
 -    max_probe_size -= offset;
 +
 +    if (!*fmt && pb->av_class && av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type) >= 0 && mime_type) {
 +        if (!av_strcasecmp(mime_type, "audio/aacp")) {
 +            *fmt = av_find_input_format("aac");
 +        }
 +        av_freep(&mime_type);
 +    }
  
      for (probe_size = PROBE_BUF_MIN; probe_size <= max_probe_size && !*fmt;
           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;
 +        score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
  
          /* Read probe data. */
          if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) < 0)
              return ret;
 -        if ((ret = avio_read(pb, buf + pd.buf_size,
 -                             probe_size - pd.buf_size)) < 0) {
 +        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) {
                  av_free(buf);
              score = 0;
              ret   = 0;          /* error was end of file, nothing read */
          }
 -        pd.buf_size += ret;
 -        pd.buf       = buf;
 +        buf_offset += ret;
 +        if (buf_offset < offset)
 +            continue;
 +        pd.buf_size = buf_offset - offset;
 +        pd.buf = &buf[offset];
  
          memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
  
          *fmt = av_probe_input_format2(&pd, 1, &score);
          if (*fmt) {
              /* This can only be true in the last iteration. */
 -            if (score <= AVPROBE_SCORE_MAX / 4) {
 +            if (score <= AVPROBE_SCORE_RETRY) {
                  av_log(logctx, AV_LOG_WARNING,
 -                       "Format detected only with low score of %d, "
 -                       "misdetection possible!\n", score);
 +                       "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);
 +                       "Format %s probed with size=%d and score=%d\n",
 +                       (*fmt)->name, probe_size, score);
 +#if 0
 +            FILE *f = fopen("probestat.tmp", "ab");
 +            fprintf(f, "probe_size:%d format:%s score:%d filename:%s\n", probe_size, (*fmt)->name, score, filename);
 +            fclose(f);
 +#endif
          }
      }
  
      }
  
      /* Rewind. Reuse probe buffer to avoid seeking. */
 -    if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
 -        av_free(buf);
 +    ret = ffio_rewind_with_probe_data(pb, &buf, buf_offset);
  
 -    return ret;
 +    return ret < 0 ? ret : score;
 +}
 +
 +int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
 +                          const char *filename, void *logctx,
 +                          unsigned int offset, unsigned int max_probe_size)
 +{
 +    int ret = av_probe_input_buffer2(pb, fmt, filename, logctx, offset, max_probe_size);
 +    return ret < 0 ? ret : 0;
  }
  
  /* Open input file and probe the format if necessary. */
@@@ -448,29 -319,27 +448,29 @@@ static int init_input(AVFormatContext *
  {
      int ret;
      AVProbeData pd = { filename, NULL, 0 };
 +    int score = AVPROBE_SCORE_RETRY;
  
      if (s->pb) {
          s->flags |= AVFMT_FLAG_CUSTOM_IO;
          if (!s->iformat)
 -            return av_probe_input_buffer(s->pb, &s->iformat, filename,
 +            return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                                           s, 0, s->probesize);
          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;
      }
  
      if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
 -        (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
 -        return 0;
 +        (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
 +        return score;
  
 -    if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
 +    if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
                            &s->interrupt_callback, options)) < 0)
          return ret;
      if (s->iformat)
          return 0;
 -    return av_probe_input_buffer(s->pb, &s->iformat, filename,
 +    return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                                   s, 0, s->probesize);
  }
  
@@@ -492,7 -361,7 +492,7 @@@ static AVPacket *add_to_pktbuf(AVPacket
      return &pktl->pkt;
  }
  
 -static int queue_attached_pictures(AVFormatContext *s)
 +int avformat_queue_attached_pictures(AVFormatContext *s)
  {
      int i;
      for (i = 0; i < s->nb_streams; i++)
@@@ -519,10 -388,6 +519,10 @@@ int avformat_open_input(AVFormatContex
  
      if (!s && !(s = avformat_alloc_context()))
          return AVERROR(ENOMEM);
 +    if (!s->av_class) {
 +        av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
 +        return AVERROR(EINVAL);
 +    }
      if (fmt)
          s->iformat = fmt;
  
  
      if ((ret = init_input(s, filename, &tmp)) < 0)
          goto fail;
 +    s->probe_score = ret;
 +    avio_skip(s->pb, s->skip_initial_bytes);
  
      /* Check filename in case an image number is expected. */
      if (s->iformat->flags & AVFMT_NEEDNUMBER) {
      if (s->pb)
          ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
  
 -    if (s->iformat->read_header)
 +    if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
          if ((ret = s->iformat->read_header(s)) < 0)
              goto fail;
  
 -    if (id3v2_extra_meta &&
 -        (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
 -        goto fail;
 +    if (id3v2_extra_meta) {
 +        if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
 +            !strcmp(s->iformat->name, "tta")) {
 +            if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
 +                goto fail;
 +        } else
 +            av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
 +    }
      ff_id3v2_free_extra_meta(&id3v2_extra_meta);
  
 -    if ((ret = queue_attached_pictures(s)) < 0)
 +    if ((ret = avformat_queue_attached_pictures(s)) < 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;
@@@ -607,138 -465,44 +607,138 @@@ fail
  
  /*******************************************************/
  
 +static void force_codec_ids(AVFormatContext *s, AVStream *st)
 +{
 +    switch (st->codec->codec_type) {
 +    case AVMEDIA_TYPE_VIDEO:
 +        if (s->video_codec_id)
 +            st->codec->codec_id = s->video_codec_id;
 +        break;
 +    case AVMEDIA_TYPE_AUDIO:
 +        if (s->audio_codec_id)
 +            st->codec->codec_id = s->audio_codec_id;
 +        break;
 +    case AVMEDIA_TYPE_SUBTITLE:
 +        if (s->subtitle_codec_id)
 +            st->codec->codec_id = s->subtitle_codec_id;
 +        break;
 +    }
 +}
 +
  static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
  {
 -    if (st->codec->codec_id == AV_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;
  
          if (pkt) {
 -            int err;
 -            if ((err = av_reallocp(&pd->buf, pd->buf_size + pkt->size +
 -                                   AVPROBE_PADDING_SIZE)) < 0)
 -                return err;
 +            uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
 +            if (!new_buf) {
 +                av_log(s, AV_LOG_WARNING,
 +                       "Failed to reallocate probe buffer for stream %d\n",
 +                       st->index);
 +                goto no_packet;
 +            }
 +            pd->buf = new_buf;
              memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
              pd->buf_size += pkt->size;
              memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
          } else {
 +no_packet:
              st->probe_packets = 0;
              if (!pd->buf_size) {
 -                av_log(s, AV_LOG_ERROR,
 +                av_log(s, AV_LOG_WARNING,
                         "nothing to probe for stream %d\n", st->index);
 -                return 0;
              }
          }
  
 -        if (!st->probe_packets ||
 -            av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
 -            set_codec_from_probe_data(s, st, pd, st->probe_packets > 0
 -                                                 ? AVPROBE_SCORE_MAX / 4 : 0);
 -            if (st->codec->codec_id != AV_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 != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
 +                || end) {
                  pd->buf_size = 0;
                  av_freep(&pd->buf);
 -                av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
 +                st->request_probe = -1;
 +                if (st->codec->codec_id != AV_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);
              }
 +            force_codec_ids(s, st);
          }
      }
      return 0;
  }
  
 +static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
 +{
 +    int64_t ref = pkt->dts;
 +    int i, pts_wrap_behavior;
 +    int64_t pts_wrap_reference;
 +    AVProgram *first_program;
 +
 +    if (ref == AV_NOPTS_VALUE)
 +        ref = pkt->pts;
 +    if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
 +        return 0;
 +    ref &= (1LL << st->pts_wrap_bits)-1;
 +
 +    // reference time stamp should be 60 s before first time stamp
 +    pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
 +    // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
 +    pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
 +        (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
 +        AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
 +
 +    first_program = av_find_program_from_stream(s, NULL, stream_index);
 +
 +    if (!first_program) {
 +        int default_stream_index = av_find_default_stream_index(s);
 +        if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
 +            for (i = 0; i < s->nb_streams; i++) {
 +                s->streams[i]->pts_wrap_reference = pts_wrap_reference;
 +                s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
 +            }
 +        }
 +        else {
 +            st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
 +            st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
 +        }
 +    }
 +    else {
 +        AVProgram *program = first_program;
 +        while (program) {
 +            if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
 +                pts_wrap_reference = program->pts_wrap_reference;
 +                pts_wrap_behavior = program->pts_wrap_behavior;
 +                break;
 +            }
 +            program = av_find_program_from_stream(s, program, stream_index);
 +        }
 +
 +        // update every program with differing pts_wrap_reference
 +        program = first_program;
 +        while (program) {
 +            if (program->pts_wrap_reference != pts_wrap_reference) {
 +                for (i = 0; i<program->nb_stream_indexes; i++) {
 +                    s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
 +                    s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
 +                }
 +
 +                program->pts_wrap_reference = pts_wrap_reference;
 +                program->pts_wrap_behavior = pts_wrap_behavior;
 +            }
 +            program = av_find_program_from_stream(s, program, stream_index);
 +        }
 +    }
 +    return 1;
 +}
 +
  int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
  {
      int ret, i, err;
          if (pktl) {
              *pkt = pktl->pkt;
              st   = s->streams[pkt->stream_index];
 -            if (st->codec->codec_id != AV_CODEC_ID_PROBE ||
 -                !st->probe_packets ||
 -                s->raw_packet_buffer_remaining_size < pkt->size) {
 -                AVProbeData *pd;
 -                if (st->probe_packets)
 -                    if ((err = probe_codec(s, st, NULL)) < 0)
 -                        return err;
 -                pd = &st->probe_data;
 -                av_freep(&pd->buf);
 -                pd->buf_size = 0;
 +            if (s->raw_packet_buffer_remaining_size <= 0)
 +                if ((err = probe_codec(s, st, NULL)) < 0)
 +                    return err;
 +            if (st->request_probe <= 0) {
                  s->raw_packet_buffer                 = pktl->next;
                  s->raw_packet_buffer_remaining_size += pkt->size;
                  av_free(pktl);
                  if (st->probe_packets)
                      if ((err = probe_codec(s, st, NULL)) < 0)
                          return err;
 +                av_assert0(st->request_probe <= 0);
              }
              continue;
          }
              continue;
          }
  
 +        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) {
 -        case AVMEDIA_TYPE_VIDEO:
 -            if (s->video_codec_id)
 -                st->codec->codec_id = s->video_codec_id;
 -            break;
 -        case AVMEDIA_TYPE_AUDIO:
 -            if (s->audio_codec_id)
 -                st->codec->codec_id = s->audio_codec_id;
 -            break;
 -        case AVMEDIA_TYPE_SUBTITLE:
 -            if (s->subtitle_codec_id)
 -                st->codec->codec_id = s->subtitle_codec_id;
 -            break;
 +        if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
 +            // correct first time stamps to negative values
 +            if (!is_relative(st->first_dts))
 +                st->first_dts = wrap_timestamp(st, st->first_dts);
 +            if (!is_relative(st->start_time))
 +                st->start_time = wrap_timestamp(st, st->start_time);
 +            if (!is_relative(st->cur_dts))
 +                st->cur_dts = wrap_timestamp(st, st->cur_dts);
          }
  
 -        if (!pktl && (st->codec->codec_id != AV_CODEC_ID_PROBE ||
 -                      !st->probe_packets))
 +        pkt->dts = wrap_timestamp(st, pkt->dts);
 +        pkt->pts = wrap_timestamp(st, pkt->pts);
 +
 +        force_codec_ids(s, st);
 +
 +        /* TODO: audio: time filter; video: frame reordering (pts != dts) */
 +        if (s->use_wallclock_as_timestamps)
 +            pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
 +
 +        if (!pktl && st->request_probe <= 0)
              return ret;
  
          add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
      }
  }
  
 +#if FF_API_READ_PACKET
 +int av_read_packet(AVFormatContext *s, AVPacket *pkt)
 +{
 +    return ff_read_packet(s, pkt);
 +}
 +#endif
 +
 +
  /**********************************************************/
  
 +static int determinable_frame_size(AVCodecContext *avctx)
 +{
 +    if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
 +        avctx->codec_id == AV_CODEC_ID_MP1 ||
 +        avctx->codec_id == AV_CODEC_ID_MP2 ||
 +        avctx->codec_id == AV_CODEC_ID_MP3/* ||
 +        avctx->codec_id == AV_CODEC_ID_CELT*/)
 +        return 1;
 +    return 0;
 +}
 +
  /**
   * Get the number of samples of an audio frame. Return -1 on error.
   */
@@@ -863,13 -605,6 +863,13 @@@ int ff_get_audio_frame_size(AVCodecCont
      if (enc->frame_size > 1)
          return enc->frame_size;
  
 +    //For WMA we currently have no other means to calculate duration thus we
 +    //do it here by assuming CBR, which is true for all known cases.
 +    if (!mux && enc->bit_rate>0 && size>0 && enc->sample_rate>0 && enc->block_align>1) {
 +        if (enc->codec_id == AV_CODEC_ID_WMAV1 || enc->codec_id == AV_CODEC_ID_WMAV2)
 +            return  ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
 +    }
 +
      return -1;
  }
  
@@@ -885,9 -620,9 +885,9 @@@ void ff_compute_frame_duration(int *pnu
      *pden = 0;
      switch (st->codec->codec_type) {
      case AVMEDIA_TYPE_VIDEO:
 -        if (st->avg_frame_rate.num) {
 -            *pnum = st->avg_frame_rate.den;
 -            *pden = st->avg_frame_rate.num;
 +        if (st->r_frame_rate.num && !pc) {
 +            *pnum = st->r_frame_rate.den;
 +            *pden = st->r_frame_rate.num;
          } else if (st->time_base.num * 1000LL > st->time_base.den) {
              *pnum = st->time_base.num;
              *pden = st->time_base.den;
      }
  }
  
 -static int is_intra_only(enum AVCodecID id)
 +static int is_intra_only(AVCodecContext *enc) {
 +    const AVCodecDescriptor *desc;
 +
 +    if (enc->codec_type != AVMEDIA_TYPE_VIDEO)
 +        return 1;
 +
 +    desc = av_codec_get_codec_descriptor(enc);
 +    if (!desc) {
 +        desc = avcodec_descriptor_get(enc->codec_id);
 +        av_codec_set_codec_descriptor(enc, desc);
 +    }
 +    if (desc)
 +        return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
 +    return 0;
 +}
 +
 +static int has_decode_delay_been_guessed(AVStream *st)
  {
 -    const AVCodecDescriptor *d = avcodec_descriptor_get(id);
 -    if (!d)
 -        return 0;
 -    if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
 -        return 0;
 -    return 1;
 +    if (st->codec->codec_id != AV_CODEC_ID_H264) return 1;
 +    if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
 +        return 1;
 +#if CONFIG_H264_DECODER
 +    if (st->codec->has_b_frames &&
 +       avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
 +        return 1;
 +#endif
 +    if (st->codec->has_b_frames<3)
 +        return st->nb_decoded_frames >= 7;
 +    else if (st->codec->has_b_frames<4)
 +        return st->nb_decoded_frames >= 18;
 +    else
 +        return st->nb_decoded_frames >= 20;
 +}
 +
 +static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
 +{
 +    if (pktl->next)
 +        return pktl->next;
 +    if (pktl == s->packet_buffer_end)
 +        return s->parse_queue;
 +    return NULL;
 +}
 +
 +static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
 +    int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
 +                       st->codec->codec_id != AV_CODEC_ID_HEVC;
 +
 +    if(!onein_oneout) {
 +        int delay = st->codec->has_b_frames;
 +        int i;
 +
 +        if (dts == AV_NOPTS_VALUE) {
 +            int64_t best_score = INT64_MAX;
 +            for (i = 0; i<delay; i++) {
 +                if (st->pts_reorder_error_count[i]) {
 +                    int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
 +                    if (score < best_score) {
 +                        best_score = score;
 +                        dts = pts_buffer[i];
 +                    }
 +                }
 +            }
 +        } else {
 +            for (i = 0; i<delay; i++) {
 +                if (pts_buffer[i] != AV_NOPTS_VALUE) {
 +                    int64_t diff =  FFABS(pts_buffer[i] - dts)
 +                                    + (uint64_t)st->pts_reorder_error[i];
 +                    diff = FFMAX(diff, st->pts_reorder_error[i]);
 +                    st->pts_reorder_error[i] = diff;
 +                    st->pts_reorder_error_count[i]++;
 +                    if (st->pts_reorder_error_count[i] > 250) {
 +                        st->pts_reorder_error[i] >>= 1;
 +                        st->pts_reorder_error_count[i] >>= 1;
 +                    }
 +                }
 +            }
 +        }
 +    }
 +
 +    if (dts == AV_NOPTS_VALUE)
 +        dts = pts_buffer[0];
 +
 +    return dts;
  }
  
  static void update_initial_timestamps(AVFormatContext *s, int stream_index,
 -                                      int64_t dts, int64_t pts)
 +                                      int64_t dts, int64_t pts, AVPacket *pkt)
  {
      AVStream *st       = s->streams[stream_index];
 -    AVPacketList *pktl = s->packet_buffer;
 +    AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
 +    int64_t pts_buffer[MAX_REORDER_DELAY+1];
 +    int64_t shift;
 +    int i, delay;
  
      if (st->first_dts != AV_NOPTS_VALUE ||
          dts           == AV_NOPTS_VALUE ||
 -        st->cur_dts   == AV_NOPTS_VALUE)
 +        st->cur_dts   == AV_NOPTS_VALUE ||
 +        is_relative(dts))
          return;
  
 -    st->first_dts = dts - st->cur_dts;
 +    delay         = st->codec->has_b_frames;
 +    st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
      st->cur_dts   = dts;
 +    shift         = st->first_dts - RELATIVE_TS_BASE;
 +
 +    for (i = 0; i<MAX_REORDER_DELAY+1; i++)
 +        pts_buffer[i] = AV_NOPTS_VALUE;
  
 -    for (; pktl; pktl = pktl->next) {
 +    if (is_relative(pts))
 +        pts += shift;
 +
 +    for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
          if (pktl->pkt.stream_index != stream_index)
              continue;
 -        // FIXME: think more about this check
 -        if (pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
 -            pktl->pkt.pts += st->first_dts;
 +        if (is_relative(pktl->pkt.pts))
 +            pktl->pkt.pts += shift;
  
 -        if (pktl->pkt.dts != AV_NOPTS_VALUE)
 -            pktl->pkt.dts += st->first_dts;
 +        if (is_relative(pktl->pkt.dts))
 +            pktl->pkt.dts += shift;
  
          if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
              st->start_time = pktl->pkt.pts;
 +
 +        if (pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
 +            pts_buffer[0] = pktl->pkt.pts;
 +            for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
 +                FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
 +
 +            pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
 +        }
      }
 +
      if (st->start_time == AV_NOPTS_VALUE)
          st->start_time = pts;
  }
  static void update_initial_durations(AVFormatContext *s, AVStream *st,
                                       int stream_index, int duration)
  {
 -    AVPacketList *pktl = s->packet_buffer;
 -    int64_t cur_dts    = 0;
 +    AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
 +    int64_t cur_dts    = RELATIVE_TS_BASE;
  
      if (st->first_dts != AV_NOPTS_VALUE) {
 +        if (st->update_initial_durations_done)
 +            return;
 +        st->update_initial_durations_done = 1;
          cur_dts = st->first_dts;
 -        for (; pktl; pktl = pktl->next) {
 +        for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
              if (pktl->pkt.stream_index == stream_index) {
                  if (pktl->pkt.pts != pktl->pkt.dts  ||
                      pktl->pkt.dts != AV_NOPTS_VALUE ||
                  cur_dts -= duration;
              }
          }
 -        pktl          = s->packet_buffer;
 +        if (pktl && pktl->pkt.dts != st->first_dts) {
 +            av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %d) in the queue\n",
 +                   av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
 +            return;
 +        }
 +        if (!pktl) {
 +            av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
 +            return;
 +        }
 +        pktl          = s->packet_buffer ? s->packet_buffer : s->parse_queue;
          st->first_dts = cur_dts;
 -    } else if (st->cur_dts)
 +    } else if (st->cur_dts != RELATIVE_TS_BASE)
          return;
  
 -    for (; pktl; pktl = pktl->next) {
 +    for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
          if (pktl->pkt.stream_index != stream_index)
              continue;
          if (pktl->pkt.pts == pktl->pkt.dts  &&
 -            pktl->pkt.dts == AV_NOPTS_VALUE &&
 +            (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
              !pktl->pkt.duration) {
              pktl->pkt.dts = cur_dts;
              if (!st->codec->has_b_frames)
                  pktl->pkt.pts = cur_dts;
 -            cur_dts += duration;
 -            if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
 +//            if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
                  pktl->pkt.duration = duration;
          } else
              break;
 +        cur_dts = pktl->pkt.dts + pktl->pkt.duration;
      }
 -    if (st->first_dts == AV_NOPTS_VALUE)
 +    if (!pktl)
          st->cur_dts = cur_dts;
  }
  
@@@ -1113,43 -741,13 +1113,43 @@@ static void compute_pkt_fields(AVFormat
  {
      int num, den, presentation_delayed, delay, i;
      int64_t offset;
 +    AVRational duration;
 +    int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
 +                       st->codec->codec_id != AV_CODEC_ID_HEVC;
  
      if (s->flags & AVFMT_FLAG_NOFILLIN)
          return;
  
 +    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
 +        if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
 +            if (st->last_dts_for_order_check <= pkt->dts) {
 +                st->dts_ordered++;
 +            } else {
 +                av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
 +                       "DTS %"PRIi64" < %"PRIi64" out of order\n",
 +                       pkt->dts,
 +                       st->last_dts_for_order_check);
 +                st->dts_misordered++;
 +            }
 +            if (st->dts_ordered + st->dts_misordered > 250) {
 +                st->dts_ordered    >>= 1;
 +                st->dts_misordered >>= 1;
 +            }
 +        }
 +
 +        st->last_dts_for_order_check = pkt->dts;
 +        if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
 +            pkt->dts = AV_NOPTS_VALUE;
 +    }
 +
      if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
          pkt->dts = AV_NOPTS_VALUE;
  
 +    if (pc && pc->pict_type == AV_PICTURE_TYPE_B
 +        && !st->codec->has_b_frames)
 +        //FIXME Set low_delay = 0 when has_b_frames = 1
 +        st->codec->has_b_frames = 1;
 +
      /* do we have a video B-frame ? */
      delay = st->codec->has_b_frames;
      presentation_delayed = 0;
      if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
          st->pts_wrap_bits < 63 &&
          pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
 -        pkt->dts -= 1LL << st->pts_wrap_bits;
 +        if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
 +            pkt->dts -= 1LL << st->pts_wrap_bits;
 +        } else
 +            pkt->pts += 1LL << st->pts_wrap_bits;
      }
  
      /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
       * 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");
 -        pkt->dts = pkt->pts = AV_NOPTS_VALUE;
 +        av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
 +        if (    strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
 +             && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
 +            pkt->dts = AV_NOPTS_VALUE;
      }
  
 -    if (pkt->duration == 0 && st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
 +    duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
 +    if (pkt->duration == 0) {
          ff_compute_frame_duration(&num, &den, st, pc, pkt);
          if (den && num) {
 -            pkt->duration = av_rescale_rnd(1, num * (int64_t) st->time_base.den,
 +            duration = (AVRational) {num, den};
 +            pkt->duration = av_rescale_rnd(1,
 +                                           num * (int64_t) st->time_base.den,
                                             den * (int64_t) st->time_base.num,
                                             AV_ROUND_DOWN);
 -
 -            if (pkt->duration != 0 && s->packet_buffer)
 -                update_initial_durations(s, st, pkt->stream_index,
 -                                         pkt->duration);
          }
      }
  
 +    if (pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
 +        update_initial_durations(s, st, pkt->stream_index, pkt->duration);
 +
      /* Correct timestamps with byte offset if demuxers only have timestamps
       * on packet boundaries */
      if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
          presentation_delayed = 1;
  
      av_dlog(NULL,
 -            "IN delayed:%d pts:%"PRId64", dts:%"PRId64" "
 -            "cur_dts:%"PRId64" st:%d pc:%p\n",
 -            presentation_delayed, pkt->pts, pkt->dts, st->cur_dts,
 -            pkt->stream_index, pc);
 -    /* Interpolate PTS and DTS if they are not present. We skip H.264
 +            "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
 +            presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
 +            pkt->stream_index, pc, pkt->duration);
 +    /* Interpolate PTS and DTS if they are not present. We skip H264
       * currently because delay and has_b_frames are not reliably set. */
      if ((delay == 0 || (delay == 1 && pc)) &&
 -        st->codec->codec_id != AV_CODEC_ID_H264) {
 +        onein_oneout) {
          if (presentation_delayed) {
              /* DTS = decompression timestamp */
              /* PTS = presentation timestamp */
              if (pkt->dts == AV_NOPTS_VALUE)
                  pkt->dts = st->last_IP_pts;
 -            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
 +            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
              if (pkt->dts == AV_NOPTS_VALUE)
                  pkt->dts = st->cur_dts;
  
               * by knowing the future. */
          } else if (pkt->pts != AV_NOPTS_VALUE ||
                     pkt->dts != AV_NOPTS_VALUE ||
 -                   pkt->duration              ||
 -                   st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 -            int duration = pkt->duration;
 -            if (!duration && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 -                ff_compute_frame_duration(&num, &den, st, pc, pkt);
 -                if (den && num) {
 -                    duration = av_rescale_rnd(1,
 -                                              num * (int64_t) st->time_base.den,
 -                                              den * (int64_t) st->time_base.num,
 -                                              AV_ROUND_DOWN);
 -                    if (duration != 0 && s->packet_buffer)
 -                        update_initial_durations(s, st, pkt->stream_index,
 -                                                 duration);
 -                }
 -            }
 -
 -            if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE ||
 -                duration) {
 -                /* presentation is not delayed : PTS and DTS are the same */
 -                if (pkt->pts == AV_NOPTS_VALUE)
 -                    pkt->pts = pkt->dts;
 -                update_initial_timestamps(s, pkt->stream_index, pkt->pts,
 -                                          pkt->pts);
 -                if (pkt->pts == AV_NOPTS_VALUE)
 -                    pkt->pts = st->cur_dts;
 -                pkt->dts = pkt->pts;
 -                if (pkt->pts != AV_NOPTS_VALUE)
 -                    st->cur_dts = pkt->pts + duration;
 -            }
 +                   pkt->duration                ) {
 +
 +            /* presentation is not delayed : PTS and DTS are the same */
 +            if (pkt->pts == AV_NOPTS_VALUE)
 +                pkt->pts = pkt->dts;
 +            update_initial_timestamps(s, pkt->stream_index, pkt->pts,
 +                                      pkt->pts, pkt);
 +            if (pkt->pts == AV_NOPTS_VALUE)
 +                pkt->pts = st->cur_dts;
 +            pkt->dts = pkt->pts;
 +            if (pkt->pts != AV_NOPTS_VALUE)
 +                st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
          }
      }
  
 -    if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
 +    if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
          st->pts_buffer[0] = pkt->pts;
          for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
              FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
 -        if (pkt->dts == AV_NOPTS_VALUE)
 -            pkt->dts = st->pts_buffer[0];
 -        // We skipped it above so we try here.
 -        if (st->codec->codec_id == AV_CODEC_ID_H264)
 -            // This should happen on the first packet
 -            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
 -        if (pkt->dts > st->cur_dts)
 -            st->cur_dts = pkt->dts;
 +
 +        pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
      }
 +    // We skipped it above so we try here.
 +    if (!onein_oneout)
 +        // This should happen on the first packet
 +        update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
 +    if (pkt->dts > st->cur_dts)
 +        st->cur_dts = pkt->dts;
  
 -    av_dlog(NULL,
 -            "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n",
 -            presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
 +    av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
 +            presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
  
      /* update flags */
 -    if (is_intra_only(st->codec->codec_id))
 +    if (is_intra_only(st->codec))
          pkt->flags |= AV_PKT_FLAG_KEY;
      if (pc)
          pkt->convergence_duration = pc->convergence_duration;
@@@ -1309,9 -919,6 +1309,9 @@@ static int parse_packet(AVFormatContex
          av_init_packet(&flush_pkt);
          pkt        = &flush_pkt;
          got_output = 1;
 +    } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
 +        // preserve 0-size sync packets
 +        compute_pkt_fields(s, st, st->parser, pkt);
      }
  
      while (size > 0 || (pkt == &flush_pkt && got_output)) {
                                 pkt->pts, pkt->dts, pkt->pos);
  
          pkt->pts = pkt->dts = AV_NOPTS_VALUE;
 +        pkt->pos = -1;
          /* increment read pointer */
          data += len;
          size -= len;
          out_pkt.dts          = st->parser->dts;
          out_pkt.pos          = st->parser->pos;
  
 +        if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
 +            out_pkt.pos = st->parser->frame_offset;
 +
          if (st->parser->key_frame == 1 ||
              (st->parser->key_frame == -1 &&
               st->parser->pict_type == AV_PICTURE_TYPE_I))
              out_pkt.flags |= AV_PKT_FLAG_KEY;
  
 -        compute_pkt_fields(s, st, st->parser, &out_pkt);
 +        if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
 +            out_pkt.flags |= AV_PKT_FLAG_KEY;
  
 -        if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
 -            out_pkt.flags & AV_PKT_FLAG_KEY) {
 -            ff_reduce_index(s, st->index);
 -            av_add_index_entry(st, st->parser->frame_offset, out_pkt.dts,
 -                               0, 0, AVINDEX_KEYFRAME);
 -        }
 +        compute_pkt_fields(s, st, st->parser, &out_pkt);
  
          if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
              out_pkt.buf = pkt->buf;
@@@ -1454,34 -1061,27 +1454,34 @@@ static int read_frame_internal(AVFormat
              cur_pkt.dts != AV_NOPTS_VALUE &&
              cur_pkt.pts < cur_pkt.dts) {
              av_log(s, AV_LOG_WARNING,
 -                   "Invalid timestamps stream=%d, pts=%"PRId64", "
 -                   "dts=%"PRId64", size=%d\n",
 -                   cur_pkt.stream_index, cur_pkt.pts,
 -                   cur_pkt.dts, cur_pkt.size);
 +                   "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
 +                   cur_pkt.stream_index,
 +                   av_ts2str(cur_pkt.pts),
 +                   av_ts2str(cur_pkt.dts),
 +                   cur_pkt.size);
          }
          if (s->debug & FF_FDEBUG_TS)
              av_log(s, AV_LOG_DEBUG,
 -                   "ff_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", "
 -                   "size=%d, duration=%d, flags=%d\n",
 -                   cur_pkt.stream_index, cur_pkt.pts, cur_pkt.dts,
 +                   "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
 +                   cur_pkt.stream_index,
 +                   av_ts2str(cur_pkt.pts),
 +                   av_ts2str(cur_pkt.dts),
                     cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
  
          if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
              st->parser = av_parser_init(st->codec->codec_id);
 -            if (!st->parser)
 +            if (!st->parser) {
 +                av_log(s, AV_LOG_VERBOSE, "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)
 +            else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
                  st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
              else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
                  st->parser->flags |= PARSER_FLAG_ONCE;
 +            else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
 +                st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
          }
  
          if (!st->need_parsing || !st->parser) {
              /* free packet */
              av_free_packet(&cur_pkt);
          }
 +        if (pkt->flags & AV_PKT_FLAG_KEY)
 +            st->skip_to_keyframe = 0;
 +        if (st->skip_to_keyframe) {
 +            av_free_packet(&cur_pkt);
 +            if (got_packet) {
 +                *pkt = cur_pkt;
 +            }
 +            got_packet = 0;
 +        }
      }
  
      if (!got_packet && s->parse_queue)
          ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
  
 +    if (ret >= 0) {
 +        AVStream *st = s->streams[pkt->stream_index];
 +        if (st->skip_samples) {
 +            uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
 +            if (p) {
 +                AV_WL32(p, st->skip_samples);
 +                av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
 +            }
 +            st->skip_samples = 0;
 +        }
 +    }
 +
 +    if (ret >= 0 && !(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
 +        av_packet_merge_side_data(pkt);
 +
      if (s->debug & FF_FDEBUG_TS)
          av_log(s, AV_LOG_DEBUG,
 -               "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", "
 +               "read_frame_internal stream=%d, pts=%s, dts=%s, "
                 "size=%d, duration=%d, flags=%d\n",
 -               pkt->stream_index, pkt->pts, pkt->dts,
 +               pkt->stream_index,
 +               av_ts2str(pkt->pts),
 +               av_ts2str(pkt->dts),
                 pkt->size, pkt->duration, pkt->flags);
  
      return ret;
@@@ -1547,20 -1121,15 +1547,20 @@@ int av_read_frame(AVFormatContext *s, A
  {
      const int genpts = s->flags & AVFMT_FLAG_GENPTS;
      int eof = 0;
 +    int ret;
 +    AVStream *st;
  
 -    if (!genpts)
 -        return s->packet_buffer
 -               ? read_from_packet_buffer(&s->packet_buffer,
 -                                         &s->packet_buffer_end, pkt)
 -               : read_frame_internal(s, pkt);
 +    if (!genpts) {
 +        ret = s->packet_buffer
 +              ? read_from_packet_buffer(&s->packet_buffer,
 +                                        &s->packet_buffer_end, pkt)
 +              : read_frame_internal(s, pkt);
 +        if (ret < 0)
 +            return ret;
 +        goto return_packet;
 +    }
  
      for (;;) {
 -        int ret;
          AVPacketList *pktl = s->packet_buffer;
  
          if (pktl) {
  
              if (next_pkt->dts != AV_NOPTS_VALUE) {
                  int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
 +                // last dts seen for this stream. if any of packets following
 +                // current one had no dts, we will set this to AV_NOPTS_VALUE.
 +                int64_t last_dts = next_pkt->dts;
                  while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
                      if (pktl->pkt.stream_index == next_pkt->stream_index &&
 -                        (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0) &&
 -                         av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
 -                        // not B-frame
 -                        next_pkt->pts = pktl->pkt.dts;
 +                        (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
 +                        if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
 +                            // not B-frame
 +                            next_pkt->pts = pktl->pkt.dts;
 +                        }
 +                        if (last_dts != AV_NOPTS_VALUE) {
 +                            // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
 +                            last_dts = pktl->pkt.dts;
 +                        }
                      }
                      pktl = pktl->next;
                  }
 +                if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
 +                    // Fixing the last reference frame had none pts issue (For MXF etc).
 +                    // We only do this when
 +                    // 1. eof.
 +                    // 2. we are not able to resolve a pts value for current packet.
 +                    // 3. the packets for this stream at the end of the files had valid dts.
 +                    next_pkt->pts = last_dts + next_pkt->duration;
 +                }
                  pktl = s->packet_buffer;
              }
  
              /* read packet from packet buffer, if there is data */
              if (!(next_pkt->pts == AV_NOPTS_VALUE &&
 -                  next_pkt->dts != AV_NOPTS_VALUE && !eof))
 -                return read_from_packet_buffer(&s->packet_buffer,
 +                  next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
 +                ret = read_from_packet_buffer(&s->packet_buffer,
                                                 &s->packet_buffer_end, pkt);
 +                goto return_packet;
 +            }
          }
  
          ret = read_frame_internal(s, pkt);
                                          &s->packet_buffer_end)) < 0)
              return AVERROR(ENOMEM);
      }
 +
 +return_packet:
 +
 +    st = s->streams[pkt->stream_index];
 +    if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
 +        ff_reduce_index(s, st->index);
 +        av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
 +    }
 +
 +    if (is_relative(pkt->dts))
 +        pkt->dts -= RELATIVE_TS_BASE;
 +    if (is_relative(pkt->pts))
 +        pkt->pts -= RELATIVE_TS_BASE;
 +
 +    return ret;
  }
  
  /* XXX: suppress the packet queue */
@@@ -1686,12 -1222,8 +1686,12 @@@ void ff_read_frame_flush(AVFormatContex
              st->parser = NULL;
          }
          st->last_IP_pts = AV_NOPTS_VALUE;
 -        /* We set the current DTS to an unspecified origin. */
 -        st->cur_dts     = AV_NOPTS_VALUE;
 +        st->last_dts_for_order_check = AV_NOPTS_VALUE;
 +        if (st->first_dts == AV_NOPTS_VALUE)
 +            st->cur_dts = RELATIVE_TS_BASE;
 +        else
 +            /* We set the current DTS to an unspecified origin. */
 +            st->cur_dts = AV_NOPTS_VALUE;
  
          st->probe_packets = MAX_PROBE_PACKETS;
  
@@@ -1739,15 -1271,6 +1739,15 @@@ int ff_add_index_entry(AVIndexEntry **i
      if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
          return -1;
  
 +    if (timestamp == AV_NOPTS_VALUE)
 +        return AVERROR(EINVAL);
 +
 +    if (size < 0 || size > 0x3FFFFFFF)
 +        return AVERROR(EINVAL);
 +
 +    if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
 +        timestamp -= RELATIVE_TS_BASE;
 +
      entries = av_fast_realloc(*index_entries,
                                index_entries_allocated_size,
                                (*nb_index_entries + 1) *
      if (index < 0) {
          index = (*nb_index_entries)++;
          ie    = &entries[index];
 -        assert(index == 0 || ie[-1].timestamp < timestamp);
 +        av_assert0(index == 0 || ie[-1].timestamp < timestamp);
      } else {
          ie = &entries[index];
          if (ie->timestamp != timestamp) {
  int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
                         int size, int distance, int flags)
  {
 +    timestamp = wrap_timestamp(st, timestamp);
      return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
                                &st->index_entries_allocated_size, pos,
                                timestamp, size, distance, flags);
@@@ -1834,15 -1356,6 +1834,15 @@@ int av_index_search_timestamp(AVStream 
                                       wanted_timestamp, flags);
  }
  
 +static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
 +                                 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
 +{
 +    int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
 +    if (stream_index >= 0)
 +        ts = wrap_timestamp(s->streams[stream_index], ts);
 +    return ts;
 +}
 +
  int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
                           int64_t target_ts, int flags)
  {
      if (stream_index < 0)
          return -1;
  
 -    av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
 +    av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
  
      ts_max =
      ts_min = AV_NOPTS_VALUE;
          if (e->timestamp <= target_ts || e->pos == e->min_distance) {
              pos_min = e->pos;
              ts_min  = e->timestamp;
 -            av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
 -                    pos_min, ts_min);
 +            av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
 +                    pos_min, av_ts2str(ts_min));
          } else {
 -            assert(index == 0);
 +            av_assert1(index == 0);
          }
  
          index = av_index_search_timestamp(st, target_ts,
                                            flags & ~AVSEEK_FLAG_BACKWARD);
 -        assert(index < st->nb_index_entries);
 +        av_assert0(index < st->nb_index_entries);
          if (index >= 0) {
              e = &st->index_entries[index];
 -            assert(e->timestamp >= target_ts);
 +            av_assert1(e->timestamp >= target_ts);
              pos_max   = e->pos;
              ts_max    = e->timestamp;
              pos_limit = pos_max - e->min_distance;
              av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
 -                    " dts_max=%"PRId64"\n", pos_max, pos_limit, ts_max);
 +                    " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
          }
      }
  
      if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
          return ret;
  
 +    ff_read_frame_flush(s);
      ff_update_cur_dts(s, st, ts);
  
      return 0;
  }
  
 +int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
 +                    int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
 +{
 +    int64_t step = 1024;
 +    int64_t limit, ts_max;
 +    int64_t filesize = avio_size(s->pb);
 +    int64_t pos_max  = filesize - 1;
 +    do {
 +        limit = pos_max;
 +        pos_max = FFMAX(0, (pos_max) - step);
 +        ts_max  = ff_read_timestamp(s, stream_index,
 +                                    &pos_max, limit, read_timestamp);
 +        step   += step;
 +    } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
 +    if (ts_max == AV_NOPTS_VALUE)
 +        return -1;
 +
 +    for (;;) {
 +        int64_t tmp_pos = pos_max + 1;
 +        int64_t tmp_ts  = ff_read_timestamp(s, stream_index,
 +                                            &tmp_pos, INT64_MAX, read_timestamp);
 +        if (tmp_ts == AV_NOPTS_VALUE)
 +            break;
 +        av_assert0(tmp_pos > pos_max);
 +        ts_max  = tmp_ts;
 +        pos_max = tmp_pos;
 +        if (tmp_pos >= filesize)
 +            break;
 +    }
 +
 +    if (ts)
 +        *ts = ts_max;
 +    if (pos)
 +        *pos = pos_max;
 +
 +    return 0;
 +}
 +
  int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
                        int64_t pos_min, int64_t pos_max, int64_t pos_limit,
                        int64_t ts_min, int64_t ts_max,
                                                  int64_t *, int64_t))
  {
      int64_t pos, ts;
 -    int64_t start_pos, filesize;
 +    int64_t start_pos;
      int no_change;
 +    int ret;
  
 -    av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
 +    av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
  
      if (ts_min == AV_NOPTS_VALUE) {
          pos_min = s->data_offset;
 -        ts_min  = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
 +        ts_min  = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
          if (ts_min == AV_NOPTS_VALUE)
              return -1;
      }
  
 -    if (ts_max == AV_NOPTS_VALUE) {
 -        int step = 1024;
 -        filesize = avio_size(s->pb);
 -        pos_max  = filesize - 1;
 -        do {
 -            pos_max -= step;
 -            ts_max   = read_timestamp(s, stream_index, &pos_max,
 -                                      pos_max + step);
 -            step    += step;
 -        } while (ts_max == AV_NOPTS_VALUE && pos_max >= step);
 -        if (ts_max == AV_NOPTS_VALUE)
 -            return -1;
 +    if (ts_min >= target_ts) {
 +        *ts_ret = ts_min;
 +        return pos_min;
 +    }
  
 -        for (;;) {
 -            int64_t tmp_pos = pos_max + 1;
 -            int64_t tmp_ts  = read_timestamp(s, stream_index,
 -                                             &tmp_pos, INT64_MAX);
 -            if (tmp_ts == AV_NOPTS_VALUE)
 -                break;
 -            ts_max  = tmp_ts;
 -            pos_max = tmp_pos;
 -            if (tmp_pos >= filesize)
 -                break;
 -        }
 +    if (ts_max == AV_NOPTS_VALUE) {
 +        if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
 +            return ret;
          pos_limit = pos_max;
      }
  
 +    if (ts_max <= target_ts) {
 +        *ts_ret = ts_max;
 +        return pos_max;
 +    }
 +
      if (ts_min > ts_max)
          return -1;
      else if (ts_min == ts_max)
  
      no_change = 0;
      while (pos_min < pos_limit) {
 -        av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64
 -                " dts_max=%"PRId64"\n", pos_min, pos_max, ts_min, ts_max);
 +        av_dlog(s,
 +                "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
 +                pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
          assert(pos_limit <= pos_max);
  
          if (no_change == 0) {
          start_pos = pos;
  
          // May pass pos_limit instead of -1.
 -        ts = read_timestamp(s, stream_index, &pos, INT64_MAX);
 +        ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
          if (pos == pos_max)
              no_change++;
          else
              no_change = 0;
 -        av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64
 -                " target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
 -                pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
 +        av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
 +                " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
 +                pos_min, pos, pos_max,
 +                av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
                  pos_limit, start_pos, no_change);
          if (ts == AV_NOPTS_VALUE) {
              av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
  
      pos     = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
      ts      = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min  : ts_max;
 +#if 0
      pos_min = pos;
 -    ts_min  = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
 +    ts_min  = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
      pos_min++;
 -    ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
 -    av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
 -            pos, ts_min, target_ts, ts_max);
 +    ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
 +    av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
 +            pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
 +#endif
      *ts_ret = ts;
      return pos;
  }
@@@ -2074,8 -1554,6 +2074,8 @@@ static int seek_frame_byte(AVFormatCont
  
      avio_seek(s->pb, pos, SEEK_SET);
  
 +    s->io_repositioned = 1;
 +
      return 0;
  }
  
@@@ -2097,10 -1575,9 +2097,10 @@@ 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);
 +            av_assert0(st->index_entries);
              ie = &st->index_entries[st->nb_index_entries - 1];
              if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
                  return ret;
              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 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS) {
 +                    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);
      }
@@@ -2190,22 -1662,10 +2190,22 @@@ static int seek_frame_internal(AVFormat
  int av_seek_frame(AVFormatContext *s, int stream_index,
                    int64_t timestamp, int flags)
  {
 -    int ret = seek_frame_internal(s, stream_index, timestamp, flags);
 +    int ret;
 +
 +    if (s->iformat->read_seek2 && !s->iformat->read_seek) {
 +        int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
 +        if ((flags & AVSEEK_FLAG_BACKWARD))
 +            max_ts = timestamp;
 +        else
 +            min_ts = timestamp;
 +        return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
 +                                  flags & ~AVSEEK_FLAG_BACKWARD);
 +    }
 +
 +    ret = seek_frame_internal(s, stream_index, timestamp, flags);
  
      if (ret >= 0)
 -        ret = queue_attached_pictures(s);
 +        ret = avformat_queue_attached_pictures(s);
  
      return ret;
  }
@@@ -2215,33 -1675,15 +2215,33 @@@ int avformat_seek_file(AVFormatContext 
  {
      if (min_ts > ts || max_ts < ts)
          return -1;
 +    if (stream_index < -1 || stream_index >= (int)s->nb_streams)
 +        return AVERROR(EINVAL);
 +
 +    if (s->seek2any>0)
 +        flags |= AVSEEK_FLAG_ANY;
 +    flags &= ~AVSEEK_FLAG_BACKWARD;
  
      if (s->iformat->read_seek2) {
          int ret;
          ff_read_frame_flush(s);
 +
 +        if (stream_index == -1 && s->nb_streams == 1) {
 +            AVRational time_base = s->streams[0]->time_base;
 +            ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
 +            min_ts = av_rescale_rnd(min_ts, time_base.den,
 +                                    time_base.num * (int64_t)AV_TIME_BASE,
 +                                    AV_ROUND_UP   | AV_ROUND_PASS_MINMAX);
 +            max_ts = av_rescale_rnd(max_ts, time_base.den,
 +                                    time_base.num * (int64_t)AV_TIME_BASE,
 +                                    AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
 +        }
 +
          ret = s->iformat->read_seek2(s, stream_index, min_ts,
                                       ts, max_ts, flags);
  
          if (ret >= 0)
 -            ret = queue_attached_pictures(s);
 +            ret = avformat_queue_attached_pictures(s);
          return ret;
      }
  
  
      // Fall back on old API if new is not implemented but old is.
      // Note the old API has somewhat different semantics.
 -    if (s->iformat->read_seek || 1)
 -        return av_seek_frame(s, stream_index, ts,
 -                             flags | ((uint64_t) ts - min_ts >
 -                                      (uint64_t) max_ts - ts
 -                                      ? AVSEEK_FLAG_BACKWARD : 0));
 +    if (s->iformat->read_seek || 1) {
 +        int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
 +        int ret = av_seek_frame(s, stream_index, ts, flags | dir);
 +        if (ret<0 && ts != min_ts && max_ts != ts) {
 +            ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
 +            if (ret >= 0)
 +                ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
 +        }
 +        return ret;
 +    }
  
      // try some generic seek like seek_frame_generic() but with new ts semantics
 +    return -1; //unreachable
  }
  
  /*******************************************************/
@@@ -2295,14 -1731,12 +2295,14 @@@ static int has_duration(AVFormatContex
   */
  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, filesize;
      int i;
      AVStream *st;
 +    AVProgram *p;
  
      start_time = INT64_MAX;
 +    start_time_text = INT64_MAX;
      end_time   = INT64_MIN;
      duration   = INT64_MIN;
      for (i = 0; i < ic->nb_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);
 -            start_time  = FFMIN(start_time, start_time1);
 +            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
 +                if (start_time1 < start_time_text)
 +                    start_time_text = start_time1;
 +            } else
 +                start_time = FFMIN(start_time, start_time1);
 +            end_time1   = AV_NOPTS_VALUE;
              if (st->duration != AV_NOPTS_VALUE) {
                  end_time1 = start_time1 +
                              av_rescale_q(st->duration, st->time_base,
                                           AV_TIME_BASE_Q);
                  end_time = FFMAX(end_time, end_time1);
              }
 +            for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
 +                if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
 +                    p->start_time = start_time1;
 +                if (p->end_time < end_time1)
 +                    p->end_time = end_time1;
 +            }
          }
          if (st->duration != AV_NOPTS_VALUE) {
              duration1 = av_rescale_q(st->duration, st->time_base,
              duration  = FFMAX(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;
 +    else if (start_time > start_time_text)
 +        av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
 +
      if (start_time != INT64_MAX) {
          ic->start_time = start_time;
 -        if (end_time != INT64_MIN)
 -            duration = FFMAX(duration, end_time - start_time);
 +        if (end_time != INT64_MIN) {
 +            if (ic->nb_programs) {
 +                for (i = 0; i < ic->nb_programs; i++) {
 +                    p = ic->programs[i];
 +                    if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
 +                        duration = FFMAX(duration, p->end_time - p->start_time);
 +                }
 +            } else
 +                duration = FFMAX(duration, end_time - start_time);
 +        }
      }
 -    if (duration != INT64_MIN) {
 +    if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
          ic->duration = duration;
 -        if (ic->pb && (filesize = avio_size(ic->pb)) > 0)
 -            /* compute the bitrate */
 -            ic->bit_rate = (double) filesize * 8.0 * AV_TIME_BASE /
 -                           (double) ic->duration;
 +    }
 +    if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
 +        /* compute the bitrate */
 +        double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
 +                         (double) ic->duration;
 +        if (bitrate >= 0 && bitrate <= INT_MAX)
 +            ic->bit_rate = bitrate;
      }
  }
  
@@@ -2387,7 -1794,7 +2387,7 @@@ static void fill_all_stream_timings(AVF
  static void estimate_timings_from_bit_rate(AVFormatContext *ic)
  {
      int64_t filesize, duration;
 -    int i;
 +    int i, show_warning = 0;
      AVStream *st;
  
      /* if bit_rate is already set, we believe it */
          filesize = ic->pb ? avio_size(ic->pb) : 0;
          if (filesize > 0) {
              for (i = 0; i < ic->nb_streams; i++) {
 -                st       = ic->streams[i];
 -                duration = av_rescale(8 * filesize, st->time_base.den,
 -                                      ic->bit_rate *
 -                                      (int64_t) st->time_base.num);
 -                if (st->duration == AV_NOPTS_VALUE)
 +                st      = ic->streams[i];
 +                if (   st->time_base.num <= INT64_MAX / ic->bit_rate
 +                    && st->duration == AV_NOPTS_VALUE) {
 +                    duration = av_rescale(8 * filesize, st->time_base.den,
 +                                          ic->bit_rate *
 +                                          (int64_t) st->time_base.num);
                      st->duration = duration;
 +                    show_warning = 1;
 +                }
              }
          }
      }
 +    if (show_warning)
 +        av_log(ic, AV_LOG_WARNING,
 +               "Estimating duration from bitrate, this may be inaccurate\n");
  }
  
 -#define DURATION_MAX_READ_SIZE 250000
 -#define DURATION_MAX_RETRY 3
 +#define DURATION_MAX_READ_SIZE 250000LL
 +#define DURATION_MAX_RETRY 4
  
  /* only usable for MPEG-PS streams */
  static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
  
      for (i = 0; i < ic->nb_streams; i++) {
          st = ic->streams[i];
 -        if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
 +        if (st->start_time == AV_NOPTS_VALUE &&
 +            st->first_dts == AV_NOPTS_VALUE &&
 +            st->codec->codec_type != AVMEDIA_TYPE_UNKNOWN)
              av_log(st->codec, AV_LOG_WARNING,
                     "start time is not set in estimate_timings_from_pts\n");
  
                      duration -= st->start_time;
                  else
                      duration -= st->first_dts;
 -                if (duration < 0)
 -                    duration += 1LL << st->pts_wrap_bits;
                  if (duration > 0) {
 -                    if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
 +                    if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
 +                        (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
                          st->duration = duration;
 +                    st->info->last_duration = duration;
                  }
              }
              av_free_packet(pkt);
  
      avio_seek(ic->pb, old_offset, SEEK_SET);
      for (i = 0; i < ic->nb_streams; i++) {
 +        int j;
 +
          st              = ic->streams[i];
          st->cur_dts     = st->first_dts;
          st->last_IP_pts = AV_NOPTS_VALUE;
 +        st->last_dts_for_order_check = AV_NOPTS_VALUE;
 +        for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
 +            st->pts_buffer[j] = AV_NOPTS_VALUE;
      }
  }
  
@@@ -2534,16 -1928,15 +2534,16 @@@ static void estimate_timings(AVFormatCo
          file_size && ic->pb->seekable) {
          /* get accurate estimate from the PTSes */
          estimate_timings_from_pts(ic, old_offset);
 +        ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
      } else if (has_duration(ic)) {
          /* at least one component has timings - we use them for all
           * the components */
          fill_all_stream_timings(ic);
 +        ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
      } else {
 -        av_log(ic, AV_LOG_WARNING,
 -               "Estimating duration from bitrate, this may be inaccurate\n");
          /* less precise: use bitrate info */
          estimate_timings_from_bit_rate(ic);
 +        ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
      }
      update_stream_timings(ic);
  
      }
  }
  
 -static int has_codec_parameters(AVStream *st)
 +static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
  {
      AVCodecContext *avctx = st->codec;
 -    int val;
 +
 +#define FAIL(errmsg) do {                                         \
 +        if (errmsg_ptr)                                           \
 +            *errmsg_ptr = errmsg;                                 \
 +        return 0;                                                 \
 +    } while (0)
  
      switch (avctx->codec_type) {
      case AVMEDIA_TYPE_AUDIO:
 -        val = avctx->sample_rate && avctx->channels;
 +        if (!avctx->frame_size && determinable_frame_size(avctx))
 +            FAIL("unspecified frame size");
          if (st->info->found_decoder >= 0 &&
              avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
 -            return 0;
 +            FAIL("unspecified sample format");
 +        if (!avctx->sample_rate)
 +            FAIL("unspecified sample rate");
 +        if (!avctx->channels)
 +            FAIL("unspecified number of channels");
 +        if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
 +            FAIL("no decodable DTS frames");
          break;
      case AVMEDIA_TYPE_VIDEO:
 -        val = avctx->width;
 +        if (!avctx->width)
 +            FAIL("unspecified size");
          if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
 -            return 0;
 +            FAIL("unspecified pixel format");
 +        if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
 +            if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
 +                FAIL("no frame in rv30/40 and no sar");
          break;
 -    default:
 -        val = 1;
 +    case AVMEDIA_TYPE_SUBTITLE:
 +        if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
 +            FAIL("unspecified size");
          break;
 +    case AVMEDIA_TYPE_DATA:
 +        if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
      }
 -    return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
 -}
  
 -static int has_decode_delay_been_guessed(AVStream *st)
 -{
 -    return st->codec->codec_id != AV_CODEC_ID_H264 ||
 -           st->info->nb_decoded_frames >= 6;
 +    if (avctx->codec_id == AV_CODEC_ID_NONE)
 +        FAIL("unknown codec");
 +    return 1;
  }
  
  /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
 -static int try_decode_frame(AVStream *st, AVPacket *avpkt,
 +static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
                              AVDictionary **options)
  {
      const AVCodec *codec;
      int got_picture = 1, ret = 0;
      AVFrame *frame = av_frame_alloc();
 +    AVSubtitle subtitle;
      AVPacket pkt = *avpkt;
  
      if (!frame)
      if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
          AVDictionary *thread_opt = NULL;
  
 -        codec = st->codec->codec ? st->codec->codec
 -                                 : avcodec_find_decoder(st->codec->codec_id);
 +        codec = find_decoder(s, st, st->codec->codec_id);
  
          if (!codec) {
              st->info->found_decoder = -1;
  
      while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
             ret >= 0 &&
 -           (!has_codec_parameters(st) || !has_decode_delay_been_guessed(st) ||
 +           (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
              (!st->codec_info_nb_frames &&
               st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
          got_picture = 0;
          case AVMEDIA_TYPE_AUDIO:
              ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
              break;
 +        case AVMEDIA_TYPE_SUBTITLE:
 +            ret = avcodec_decode_subtitle2(st->codec, &subtitle,
 +                                           &got_picture, &pkt);
 +            ret = pkt.size;
 +            break;
          default:
              break;
          }
          if (ret >= 0) {
              if (got_picture)
 -                st->info->nb_decoded_frames++;
 +                st->nb_decoded_frames++;
              pkt.data += ret;
              pkt.size -= ret;
              ret       = got_picture;
          }
      }
  
 +    if (!pkt.data && !got_picture)
 +        ret = -1;
 +
  fail:
      av_frame_free(&frame);
      return ret;
@@@ -2726,7 -2095,6 +2726,7 @@@ enum AVCodecID ff_get_pcm_codec_id(int 
              return AV_CODEC_ID_NONE;
          }
      } else {
 +        bps  += 7;
          bps >>= 3;
          if (sflags & (1 << (bps - 1))) {
              switch (bps) {
  }
  
  unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
 +{
 +    unsigned int tag;
 +    if (!av_codec_get_tag2(tags, id, &tag))
 +        return 0;
 +    return tag;
 +}
 +
 +int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
 +                      unsigned int *tag)
  {
      int i;
      for (i = 0; tags && tags[i]; i++) {
 -        int tag = ff_codec_get_tag(tags[i], id);
 -        if (tag)
 -            return tag;
 +        const AVCodecTag *codec_tags = tags[i];
 +        while (codec_tags->id != AV_CODEC_ID_NONE) {
 +            if (codec_tags->id == id) {
 +                *tag = codec_tags->tag;
 +                return 1;
 +            }
 +            codec_tags++;
 +        }
      }
      return 0;
  }
@@@ -2823,7 -2177,7 +2823,7 @@@ static int get_std_framerate(int i
      if (i < 60 * 12)
          return (i + 1) * 1001;
      else
 -        return ((const int[]) { 24, 30, 60, 12, 15 })[i - 60 * 12] * 1000 * 12;
 +        return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i - 60 * 12] * 1000 * 12;
  }
  
  /* Is the time base unreliable?
@@@ -2838,212 -2192,34 +2838,212 @@@ static int tb_unreliable(AVCodecContex
          c->time_base.den <    5L * c->time_base.num ||
          // c->codec_tag == AV_RL32("DIVX") ||
          // c->codec_tag == AV_RL32("XVID") ||
 +        c->codec_tag == AV_RL32("mp4v") ||
          c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
          c->codec_id == AV_CODEC_ID_H264)
          return 1;
      return 0;
  }
  
 +#if FF_API_FORMAT_PARAMETERS
 +int av_find_stream_info(AVFormatContext *ic)
 +{
 +    return avformat_find_stream_info(ic, NULL);
 +}
 +#endif
 +
 +int ff_alloc_extradata(AVCodecContext *avctx, int size)
 +{
 +    int ret;
 +
 +    if (size < 0 || size >= INT32_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
 +        avctx->extradata_size = 0;
 +        return AVERROR(EINVAL);
 +    }
 +    avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
 +    if (avctx->extradata) {
 +        memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 +        avctx->extradata_size = size;
 +        ret = 0;
 +    } else {
 +        avctx->extradata_size = 0;
 +        ret = AVERROR(ENOMEM);
 +    }
 +    return ret;
 +}
 +
 +int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
 +{
 +    int ret = ff_alloc_extradata(avctx, size);
 +    if (ret < 0)
 +        return ret;
 +    ret = avio_read(pb, avctx->extradata, size);
 +    if (ret != size) {
 +        av_freep(&avctx->extradata);
 +        avctx->extradata_size = 0;
 +        av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
 +        return ret < 0 ? ret : AVERROR_INVALIDDATA;
 +    }
 +
 +    return ret;
 +}
 +
 +int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
 +{
 +    int i, j;
 +    int64_t last = st->info->last_dts;
 +
 +    if (   ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
 +       && ts - (uint64_t)last < INT64_MAX) {
 +        double dts = (is_relative(ts) ?  ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
 +        int64_t duration = ts - last;
 +
 +        if (!st->info->duration_error)
 +            st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
 +        if (!st->info->duration_error)
 +            return AVERROR(ENOMEM);
 +
 +//         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 +//             av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
 +        for (i = 0; i<MAX_STD_TIMEBASES; i++) {
 +            if (st->info->duration_error[0][1][i] < 1e10) {
 +                int framerate = get_std_framerate(i);
 +                double sdts = dts*framerate/(1001*12);
 +                for (j= 0; j<2; j++) {
 +                    int64_t ticks = llrint(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++;
 +        st->info->rfps_duration_sum += duration;
 +
 +        if (st->info->duration_count % 10 == 0) {
 +            int n = st->info->duration_count;
 +            for (i = 0; i<MAX_STD_TIMEBASES; i++) {
 +                if (st->info->duration_error[0][1][i] < 1e10) {
 +                    double a0     = st->info->duration_error[0][0][i] / n;
 +                    double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
 +                    double a1     = st->info->duration_error[1][0][i] / n;
 +                    double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
 +                    if (error0 > 0.04 && error1 > 0.04) {
 +                        st->info->duration_error[0][1][i] = 2e10;
 +                        st->info->duration_error[1][1][i] = 2e10;
 +                    }
 +                }
 +            }
 +        }
 +
 +        // ignore the first 4 values, they might have some random jitter
 +        if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
 +            st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
 +    }
 +    if (ts != AV_NOPTS_VALUE)
 +        st->info->last_dts = ts;
 +
 +    return 0;
 +}
 +
 +void ff_rfps_calculate(AVFormatContext *ic)
 +{
 +    int i, j;
 +
 +    for (i = 0; i < ic->nb_streams; i++) {
 +        AVStream *st = ic->streams[i];
 +
 +        if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
 +            continue;
 +        // 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 > 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>1 && !st->r_frame_rate.num
 +            && tb_unreliable(st->codec)) {
 +            int num = 0;
 +            double best_error= 0.01;
 +
 +            for (j= 0; j<MAX_STD_TIMEBASES; 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;
 +                if (!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
 +                    continue;
 +
 +                if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/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.
 +            if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
 +                av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
 +        }
 +
 +        av_freep(&st->info->duration_error);
 +        st->info->last_dts = AV_NOPTS_VALUE;
 +        st->info->duration_count = 0;
 +        st->info->rfps_duration_sum = 0;
 +    }
 +}
 +
  int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
  {
 -    int i, count, ret, read_size, j;
 +    int i, count, ret = 0, j;
 +    int64_t read_size;
      AVStream *st;
      AVPacket pkt1, *pkt;
      int64_t old_offset  = avio_tell(ic->pb);
      // new streams might appear, no options for those
      int orig_nb_streams = ic->nb_streams;
 +    int flush_codecs    = ic->probesize > 0;
 +
 +    if (ic->pb)
 +        av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
 +               avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
  
      for (i = 0; i < ic->nb_streams; i++) {
          const AVCodec *codec;
          AVDictionary *thread_opt = NULL;
          st = ic->streams[i];
  
 +        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
 +            st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 +/*            if (!st->time_base.num)
 +                st->time_base = */
 +            if (!st->codec->time_base.num)
 +                st->codec->time_base = st->time_base;
 +        }
          // only for the split stuff
          if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
              st->parser = av_parser_init(st->codec->codec_id);
 -            if (st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser)
 -                st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
 +            if (st->parser) {
 +                if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
 +                    st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
 +                } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
 +                    st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
 +                }
 +            } else if (st->need_parsing) {
 +                av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
 +                       "%s, packets or times may be invalid.\n",
 +                       avcodec_get_name(st->codec->codec_id));
 +            }
          }
 -        codec = st->codec->codec ? st->codec->codec
 -                                 : avcodec_find_decoder(st->codec->codec_id);
 +        codec = find_decoder(ic, st, st->codec->codec_id);
  
          /* Force thread count to 1 since the H.264 decoder will not extract
           * SPS and PPS to extradata during multi-threaded decoding. */
  
          /* Ensure that subtitle_header is properly set. */
          if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
 -            && codec && !st->codec->codec)
 -            avcodec_open2(st->codec, codec,
 -                          options ? &options[i] : &thread_opt);
 +            && codec && !st->codec->codec) {
 +            if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
 +                av_log(ic, AV_LOG_WARNING,
 +                       "Failed to open codec in av_find_stream_info\n");
 +        }
  
          // Try to just open decoders, in case this is enough to get parameters.
 -        if (!has_codec_parameters(st)) {
 +        if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
              if (codec && !st->codec->codec)
 -                avcodec_open2(st->codec, codec,
 -                              options ? &options[i] : &thread_opt);
 +                if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
 +                    av_log(ic, AV_LOG_WARNING,
 +                           "Failed to open codec in av_find_stream_info\n");
          }
          if (!options)
              av_dict_free(&thread_opt);
      }
  
      for (i = 0; i < ic->nb_streams; i++) {
 +#if FF_API_R_FRAME_RATE
 +        ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
 +#endif
          ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
          ic->streams[i]->info->fps_last_dts  = AV_NOPTS_VALUE;
      }
              int fps_analyze_framecount = 20;
  
              st = ic->streams[i];
 -            if (!has_codec_parameters(st))
 +            if (!has_codec_parameters(st, NULL))
                  break;
              /* If the timebase is coarse (like the usual millisecond precision
               * of mkv), we need to analyze more frames to reliably arrive at
                  fps_analyze_framecount *= 2;
              if (ic->fps_probe_size >= 0)
                  fps_analyze_framecount = ic->fps_probe_size;
 +            if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
 +                fps_analyze_framecount = 0;
              /* variable fps and no guess at the real fps */
 -            if (tb_unreliable(st->codec) && !st->avg_frame_rate.num &&
 -                st->codec_info_nb_frames < fps_analyze_framecount &&
 +            if (tb_unreliable(st->codec) &&
 +                !(st->r_frame_rate.num && st->avg_frame_rate.num) &&
 +                st->info->duration_count < fps_analyze_framecount &&
                  st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
                  break;
              if (st->parser && st->parser->parser->split &&
                  /* If we found the info for all the codecs, we can stop. */
                  ret = count;
                  av_log(ic, AV_LOG_DEBUG, "All info found\n");
 +                flush_codecs = 0;
                  break;
              }
          }
          if (read_size >= ic->probesize) {
              ret = count;
              av_log(ic, AV_LOG_DEBUG,
 -                   "Probe buffer size limit %d reached\n", ic->probesize);
 +                   "Probe buffer size limit of %d bytes reached\n", ic->probesize);
 +            for (i = 0; i < ic->nb_streams; i++)
 +                if (!ic->streams[i]->r_frame_rate.num &&
 +                    ic->streams[i]->info->duration_count <= 1 &&
 +                    ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
 +                    strcmp(ic->iformat->name, "image2"))
 +                    av_log(ic, AV_LOG_WARNING,
 +                           "Stream #%d: not enough frames to estimate rate; "
 +                           "consider increasing probesize\n", i);
              break;
          }
  
  
          if (ret < 0) {
              /* EOF or error*/
 -            AVPacket empty_pkt = { 0 };
 -            int err = 0;
 -            av_init_packet(&empty_pkt);
 -
 -            /* We could not have all the codec parameters before EOF. */
 -            ret = -1;
 -            for (i = 0; i < ic->nb_streams; i++) {
 -                st = ic->streams[i];
 -
 -                /* flush the decoders */
 -                if (st->info->found_decoder == 1) {
 -                    do {
 -                        err = try_decode_frame(st, &empty_pkt,
 -                                               (options && i < orig_nb_streams)
 -                                               ? &options[i] : NULL);
 -                    } while (err > 0 && !has_codec_parameters(st));
 -                }
 -
 -                if (err < 0) {
 -                    av_log(ic, AV_LOG_WARNING,
 -                           "decoding for stream %d failed\n", st->index);
 -                } else if (!has_codec_parameters(st)) {
 -                    char buf[256];
 -                    avcodec_string(buf, sizeof(buf), st->codec, 0);
 -                    av_log(ic, AV_LOG_WARNING,
 -                           "Could not find codec parameters (%s)\n", buf);
 -                } else {
 -                    ret = 0;
 -                }
 -            }
              break;
          }
  
 -        if (ic->flags & AVFMT_FLAG_NOBUFFER) {
 -            pkt = &pkt1;
 -        } else {
 +        if (ic->flags & AVFMT_FLAG_NOBUFFER)
 +            free_packet_buffer(&ic->packet_buffer, &ic->packet_buffer_end);
 +        {
              pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
                                  &ic->packet_buffer_end);
 +            if (!pkt) {
 +                ret = AVERROR(ENOMEM);
 +                goto find_stream_info_err;
 +            }
              if ((ret = av_dup_packet(pkt)) < 0)
                  goto find_stream_info_err;
          }
  
 -        read_size += pkt->size;
 -
          st = ic->streams[pkt->stream_index];
 +        if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
 +            read_size += pkt->size;
 +
          if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
              /* check for non-increasing dts */
              if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
                  st->info->fps_last_dts >= pkt->dts) {
 -                av_log(ic, AV_LOG_WARNING,
 +                av_log(ic, AV_LOG_DEBUG,
                         "Non-increasing DTS in stream %d: packet %d with DTS "
                         "%"PRId64", packet %d with DTS %"PRId64"\n",
                         st->index, st->info->fps_last_dts_idx,
              }
              st->info->fps_last_dts     = pkt->dts;
              st->info->fps_last_dts_idx = st->codec_info_nb_frames;
 -
 -            /* check max_analyze_duration */
 -            if (av_rescale_q(pkt->dts - st->info->fps_first_dts, st->time_base,
 -                             AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
 -                av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached\n",
 -                       ic->max_analyze_duration);
 +        }
 +        if (st->codec_info_nb_frames>1) {
 +            int64_t t = 0;
 +            if (st->time_base.den > 0)
 +                t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
 +            if (st->avg_frame_rate.num > 0)
 +                t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
 +
 +            if (   t == 0
 +                && st->codec_info_nb_frames>30
 +                && st->info->fps_first_dts != AV_NOPTS_VALUE
 +                && st->info->fps_last_dts  != AV_NOPTS_VALUE)
 +                t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
 +
 +            if (t >= ic->max_analyze_duration) {
 +                av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %d reached at %"PRId64" microseconds\n",
 +                       ic->max_analyze_duration,
 +                       t);
                  break;
              }
 +            if (pkt->duration) {
 +                st->info->codec_info_duration        += pkt->duration;
 +                st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
 +            }
          }
 +#if FF_API_R_FRAME_RATE
 +        ff_rfps_add_frame(ic, st, pkt->dts);
 +#endif
          if (st->parser && st->parser->parser->split && !st->codec->extradata) {
              int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
              if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
 -                st->codec->extradata_size = i;
 -                st->codec->extradata = av_malloc(st->codec->extradata_size +
 -                                                 FF_INPUT_BUFFER_PADDING_SIZE);
 -                if (!st->codec->extradata)
 +                if (ff_alloc_extradata(st->codec, i))
                      return AVERROR(ENOMEM);
                  memcpy(st->codec->extradata, pkt->data,
                         st->codec->extradata_size);
 -                memset(st->codec->extradata + i, 0,
 -                       FF_INPUT_BUFFER_PADDING_SIZE);
              }
          }
  
           * least one frame of codec data, this makes sure the codec initializes
           * the channel configuration and does not only trust the values from
           * the container. */
 -        try_decode_frame(st, pkt,
 +        try_decode_frame(ic, st, pkt,
                           (options && i < orig_nb_streams) ? &options[i] : NULL);
  
          st->codec_info_nb_frames++;
          count++;
      }
  
 +    if (flush_codecs) {
 +        AVPacket empty_pkt = { 0 };
 +        int err = 0;
 +        av_init_packet(&empty_pkt);
 +
 +        for (i = 0; i < ic->nb_streams; i++) {
 +
 +            st = ic->streams[i];
 +
 +            /* flush the decoders */
 +            if (st->info->found_decoder == 1) {
 +                do {
 +                    err = try_decode_frame(ic, st, &empty_pkt,
 +                                            (options && i < orig_nb_streams)
 +                                            ? &options[i] : NULL);
 +                } while (err > 0 && !has_codec_parameters(st, NULL));
 +
 +                if (err < 0) {
 +                    av_log(ic, AV_LOG_INFO,
 +                        "decoding for stream %d failed\n", st->index);
 +                }
 +            }
 +        }
 +    }
 +
      // close codecs which were opened in try_decode_frame()
      for (i = 0; i < ic->nb_streams; i++) {
          st = ic->streams[i];
          avcodec_close(st->codec);
      }
 +
 +    ff_rfps_calculate(ic);
 +
      for (i = 0; i < ic->nb_streams; i++) {
          st = ic->streams[i];
          if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +            if (st->codec->codec_id == AV_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 (avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
 +                    st->codec->codec_tag= tag;
 +            }
 +
              /* estimate average framerate if not set by demuxer */
 -            if (!st->avg_frame_rate.num &&
 -                st->info->fps_last_dts != st->info->fps_first_dts) {
 -                int64_t delta_dts = st->info->fps_last_dts -
 -                                    st->info->fps_first_dts;
 -                int delta_packets = st->info->fps_last_dts_idx -
 -                                    st->info->fps_first_dts_idx;
 +            if (st->info->codec_info_duration_fields &&
 +                !st->avg_frame_rate.num &&
 +                st->info->codec_info_duration) {
                  int best_fps      = 0;
                  double best_error = 0.01;
  
 -                if (delta_dts     >= INT64_MAX / st->time_base.num ||
 -                    delta_packets >= INT64_MAX / st->time_base.den ||
 -                    delta_dts < 0)
 +                if (st->info->codec_info_duration        >= INT64_MAX / st->time_base.num / 2||
 +                    st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
 +                    st->info->codec_info_duration        < 0)
                      continue;
                  av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
 -                          delta_packets * (int64_t) st->time_base.den,
 -                          delta_dts * (int64_t) st->time_base.num, 60000);
 +                          st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
 +                          st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
  
                  /* Round guessed framerate to a "standard" framerate if it's
                   * within 1% of the original estimate. */
                      av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
                                best_fps, 12 * 1001, INT_MAX);
              }
 +
 +            if (!st->r_frame_rate.num) {
 +                if (    st->codec->time_base.den * (int64_t) st->time_base.num
 +                    <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
 +                    st->r_frame_rate.num = st->codec->time_base.den;
 +                    st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
 +                } else {
 +                    st->r_frame_rate.num = st->time_base.den;
 +                    st->r_frame_rate.den = st->time_base.num;
 +                }
 +            }
          } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
              if (!st->codec->bits_per_coded_sample)
                  st->codec->bits_per_coded_sample =
          }
      }
  
 +    if (ic->probesize)
      estimate_timings(ic, old_offset);
  
 +    if (ret >= 0 && ic->nb_streams)
 +        /* We could not have all the codec parameters before EOF. */
 +        ret = -1;
 +    for (i = 0; i < ic->nb_streams; i++) {
 +        const char *errmsg;
 +        st = ic->streams[i];
 +        if (!has_codec_parameters(st, &errmsg)) {
 +            char buf[256];
 +            avcodec_string(buf, sizeof(buf), st->codec, 0);
 +            av_log(ic, AV_LOG_WARNING,
 +                   "Could not find codec parameters for stream %d (%s): %s\n"
 +                   "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
 +                   i, buf, errmsg);
 +        } else {
 +            ret = 0;
 +        }
 +    }
 +
      compute_chapters_end(ic);
  
  find_stream_info_err:
      for (i = 0; i < ic->nb_streams; i++) {
 -        ic->streams[i]->codec->thread_count = 0;
 +        st = ic->streams[i];
 +        if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
 +            ic->streams[i]->codec->thread_count = 0;
 +        if (st->info)
 +            av_freep(&st->info->duration_error);
          av_freep(&ic->streams[i]->info);
      }
 +    if (ic->pb)
 +        av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
 +               avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
      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;
  }
  
@@@ -3431,12 -2526,12 +3431,12 @@@ int av_find_best_stream(AVFormatContex
                          AVCodec **decoder_ret, int flags)
  {
      int i, nb_streams = ic->nb_streams;
 -    int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
 +    int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
      unsigned *program = NULL;
      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;
              continue;
          if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
              continue;
 -        if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
 +        if (wanted_stream_nb != real_stream_index &&
 +            st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
                                 AV_DISPOSITION_VISUAL_IMPAIRED))
              continue;
 +        if (type == AVMEDIA_TYPE_AUDIO && !avctx->channels)
 +            continue;
          if (decoder_ret) {
 -            decoder = avcodec_find_decoder(st->codec->codec_id);
 +            decoder = find_decoder(ic, st, st->codec->codec_id);
              if (!decoder) {
                  if (ret < 0)
                      ret = AVERROR_DECODER_NOT_FOUND;
                  continue;
              }
          }
 -        if (best_count >= st->codec_info_nb_frames)
 +        count = st->codec_info_nb_frames;
 +        bitrate = avctx->bit_rate;
 +        multiframe = FFMIN(5, count);
 +        if ((best_multiframe >  multiframe) ||
 +            (best_multiframe == multiframe && best_bitrate >  bitrate) ||
 +            (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
              continue;
 -        best_count   = st->codec_info_nb_frames;
 +        best_count   = count;
 +        best_bitrate = bitrate;
 +        best_multiframe = multiframe;
          ret          = real_stream_index;
          best_decoder = decoder;
          if (program && i == nb_streams - 1 && ret < 0) {
@@@ -3508,41 -2593,38 +3508,47 @@@ int av_read_pause(AVFormatContext *s
      return AVERROR(ENOSYS);
  }
  
 +void ff_free_stream(AVFormatContext *s, AVStream *st) {
++    int j;
 +    av_assert0(s->nb_streams>0);
 +    av_assert0(s->streams[ s->nb_streams - 1 ] == st);
++
++    for (j = 0; j < st->nb_side_data; j++)
++        av_freep(&st->side_data[j].data);
++    av_freep(&st->side_data);
++    st->nb_side_data = 0;
 +
 +    if (st->parser) {
 +        av_parser_close(st->parser);
 +    }
 +    if (st->attached_pic.data)
 +        av_free_packet(&st->attached_pic);
 +    av_dict_free(&st->metadata);
 +    av_freep(&st->probe_data.buf);
 +    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);
 +    if (st->info)
 +        av_freep(&st->info->duration_error);
 +    av_freep(&st->info);
 +    av_freep(&s->streams[ --s->nb_streams ]);
 +}
 +
  void avformat_free_context(AVFormatContext *s)
  {
 -    int i, j;
 -    AVStream *st;
 +    int i;
 +
 +    if (!s)
 +        return;
  
      av_opt_free(s);
      if (s->iformat && s->iformat->priv_class && s->priv_data)
          av_opt_free(s->priv_data);
  
 -    for (i = 0; i < s->nb_streams; i++) {
 -        /* free all data in a stream component */
 -        st = s->streams[i];
 -
 -        for (j = 0; j < st->nb_side_data; j++)
 -            av_freep(&st->side_data[j].data);
 -        av_freep(&st->side_data);
 -        st->nb_side_data = 0;
 -
 -        if (st->parser) {
 -            av_parser_close(st->parser);
 -        }
 -        if (st->attached_pic.data)
 -            av_free_packet(&st->attached_pic);
 -        av_dict_free(&st->metadata);
 -        av_freep(&st->probe_data.buf);
 -        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);
 +    for (i = s->nb_streams - 1; i >= 0; i--) {
 +        ff_free_stream(s, s->streams[i]);
      }
      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);
      av_free(s);
  }
  
 +#if FF_API_CLOSE_INPUT_FILE
 +void av_close_input_file(AVFormatContext *s)
 +{
 +    avformat_close_input(&s);
 +}
 +#endif
 +
  void avformat_close_input(AVFormatContext **ps)
  {
 -    AVFormatContext *s = *ps;
 -    AVIOContext *pb    = s->pb;
 +    AVFormatContext *s;
 +    AVIOContext *pb;
 +
 +    if (!ps || !*ps)
 +        return;
 +
 +    s  = *ps;
 +    pb = s->pb;
  
      if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
          (s->flags & AVFMT_FLAG_CUSTOM_IO))
      avio_close(pb);
  }
  
 -AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
 +#if FF_API_NEW_STREAM
 +AVStream *av_new_stream(AVFormatContext *s, int id)
 +{
 +    AVStream *st = avformat_new_stream(s, NULL);
 +    if (st)
 +        st->id = id;
 +    return st;
 +}
 +#endif
 +
 +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
  {
      AVStream *st;
      int i;
 +    AVStream **streams;
  
 -    if (av_reallocp_array(&s->streams, s->nb_streams + 1,
 -                          sizeof(*s->streams)) < 0) {
 -        s->nb_streams = 0;
 +    if (s->nb_streams >= INT_MAX/sizeof(*streams))
          return NULL;
 -    }
 +    streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
 +    if (!streams)
 +        return NULL;
 +    s->streams = streams;
  
      st = av_mallocz(sizeof(AVStream));
      if (!st)
          av_free(st);
          return NULL;
      }
 +    st->info->last_dts = AV_NOPTS_VALUE;
  
      st->codec = avcodec_alloc_context3(c);
      if (s->iformat)
       * but durations get some timestamps, formats with some unknown
       * timestamps have their first few packets buffered and the
       * timestamps corrected before they are returned to the user */
 -    st->cur_dts       = 0;
 +    st->cur_dts       = s->iformat ? RELATIVE_TS_BASE : 0;
      st->first_dts     = AV_NOPTS_VALUE;
      st->probe_packets = MAX_PROBE_PACKETS;
 +    st->pts_wrap_reference = AV_NOPTS_VALUE;
 +    st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
  
      /* default pts setting is MPEG-like */
      avpriv_set_pts_info(st, 33, 1, 90000);
      st->last_IP_pts = AV_NOPTS_VALUE;
 +    st->last_dts_for_order_check = AV_NOPTS_VALUE;
      for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
          st->pts_buffer[i] = AV_NOPTS_VALUE;
  
      st->sample_aspect_ratio = (AVRational) { 0, 1 };
  
 +#if FF_API_R_FRAME_RATE
 +    st->info->last_dts      = AV_NOPTS_VALUE;
 +#endif
      st->info->fps_first_dts = AV_NOPTS_VALUE;
      st->info->fps_last_dts  = AV_NOPTS_VALUE;
  
@@@ -3684,11 -2734,6 +3690,11 @@@ AVProgram *av_new_program(AVFormatConte
          program->discard = AVDISCARD_NONE;
      }
      program->id = id;
 +    program->pts_wrap_reference = AV_NOPTS_VALUE;
 +    program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
 +
 +    program->start_time =
 +    program->end_time   = AV_NOPTS_VALUE;
  
      return program;
  }
@@@ -3722,7 -2767,6 +3728,7 @@@ void ff_program_add_stream_index(AVForm
  {
      int i, j;
      AVProgram *program = NULL;
 +    void *tmp;
  
      if (idx >= ac->nb_streams) {
          av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
              if (program->stream_index[j] == idx)
                  return;
  
 -        if (av_reallocp_array(&program->stream_index,
 -                              program->nb_stream_indexes + 1,
 -                              sizeof(*program->stream_index)) < 0) {
 -            program->nb_stream_indexes = 0;
 +        tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
 +        if (!tmp)
              return;
 -        }
 +        program->stream_index = tmp;
          program->stream_index[program->nb_stream_indexes++] = idx;
          return;
      }
@@@ -3764,22 -2810,9 +3770,22 @@@ 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))
 +            if (strcmp("language", tag->key)) {
 +                const char *p = tag->value;
                  av_log(ctx, AV_LOG_INFO,
 -                       "%s  %-16s: %s\n", indent, tag->key, tag->value);
 +                       "%s  %-16s: ", indent, tag->key);
 +                while (*p) {
 +                    char tmp[256];
 +                    size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
 +                    av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
 +                    av_log(ctx, AV_LOG_INFO, "%s", tmp);
 +                    p += len;
 +                    if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
 +                    if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s  %-16s: ", indent, "");
 +                    if (*p) p++;
 +                }
 +                av_log(ctx, AV_LOG_INFO, "\n");
 +            }
      }
  }
  
@@@ -3793,7 -2826,7 +3799,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);
      }
      if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
          if (st->avg_frame_rate.den && st->avg_frame_rate.num)
              print_fps(av_q2d(st->avg_frame_rate), "fps");
 +#if FF_API_R_FRAME_RATE
 +        if (st->r_frame_rate.den && st->r_frame_rate.num)
 +            print_fps(av_q2d(st->r_frame_rate), "tbr");
 +#endif
          if (st->time_base.den && st->time_base.num)
              print_fps(1 / av_q2d(st->time_base), "tbn");
          if (st->codec->time_base.den && st->codec->time_base.num)
@@@ -3868,9 -2897,8 +3874,9 @@@ void av_dump_format(AVFormatContext *ic
          av_log(NULL, AV_LOG_INFO, "  Duration: ");
          if (ic->duration != AV_NOPTS_VALUE) {
              int hours, mins, secs, us;
 -            secs  = ic->duration / AV_TIME_BASE;
 -            us    = ic->duration % AV_TIME_BASE;
 +            int64_t duration = ic->duration + 5000;
 +            secs  = duration / AV_TIME_BASE;
 +            us    = duration % AV_TIME_BASE;
              mins  = secs / 60;
              secs %= 60;
              hours = mins / 60;
@@@ -4073,7 -3101,7 +4079,7 @@@ void av_url_split(char *proto, int prot
                    char *hostname, int hostname_size,
                    int *port_ptr, char *path, int path_size, const char *url)
  {
 -    const char *p, *ls, *at, *col, *brk;
 +    const char *p, *ls, *ls2, *at, *at2, *col, *brk;
  
      if (port_ptr)
          *port_ptr = -1;
  
      /* separate path from hostname */
      ls = strchr(p, '/');
 +    ls2 = strchr(p, '?');
      if (!ls)
 -        ls = strchr(p, '?');
 +        ls = ls2;
 +    else if (ls && ls2)
 +        ls = FFMIN(ls, ls2);
      if (ls)
          av_strlcpy(path, ls, path_size);
      else
      /* the rest is hostname, use that to parse auth/port */
      if (ls != p) {
          /* authorization (user[:pass]@hostname) */
 -        if ((at = strchr(p, '@')) && at < ls) {
 -            av_strlcpy(authorization, p,
 -                       FFMIN(authorization_size, at + 1 - p));
 +        at2 = p;
 +        while ((at = strchr(p, '@')) && at < ls) {
 +            av_strlcpy(authorization, at2,
 +                       FFMIN(authorization_size, at + 1 - at2));
              p = at + 1; /* skip '@' */
          }
  
@@@ -4188,14 -3212,6 +4194,14 @@@ int ff_hex_to_data(uint8_t *data, cons
      return len;
  }
  
 +#if FF_API_SET_PTS_INFO
 +void av_set_pts_info(AVStream *s, int pts_wrap_bits,
 +                     unsigned int pts_num, unsigned int pts_den)
 +{
 +    avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
 +}
 +#endif
 +
  void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
                           unsigned int pts_num, unsigned int pts_den)
  {
  
      if (new_tb.num <= 0 || new_tb.den <= 0) {
          av_log(NULL, AV_LOG_ERROR,
 -               "Ignoring attempt to set invalid timebase for st:%d\n",
 +               "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
 +               new_tb.num, new_tb.den,
                 s->index);
          return;
      }
      s->time_base     = new_tb;
 +    av_codec_set_pkt_timebase(s->codec, new_tb);
      s->pts_wrap_bits = pts_wrap_bits;
  }
  
@@@ -4286,14 -3300,21 +4292,14 @@@ int ff_find_stream_index(AVFormatContex
  
  int64_t ff_iso8601_to_unix_time(const char *datestr)
  {
 -#if HAVE_STRPTIME
      struct tm time1 = { 0 }, time2 = { 0 };
      char *ret1, *ret2;
 -    ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
 -    ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
 +    ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
 +    ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
      if (ret2 && !ret1)
          return av_timegm(&time2);
      else
          return av_timegm(&time1);
 -#else
 -    av_log(NULL, AV_LOG_WARNING,
 -           "strptime() unavailable on this system, cannot convert "
 -           "the date string.\n");
 -    return 0;
 -#endif
  }
  
  int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id,
@@@ -4375,114 -3396,6 +4381,114 @@@ int ff_add_param_change(AVPacket *pkt, 
      return 0;
  }
  
 +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
 +{
 +    AVRational undef = {0, 1};
 +    AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
 +    AVRational codec_sample_aspect_ratio  = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
 +    AVRational frame_sample_aspect_ratio  = frame  ? frame->sample_aspect_ratio  : codec_sample_aspect_ratio;
 +
 +    av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
 +               stream_sample_aspect_ratio.num,  stream_sample_aspect_ratio.den, INT_MAX);
 +    if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
 +        stream_sample_aspect_ratio = undef;
 +
 +    av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
 +               frame_sample_aspect_ratio.num,  frame_sample_aspect_ratio.den, INT_MAX);
 +    if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
 +        frame_sample_aspect_ratio = undef;
 +
 +    if (stream_sample_aspect_ratio.num)
 +        return stream_sample_aspect_ratio;
 +    else
 +        return frame_sample_aspect_ratio;
 +}
 +
 +AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
 +{
 +    AVRational fr = st->r_frame_rate;
 +    AVRational codec_fr = av_inv_q(st->codec->time_base);
 +    AVRational   avg_fr = st->avg_frame_rate;
 +
 +    if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
 +        av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
 +        fr = avg_fr;
 +    }
 +
 +
 +    if (st->codec->ticks_per_frame > 1) {
 +        codec_fr.den *= st->codec->ticks_per_frame;
 +        if (   codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
 +            && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
 +            fr = codec_fr;
 +    }
 +
 +    return fr;
 +}
 +
 +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
 +                                    const char *spec)
 +{
 +    if (*spec <= '9' && *spec >= '0') /* opt:index */
 +        return strtol(spec, NULL, 0) == st->index;
 +    else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
 +             *spec == 't') { /* opt:[vasdt] */
 +        enum AVMediaType type;
 +
 +        switch (*spec++) {
 +        case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
 +        case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
 +        case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
 +        case 'd': type = AVMEDIA_TYPE_DATA;       break;
 +        case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
 +        default:  av_assert0(0);
 +        }
 +        if (type != st->codec->codec_type)
 +            return 0;
 +        if (*spec++ == ':') { /* possibly followed by :index */
 +            int i, index = strtol(spec, NULL, 0);
 +            for (i = 0; i < s->nb_streams; i++)
 +                if (s->streams[i]->codec->codec_type == type && index-- == 0)
 +                   return i == st->index;
 +            return 0;
 +        }
 +        return 1;
 +    } else if (*spec == 'p' && *(spec + 1) == ':') {
 +        int prog_id, i, j;
 +        char *endptr;
 +        spec += 2;
 +        prog_id = strtol(spec, &endptr, 0);
 +        for (i = 0; i < s->nb_programs; i++) {
 +            if (s->programs[i]->id != prog_id)
 +                continue;
 +
 +            if (*endptr++ == ':') {
 +                int stream_idx = strtol(endptr, NULL, 0);
 +                return stream_idx >= 0 &&
 +                    stream_idx < s->programs[i]->nb_stream_indexes &&
 +                    st->index == s->programs[i]->stream_index[stream_idx];
 +            }
 +
 +            for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
 +                if (st->index == s->programs[i]->stream_index[j])
 +                    return 1;
 +        }
 +        return 0;
 +    } else if (*spec == '#' ||
 +               (*spec == 'i' && *(spec + 1) == ':')) {
 +        int stream_id;
 +        char *endptr;
 +        spec += 1 + (*spec == 'i');
 +        stream_id = strtol(spec, &endptr, 0);
 +        if (!*endptr)
 +            return stream_id == st->id;
 +    } else if (!*spec) /* empty specifier, matches everything */
 +        return 1;
 +
 +    av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
 +    return AVERROR(EINVAL);
 +}
 +
  int ff_generate_avci_extradata(AVStream *st)
  {
      static const uint8_t avci100_1080p_extradata[] = {
          0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
          0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
          0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
 -        0x81, 0x13, 0xf7, 0xff, 0x80, 0x01, 0x80, 0x02,
 -        0x71, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
 +        0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
 +        0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
          0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
          // PPS
          0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
          return 0;
  
      av_freep(&st->codec->extradata);
 -    st->codec->extradata_size = 0;
 -    st->codec->extradata      = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
 -    if (!st->codec->extradata)
 +    if (ff_alloc_extradata(st->codec, size))
          return AVERROR(ENOMEM);
 -
      memcpy(st->codec->extradata, data, size);
 -    st->codec->extradata_size = size;
  
      return 0;
  }
diff --combined libavformat/version.h
@@@ -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
   */
  
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 55
- #define LIBAVFORMAT_VERSION_MINOR 34
- #define LIBAVFORMAT_VERSION_MICRO 101
 -#define LIBAVFORMAT_VERSION_MINOR 13
 -#define LIBAVFORMAT_VERSION_MICRO  0
++#define LIBAVFORMAT_VERSION_MINOR 35
++#define LIBAVFORMAT_VERSION_MICRO 100
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \
  #define FF_API_REFERENCE_DTS            (LIBAVFORMAT_VERSION_MAJOR < 56)
  #endif
  
 +#ifndef FF_API_ALLOC_OUTPUT_CONTEXT
 +#define FF_API_ALLOC_OUTPUT_CONTEXT    (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_FORMAT_PARAMETERS
 +#define FF_API_FORMAT_PARAMETERS       (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_NEW_STREAM
 +#define FF_API_NEW_STREAM              (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_SET_PTS_INFO
 +#define FF_API_SET_PTS_INFO            (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_CLOSE_INPUT_FILE
 +#define FF_API_CLOSE_INPUT_FILE        (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_READ_PACKET
 +#define FF_API_READ_PACKET             (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_ASS_SSA
 +#define FF_API_ASS_SSA                 (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_R_FRAME_RATE
 +#define FF_API_R_FRAME_RATE            1
 +#endif
  #endif /* AVFORMAT_VERSION_H */