Merge commit '70daeacd6ef8b354dd7d2d77ad393831a5bbf033'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 28 Mar 2014 03:31:42 +0000 (04:31 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 28 Mar 2014 03:32:05 +0000 (04:32 +0100)
* commit '70daeacd6ef8b354dd7d2d77ad393831a5bbf033':
  PAF demuxer and decoder

Conflicts:
Changelog
doc/general.texi
libavcodec/avcodec.h
libavcodec/codec_desc.c
libavcodec/paf.c
libavcodec/version.h
libavformat/Makefile
libavformat/allformats.c
libavformat/paf.c
libavformat/version.h

See: 7de4a16508cb9bd2d40855f7114dea14329ef62a, and others
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/general.texi
libavcodec/avcodec.h
libavcodec/codec_desc.c
libavcodec/paf.c
libavcodec/utils.c
libavcodec/version.h
libavformat/paf.c
libavformat/version.h

@@@ -205,21 -179,12 +205,21 @@@ library
  @item American Laser Games MM   @tab   @tab X
      @tab Multimedia format used in games like Mad Dog McCree.
  @item 3GPP AMR                  @tab X @tab X
- @item Amazing Studio Packed Animation File        @tab   @tab X
+ @item Amazing Studio Packed Animation File  @tab   @tab X
      @tab Multimedia format used in game Heart Of Darkness.
  @item Apple HTTP Live Streaming @tab   @tab X
 +@item Artworx Data Format       @tab   @tab X
 +@item ADP                       @tab   @tab X
 +    @tab Audio format used on the Nintendo Gamecube.
 +@item AFC                       @tab   @tab X
 +    @tab Audio format used on the Nintendo Gamecube.
  @item ASF                       @tab X @tab X
 +@item AST                       @tab X @tab X
 +    @tab Audio format used on the Nintendo Wii.
  @item AVI                       @tab X @tab X
  @item AviSynth                  @tab   @tab X
 +@item AVR                       @tab   @tab X
 +    @tab Audio format used on Mac.
  @item AVS                       @tab   @tab X
      @tab Multimedia format used by the Creature Shock game.
  @item Beam Software SIFF        @tab   @tab X
@@@ -280,43 -278,15 +280,44 @@@ enum AVCodecID 
      AV_CODEC_ID_MSS2,
      AV_CODEC_ID_VP9,
      AV_CODEC_ID_AIC,
 -    AV_CODEC_ID_ESCAPE130,
 -    AV_CODEC_ID_G2M,
 -    AV_CODEC_ID_WEBP,
 +    AV_CODEC_ID_ESCAPE130_DEPRECATED,
 +    AV_CODEC_ID_G2M_DEPRECATED,
 +    AV_CODEC_ID_WEBP_DEPRECATED,
      AV_CODEC_ID_HNM4_VIDEO,
 -    AV_CODEC_ID_HEVC,
 +    AV_CODEC_ID_HEVC_DEPRECATED,
      AV_CODEC_ID_FIC,
      AV_CODEC_ID_ALIAS_PIX,
 -    AV_CODEC_ID_BRENDER_PIX,
 -    AV_CODEC_ID_PAF_VIDEO,
 +    AV_CODEC_ID_BRENDER_PIX_DEPRECATED,
++    AV_CODEC_ID_PAF_VIDEO_DEPRECATED,
 +
 +    AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'),
 +    AV_CODEC_ID_Y41P       = MKBETAG('Y','4','1','P'),
 +    AV_CODEC_ID_ESCAPE130  = MKBETAG('E','1','3','0'),
 +    AV_CODEC_ID_EXR        = MKBETAG('0','E','X','R'),
 +    AV_CODEC_ID_AVRP       = MKBETAG('A','V','R','P'),
 +
 +    AV_CODEC_ID_012V       = MKBETAG('0','1','2','V'),
 +    AV_CODEC_ID_G2M        = MKBETAG( 0 ,'G','2','M'),
 +    AV_CODEC_ID_AVUI       = MKBETAG('A','V','U','I'),
 +    AV_CODEC_ID_AYUV       = MKBETAG('A','Y','U','V'),
 +    AV_CODEC_ID_TARGA_Y216 = MKBETAG('T','2','1','6'),
 +    AV_CODEC_ID_V308       = MKBETAG('V','3','0','8'),
 +    AV_CODEC_ID_V408       = MKBETAG('V','4','0','8'),
 +    AV_CODEC_ID_YUV4       = MKBETAG('Y','U','V','4'),
 +    AV_CODEC_ID_SANM       = MKBETAG('S','A','N','M'),
 +    AV_CODEC_ID_PAF_VIDEO  = MKBETAG('P','A','F','V'),
 +    AV_CODEC_ID_AVRN       = MKBETAG('A','V','R','n'),
 +    AV_CODEC_ID_CPIA       = MKBETAG('C','P','I','A'),
 +    AV_CODEC_ID_XFACE      = MKBETAG('X','F','A','C'),
 +    AV_CODEC_ID_SGIRLE     = MKBETAG('S','G','I','R'),
 +    AV_CODEC_ID_MVC1       = MKBETAG('M','V','C','1'),
 +    AV_CODEC_ID_MVC2       = MKBETAG('M','V','C','2'),
 +    AV_CODEC_ID_SNOW       = MKBETAG('S','N','O','W'),
 +    AV_CODEC_ID_WEBP       = MKBETAG('W','E','B','P'),
 +    AV_CODEC_ID_SMVJPEG    = MKBETAG('S','M','V','J'),
 +    AV_CODEC_ID_HEVC       = MKBETAG('H','2','6','5'),
 +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
 +    AV_CODEC_ID_VP7        = MKBETAG('V','P','7','0'),
  
      /* various PCM "codecs" */
      AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
      AV_CODEC_ID_RALF,
      AV_CODEC_ID_IAC,
      AV_CODEC_ID_ILBC,
 -    AV_CODEC_ID_OPUS,
 +    AV_CODEC_ID_OPUS_DEPRECATED,
      AV_CODEC_ID_COMFORT_NOISE,
 -    AV_CODEC_ID_TAK,
 +    AV_CODEC_ID_TAK_DEPRECATED,
      AV_CODEC_ID_METASOUND,
 -    AV_CODEC_ID_PAF_AUDIO,
++    AV_CODEC_ID_PAF_AUDIO_DEPRECATED,
 +    AV_CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
 +    AV_CODEC_ID_SONIC       = MKBETAG('S','O','N','C'),
 +    AV_CODEC_ID_SONIC_LS    = MKBETAG('S','O','N','L'),
 +    AV_CODEC_ID_PAF_AUDIO   = MKBETAG('P','A','F','A'),
 +    AV_CODEC_ID_OPUS        = MKBETAG('O','P','U','S'),
 +    AV_CODEC_ID_TAK         = MKBETAG('t','B','a','K'),
 +    AV_CODEC_ID_EVRC        = MKBETAG('s','e','v','c'),
 +    AV_CODEC_ID_SMV         = MKBETAG('s','s','m','v'),
  
      /* subtitle codecs */
      AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
@@@ -1103,110 -1065,6 +1103,103 @@@ static const AVCodecDescriptor codec_de
          .props     = AV_CODEC_PROP_LOSSY,
      },
      {
-         .id        = AV_CODEC_ID_PAF_VIDEO,
-         .type      = AVMEDIA_TYPE_VIDEO,
-         .name      = "paf_video",
-         .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Video"),
-         .props     = AV_CODEC_PROP_LOSSY,
-     },
-     {
 +        .id        = AV_CODEC_ID_EXR,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "exr",
 +        .long_name = NULL_IF_CONFIG_SMALL("OpenEXR image"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY |
 +                     AV_CODEC_PROP_LOSSLESS,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_AVRP,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "avrp",
 +        .long_name = NULL_IF_CONFIG_SMALL("Avid 1:1 10-bit RGB Packer"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_012V,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "012v",
 +        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_AVUI,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "avui",
 +        .long_name = NULL_IF_CONFIG_SMALL("Avid Meridien Uncompressed"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_AYUV,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "ayuv",
 +        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed MS 4:4:4:4"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_TARGA_Y216,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "targa_y216",
 +        .long_name = NULL_IF_CONFIG_SMALL("Pinnacle TARGA CineWave YUV16"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_V308,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "v308",
 +        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed 4:4:4"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_V408,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "v408",
 +        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed QT 4:4:4:4"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_YUV4,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "yuv4",
 +        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed 4:2:0"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SANM,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "sanm",
 +        .long_name = NULL_IF_CONFIG_SMALL("LucasArts SMUSH video"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_AVRN,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "avrn",
 +        .long_name = NULL_IF_CONFIG_SMALL("Avid AVI Codec"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_CPIA,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "cpia",
 +        .long_name = NULL_IF_CONFIG_SMALL("CPiA video format"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_XFACE,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "xface",
 +        .long_name = NULL_IF_CONFIG_SMALL("X-face image"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SMVJPEG,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "smv",
 +        .long_name = NULL_IF_CONFIG_SMALL("Sigmatel Motion Video"),
 +    },
 +
 +    {
          .id        = AV_CODEC_ID_G2M,
          .type      = AVMEDIA_TYPE_VIDEO,
          .name      = "g2m",
          .props     = AV_CODEC_PROP_LOSSY,
      },
      {
+         .id        = AV_CODEC_ID_PAF_VIDEO,
+         .type      = AVMEDIA_TYPE_VIDEO,
+         .name      = "paf_video",
+         .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Video"),
+         .props     = AV_CODEC_PROP_LOSSY,
+     },
++    {
 +        .id        = AV_CODEC_ID_VP7,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "vp7",
 +        .long_name = NULL_IF_CONFIG_SMALL("On2 VP7"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
  
      /* image codecs */
      {
          .props     = AV_CODEC_PROP_LOSSY,
      },
      {
-         .id        = AV_CODEC_ID_PAF_AUDIO,
-         .type      = AVMEDIA_TYPE_AUDIO,
-         .name      = "paf_audio",
-         .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Audio"),
-         .props     = AV_CODEC_PROP_LOSSY,
-     },
-     {
 +        .id        = AV_CODEC_ID_VIMA,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "vima",
 +        .long_name = NULL_IF_CONFIG_SMALL("LucasArts VIMA audio"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_FFWAVESYNTH,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "wavesynth",
 +        .long_name = NULL_IF_CONFIG_SMALL("Wave synthesis pseudo-codec"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SONIC,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "sonic",
 +        .long_name = NULL_IF_CONFIG_SMALL("Sonic"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SONIC_LS,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "sonicls",
 +        .long_name = NULL_IF_CONFIG_SMALL("Sonic lossless"),
 +    },
 +    {
          .id        = AV_CODEC_ID_OPUS,
          .type      = AVMEDIA_TYPE_AUDIO,
          .name      = "opus",
          .props     = AV_CODEC_PROP_LOSSY,
      },
      {
+         .id        = AV_CODEC_ID_PAF_AUDIO,
+         .type      = AVMEDIA_TYPE_AUDIO,
+         .name      = "paf_audio",
+         .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Audio"),
+         .props     = AV_CODEC_PROP_LOSSY,
+     },
++    {
 +        .id        = AV_CODEC_ID_EVRC,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "evrc",
 +        .long_name = NULL_IF_CONFIG_SMALL("EVRC (Enhanced Variable Rate Codec)"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SMV,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "smv",
 +        .long_name = NULL_IF_CONFIG_SMALL("SMV (Selectable Mode Vocoder)"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
  
      /* subtitle codecs */
      {
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
+ #include "libavutil/imgutils.h"
  #include "libavutil/intreadwrite.h"
- #include "bytestream.h"
 +#include "libavcodec/paf.h"
  #include "avcodec.h"
+ #include "bytestream.h"
  #include "copy_block.h"
  #include "internal.h"
+ #include "mathops.h"
  
 -#define PAF_SOUND_SAMPLES     2205
 -#define PAF_SOUND_FRAME_SIZE  ((256 + PAF_SOUND_SAMPLES) * 2)
--
- static const uint8_t block_sequences[16][8] =
- {
+ static const uint8_t block_sequences[16][8] = {
 -    { 0, 0, 0, 0, 0, 0, 0, 0 }, { 2, 0, 0, 0, 0, 0, 0, 0 },
 -    { 5, 7, 0, 0, 0, 0, 0, 0 }, { 5, 0, 0, 0, 0, 0, 0, 0 },
 -    { 6, 0, 0, 0, 0, 0, 0, 0 }, { 5, 7, 5, 7, 0, 0, 0, 0 },
 -    { 5, 7, 5, 0, 0, 0, 0, 0 }, { 5, 7, 6, 0, 0, 0, 0, 0 },
 -    { 5, 5, 0, 0, 0, 0, 0, 0 }, { 3, 0, 0, 0, 0, 0, 0, 0 },
 -    { 6, 6, 0, 0, 0, 0, 0, 0 }, { 2, 4, 0, 0, 0, 0, 0, 0 },
 -    { 2, 4, 5, 7, 0, 0, 0, 0 }, { 2, 4, 5, 0, 0, 0, 0, 0 },
 -    { 2, 4, 6, 0, 0, 0, 0, 0 }, { 2, 4, 5, 7, 5, 7, 0, 0 },
 +    { 0, 0, 0, 0, 0, 0, 0, 0 },
 +    { 2, 0, 0, 0, 0, 0, 0, 0 },
 +    { 5, 7, 0, 0, 0, 0, 0, 0 },
 +    { 5, 0, 0, 0, 0, 0, 0, 0 },
 +    { 6, 0, 0, 0, 0, 0, 0, 0 },
 +    { 5, 7, 5, 7, 0, 0, 0, 0 },
 +    { 5, 7, 5, 0, 0, 0, 0, 0 },
 +    { 5, 7, 6, 0, 0, 0, 0, 0 },
 +    { 5, 5, 0, 0, 0, 0, 0, 0 },
 +    { 3, 0, 0, 0, 0, 0, 0, 0 },
 +    { 6, 6, 0, 0, 0, 0, 0, 0 },
 +    { 2, 4, 0, 0, 0, 0, 0, 0 },
 +    { 2, 4, 5, 7, 0, 0, 0, 0 },
 +    { 2, 4, 5, 0, 0, 0, 0, 0 },
 +    { 2, 4, 6, 0, 0, 0, 0, 0 },
-     { 2, 4, 5, 7, 5, 7, 0, 0 }
++    { 2, 4, 5, 7, 5, 7, 0, 0 },
  };
  
  typedef struct PAFVideoDecContext {
@@@ -157,28 -161,27 +167,29 @@@ static int decode_0(PAFVideoDecContext 
      i = bytestream2_get_byte(&c->gb);
      if (i) {
          if (code & 0x10) {
 -            int pos = bytestream2_tell(&c->gb) & 3;
 -            if (pos)
 -                bytestream2_skip(&c->gb, 4 - pos);
 +            int align;
 +
 +            align = bytestream2_tell(&c->gb) & 3;
 +            if (align)
 +                bytestream2_skip(&c->gb, 4 - align);
          }
          do {
-             a      = bytestream2_get_byte(&c->gb);
-             b      = bytestream2_get_byte(&c->gb);
-             p      = (a & 0xC0) >> 6;
-             dst    = c->frame[p] + get_video_page_offset(avctx, a, b);
-             dend   = c->frame[p] + c->frame_size;
-             offset = (b & 0x7F) * 2;
+             int page, val, x, y;
+             val    = bytestream2_get_be16(&c->gb);
+             page   = val >> 14;
+             x      = (val & 0x7F) * 2;
+             y      = ((val >> 7) & 0x7F) * 2;
+             dst    = c->frame[page] + x + y * c->width;
+             dend   = c->frame[page] + c->frame_size;
+             offset = (x & 0x7F) * 2;
              j      = bytestream2_get_le16(&c->gb) + offset;
              do {
                  offset++;
-                 if (dst + 3 * avctx->width + 4 > dend)
+                 if (dst + 3 * c->width + 4 > dend)
                      return AVERROR_INVALIDDATA;
-                 copy4h(avctx, dst);
+                 read4x4block(c, dst, c->width);
                  if ((offset & 0x3F) == 0)
-                     dst += avctx->width * 3;
+                     dst += c->width * 3;
                  dst += 4;
              } while (offset < j);
          } while (--i);
@@@ -2669,25 -1663,6 +2669,27 @@@ av_cold int avcodec_close(AVCodecContex
      return 0;
  }
  
 +static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
 +{
 +    switch(id){
 +        //This is for future deprecatec codec ids, its empty since
 +        //last major bump but will fill up again over time, please don't remove it
 +//         case AV_CODEC_ID_UTVIDEO_DEPRECATED: return AV_CODEC_ID_UTVIDEO;
 +        case AV_CODEC_ID_BRENDER_PIX_DEPRECATED: return AV_CODEC_ID_BRENDER_PIX;
 +        case AV_CODEC_ID_OPUS_DEPRECATED: return AV_CODEC_ID_OPUS;
 +        case AV_CODEC_ID_TAK_DEPRECATED : return AV_CODEC_ID_TAK;
++        case AV_CODEC_ID_PAF_AUDIO_DEPRECATED : return AV_CODEC_ID_PAF_AUDIO;
 +        case AV_CODEC_ID_PCM_S24LE_PLANAR_DEPRECATED : return AV_CODEC_ID_PCM_S24LE_PLANAR;
 +        case AV_CODEC_ID_PCM_S32LE_PLANAR_DEPRECATED : return AV_CODEC_ID_PCM_S32LE_PLANAR;
 +        case AV_CODEC_ID_ESCAPE130_DEPRECATED : return AV_CODEC_ID_ESCAPE130;
 +        case AV_CODEC_ID_G2M_DEPRECATED : return AV_CODEC_ID_G2M;
++        case AV_CODEC_ID_PAF_VIDEO_DEPRECATED : return AV_CODEC_ID_PAF_VIDEO;
 +        case AV_CODEC_ID_WEBP_DEPRECATED: return AV_CODEC_ID_WEBP;
 +        case AV_CODEC_ID_HEVC_DEPRECATED: return AV_CODEC_ID_HEVC;
 +        default                         : return id;
 +    }
 +}
 +
  static AVCodec *find_encdec(enum AVCodecID id, int encoder)
  {
      AVCodec *p, *experimental = NULL;
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVCODEC_VERSION_MAJOR 55
 -#define LIBAVCODEC_VERSION_MINOR 39
 -#define LIBAVCODEC_VERSION_MICRO  0
 +#define LIBAVCODEC_VERSION_MINOR  55
- #define LIBAVCODEC_VERSION_MICRO 101
++#define LIBAVCODEC_VERSION_MICRO 102
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
@@@ -186,15 -193,12 +191,15 @@@ fail
  
  static int read_packet(AVFormatContext *s, AVPacket *pkt)
  {
-     PAFDemuxContext *p = s->priv_data;
+     PAFDemuxContext *p  = s->priv_data;
      AVIOContext     *pb = s->pb;
 -    uint32_t count, offset;
 -    int size, i;
 +    uint32_t        count, offset;
 +    int             size, i;
 +
 +    if (p->current_frame >= p->nb_frames)
 +        return AVERROR_EOF;
  
 -    if (p->current_frame >= p->nb_frames || pb->eof_reached)
 +    if (url_feof(pb))
          return AVERROR_EOF;
  
      if (p->got_audio) {
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 55
 -#define LIBAVFORMAT_VERSION_MINOR 14
 -#define LIBAVFORMAT_VERSION_MICRO  0
 +#define LIBAVFORMAT_VERSION_MINOR 35
- #define LIBAVFORMAT_VERSION_MICRO 101
++#define LIBAVFORMAT_VERSION_MICRO 102
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \