Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Feb 2014 18:02:46 +0000 (19:02 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Feb 2014 18:02:46 +0000 (19:02 +0100)
* qatar/master:
  Mirillis FIC video decoder

Conflicts:
Changelog
configure
libavcodec/Makefile
libavcodec/avcodec.h
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
configure
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/codec_desc.c
libavcodec/fic.c
libavcodec/version.h
libavformat/riff.c

diff --cc Changelog
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version 10:
 -- av_strnstr
 -- support ID3v2 tags in ASF files
 +version <next>
 +
 +- HNM version 4 demuxer and video decoder
 +- Live HDS muxer
 +- setsar/setdar filters now support variables in ratio expressions
 +- elbg filter
 +- string validation in ffprobe
 +- support for decoding through VDPAU in ffmpeg (the -hwaccel option)
 +- complete Voxware MetaSound decoder
 +- remove mp3_header_compress bitstream filter
 +- Windows resource files for shared libraries
 +- aeval filter
 +- stereoscopic 3d metadata handling
 +- WebP encoding via libwebp
 +- ATRAC3+ decoder
 +- VP8 in Ogg demuxing
 +- side & metadata support in NUT
 +- framepack filter
 +- XYZ12 rawvideo support in NUT
 +- Exif metadata support in WebP decoder
 +- OpenGL device
 +- Use metadata_header_padding to control padding in ID3 tags (currently used in
 +  MP3, AIFF, and OMA files), FLAC header, and the AVI "junk" block.
++- Mirillis FIC video decoder
 +
 +
 +version 2.1:
 +
 +- aecho filter
 +- perspective filter ported from libmpcodecs
 +- ffprobe -show_programs option
 +- compand filter
 +- RTMP seek support
 +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate
 +  even when used as an input option. Previous behavior can be restored with
 +  the -noaccurate_seek option.
 +- ffmpeg -t option can now be used for inputs, to limit the duration of
 +  data read from an input file
 +- incomplete Voxware MetaSound decoder
 +- read EXIF metadata from JPEG
 +- DVB teletext decoder
 +- phase filter ported from libmpcodecs
 +- w3fdif filter
 +- Opus support in Matroska
 +- FFV1 version 1.3 is stable and no longer experimental
 +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support
 +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be
 +  more consistent with other muxers.
 +- adelay filter
 +- pullup filter ported from libmpcodecs
 +- ffprobe -read_intervals option
 +- Lossless and alpha support for WebP decoder
 +- Error Resilient AAC syntax (ER AAC LC) decoding
 +- Low Delay AAC (ER AAC LD) decoding
 +- mux chapters in ASF files
 +- SFTP protocol (via libssh)
 +- libx264: add ability to encode in YUVJ422P and YUVJ444P
 +- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does
 +- make decoding alpha optional for prores, ffv1 and vp6 by setting
 +  the skip_alpha flag.
 +- ladspa wrapper filter
 +- native VP9 decoder
 +- dpx parser
 +- max_error_rate parameter in ffmpeg
 +- PulseAudio output device
 +- ReplayGain scanner
 +- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
 +- Linux framebuffer output device
 +- HEVC decoder
 +- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing
 +- mergeplanes filter
 +
 +
 +version 2.0:
 +
 +- curves filter
  - reference-counting for AVFrame and AVPacket data
 -- avconv now fails when input options are used for output file
 +- ffmpeg now fails when input options are used for output file
    or vice versa
 -- avconv options -filter_script and -filter_complex_script, which allow a
 +- support for Monkey's Audio versions from 3.93
 +- perms and aperms filters
 +- audio filtering support in ffplay
 +- 10% faster aac encoding on x86 and MIPS
 +- sine audio filter source
 +- WebP demuxing and decoding support
 +- ffmpeg options -filter_script and -filter_complex_script, which allow a
    filtergraph description to be read from a file
 +- OpenCL support
 +- audio phaser filter
 +- separatefields filter
 +- libquvi demuxer
  - uniform options syntax across all filters
 +- telecine filter
  - interlace filter
 -- JPEG 2000 decoder
 -- asetpts filter (same as setpts, but for audio)
 +- smptehdbars source
 +- inverse telecine filters (fieldmatch and decimate)
 +- colorbalance filter
 +- colorchannelmixer filter
 +- The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default at the next libavformat major bump.
 +- decent native animated GIF encoding
 +- asetrate filter
 +- interleave filter
 +- timeline editing with filters
 +- vidstabdetect and vidstabtransform filters for video stabilization using
 +  the vid.stab library
 +- astats filter
  - trim and atrim filters
 -- avconv -t and -ss (output-only) options are now sample-accurate when
 +- ffmpeg -t and -ss (output-only) options are now sample-accurate when
    transcoding audio
  - Matroska muxer can now put the index at the beginning of the file.
 -- avconv -deinterlace option removed, the yadif filter should be used instead
 +- extractplanes filter
 +- avectorscope filter
 +- ADPCM DTK decoder
 +- ADP demuxer
 +- RSD demuxer
 +- RedSpark demuxer
 +- ADPCM IMA Radical decoder
 +- zmq filters
 +- DCT denoiser filter (dctdnoiz)
 +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
  - Apple Intermediate Codec decoder
  - Escape 130 video decoder
 +- FTP protocol support
 +- V4L2 output device
 +- 3D LUT filter (lut3d)
 +- SMPTE 302M audio encoder
  - support for slice multithreading in libavfilter
 +- Hald CLUT support (generation and filtering)
  - VC-1 interlaced B-frame support
  - support for WavPack muxing (raw and in Matroska)
 +- XVideo output device
 +- vignette filter
 +- True Audio (TTA) encoder
  - Go2Webinar decoder
 +- mcdeint filter ported from libmpcodecs
 +- sab filter ported from libmpcodecs
 +- ffprobe -show_chapters option
  - WavPack encoding through libwavpack
 -- Added the -n parameter to avconv
 -- RTMP seek support
 -- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
 -  even when used as an input option. Previous behavior can be restored with
 -  the -noaccurate_seek option.
 -- avconv -t option can now be used for inputs, to limit the duration of
 -  data read from an input file
 -- Voxware MetaSound decoder
 -- WebP decoder
 -- Error Resilient AAC syntax (ER AAC LC) decoding
 -- Low Delay AAC (ER AAC LD) decoding
 -- mux chapters in ASF files
 -- Opus in Ogg demuxing
 -- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
 -- F4V muxer
 -- HNM version 4 demuxer and video decoder
 -- HEVC decoder
 -- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing
 -- remove avplay -vismv option, which has not worked for a long time
 -- Live HDS muxer
 -- setsar/setdar filters now support variables in ratio expressions
 -- dar variable in the scale filter now returns the actual DAR (i.e. a * sar)
 -- VP9 decoder
 -- support for decoding through VDPAU in avconv (the -hwaccel option)
 -- remove mp3_header_(de)compress bitstream filters
 -- stereoscopic 3d metadata handling
 -- png standalone parser
 -- WebP encoding via libwebp
 -- ATRAC3+ decoder
 -- framepack filter
 -- Mirillis FIC video decoder
 +- rotate filter
 +- spp filter ported from libmpcodecs
 +- libgme support
 +- psnr filter
  
  
 -version 9:
 -- av_basename and av_dirname
 -- adobe and limelight publisher authentication in RTMP
 +version 1.2:
 +
  - VDPAU hardware acceleration through normal hwaccel
  - SRTP support
 +- Error diffusion dither in Swscale
 +- Chained Ogg support
 +- Theora Midstream reconfiguration support
 +- EVRC decoder
 +- audio fade filter
 +- filtering audio with unknown channel layout
 +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 +  and treble audio filter
 +- improved showspectrum filter, with multichannel support and sox-like colors
 +- histogram filter
 +- tee muxer
 +- il filter ported from libmpcodecs
 +- support ID3v2 tags in ASF files
 +- encrypted TTA stream decoding support
 +- RF64 support in WAV muxer
 +- noise filter ported from libmpcodecs
 +- Subtitles character encoding conversion
 +- blend filter
 +- stereo3d filter ported from libmpcodecs
 +
  
 +version 1.1:
  
 -version 9_beta3:
 -- ashowinfo audio filter
 +- stream disposition information printing in ffprobe
 +- filter for loudness analysis following EBU R128
 +- Opus encoder using libopus
 +- ffprobe -select_streams option
 +- Pinnacle TARGA CineWave YUV16 decoder
 +- TAK demuxer, decoder and parser
 +- DTS-HD demuxer
 +- remove -same_quant, it hasn't worked for years
 +- FFM2 support
 +- X-Face image encoder and decoder
  - 24-bit FLAC encoding
 -- audio volume filter
 -- deprecated the avconv -vol option. the volume filter is to be used instead.
  - multi-channel ALAC encoding up to 7.1
 -- TAK demuxer, parser, and decoder
 -- adaptive frame-level multithreading for H.264
 -
 -
 -version 9_beta2:
  - metadata (INFO tag) support in WAV muxer
 +- subtitles raw text decoder
  - support for building DLLs using MSVC
 -- remove avserver daemon mode
 +- LVF demuxer
 +- ffescape tool
 +- metadata (info chunk) support in CAF muxer
 +- field filter ported from libmpcodecs
 +- AVR demuxer
 +- geq filter ported from libmpcodecs
 +- remove ffserver daemon mode
 +- AST muxer/demuxer
 +- new expansion syntax for drawtext
 +- BRender PIX image decoder
 +- ffprobe -show_entries option
 +- ffprobe -sections option
 +- ADPCM IMA Dialogic decoder
 +- BRSTM demuxer
 +- animated GIF decoder and demuxer
 +- PVF demuxer
 +- subtitles filter
 +- IRCAM muxer/demuxer
 +- Paris Audio File demuxer
 +- Virtual concatenation demuxer
 +- VobSub demuxer
 +- JSON captions for TED talks decoding support
 +- SOX Resampler support in libswresample
 +- aselect filter
 +- SGI RLE 8-bit decoder
 +- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 +- Silicon Graphics Movie demuxer
 +- apad filter
 +- Resolution & pixel format change support with multithreading for H.264
 +- documentation split into per-component manuals
 +- pp (postproc) filter ported from MPlayer
 +- NIST Sphere demuxer
 +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 +- Sony Wave64 muxer
 +- adobe and limelight publisher authentication in RTMP
 +- data: URI scheme
  - support building on the Plan 9 operating system
 -- ffv1: support version 1.3
 +- kerndeint filter ported from MPlayer
 +- histeq filter ported from VirtualDub
 +- Megalux Frame demuxer
 +- 012v decoder
 +- Improved AVC Intra decoding support
  
  
 -version 9_beta1:
 +version 1.0:
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 -- CDXL demuxer and decoder
 -- Apple ProRes encoder
 -- Sun Rasterfile Encoder
 -- remove libpostproc
 -- ID3v2 attached pictures reading and writing
 -- WMA Lossless decoder
 -- XBM encoder
 -- RealAudio Lossless decoder
 -- ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 -- add fps filter
 -- audio split filter
 -- audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
  - Indeo Audio decoder
  - channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
  - RTMPT protocol support
  - iLBC encoding/decoding via libilbc
  - Microsoft Screen 1 decoder
diff --cc configure
+++ b/configure
@@@ -1908,19 -1654,18 +1908,20 @@@ dxa_decoder_select="zlib
  eac3_decoder_select="ac3_decoder"
  eac3_encoder_select="ac3_encoder"
  eamad_decoder_select="aandcttables dsputil mpegvideo"
 -eatgq_decoder_select="aandcttables dsputil"
 +eatgq_decoder_select="aandcttables"
  eatqi_decoder_select="aandcttables error_resilience mpegvideo"
 +exr_decoder_select="zlib"
  ffv1_decoder_select="dsputil golomb rangecoder"
  ffv1_encoder_select="dsputil rangecoder"
 -ffvhuff_decoder_select="dsputil"
 -ffvhuff_encoder_select="dsputil huffman"
 +ffvhuff_decoder_select="dsputil llviddsp"
 +ffvhuff_encoder_select="dsputil huffman llviddsp"
+ fic_decoder_select="dsputil golomb"
  flac_decoder_select="golomb"
  flac_encoder_select="dsputil golomb lpc"
 -flashsv_decoder_deps="zlib"
 -flashsv_encoder_deps="zlib"
 -flashsv2_decoder_deps="zlib"
 +flashsv_decoder_select="zlib"
 +flashsv_encoder_select="zlib"
 +flashsv2_encoder_select="zlib"
 +flashsv2_decoder_select="zlib"
  flv_decoder_select="h263_decoder"
  flv_encoder_select="h263_encoder"
  fourxm_decoder_select="dsputil"
Simple merge
@@@ -205,12 -171,11 +205,13 @@@ OBJS-$(CONFIG_FFV1_DECODER)            
  OBJS-$(CONFIG_FFV1_ENCODER)            += ffv1enc.o ffv1.o
  OBJS-$(CONFIG_FFVHUFF_DECODER)         += huffyuv.o huffyuvdec.o
  OBJS-$(CONFIG_FFVHUFF_ENCODER)         += huffyuv.o huffyuvenc.o
 +OBJS-$(CONFIG_FFWAVESYNTH_DECODER)     += ffwavesynth.o
+ OBJS-$(CONFIG_FIC_DECODER)             += fic.o
  OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flac.o flacdsp.o
 -OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flac.o flacdsp.o
 +OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flac.o flacdsp.o vorbis_data.o
  OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
  OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
 +OBJS-$(CONFIG_FLASHSV2_ENCODER)        += flashsv2enc.o
  OBJS-$(CONFIG_FLASHSV2_DECODER)        += flashsv.o
  OBJS-$(CONFIG_FLIC_DECODER)            += flicvideo.o
  OBJS-$(CONFIG_FOURXM_DECODER)          += 4xm.o
@@@ -147,11 -138,11 +147,12 @@@ void avcodec_register_all(void
      REGISTER_DECODER(EIGHTSVX_FIB,      eightsvx_fib);
      REGISTER_DECODER(ESCAPE124,         escape124);
      REGISTER_DECODER(ESCAPE130,         escape130);
 +    REGISTER_DECODER(EXR,               exr);
      REGISTER_ENCDEC (FFV1,              ffv1);
      REGISTER_ENCDEC (FFVHUFF,           ffvhuff);
+     REGISTER_DECODER(FIC,               fic);
      REGISTER_ENCDEC (FLASHSV,           flashsv);
 -    REGISTER_DECODER(FLASHSV2,          flashsv2);
 +    REGISTER_ENCDEC (FLASHSV2,          flashsv2);
      REGISTER_DECODER(FLIC,              flic);
      REGISTER_ENCDEC (FLV,               flv);
      REGISTER_DECODER(FOURXM,            fourxm);
@@@ -280,40 -278,13 +280,41 @@@ 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_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
 +
      /* various PCM "codecs" */
      AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
      AV_CODEC_ID_PCM_S16LE = 0x10000,
@@@ -1400,9 -1249,16 +1400,16 @@@ static const AVCodecDescriptor codec_de
          .id        = AV_CODEC_ID_HEVC,
          .type      = AVMEDIA_TYPE_VIDEO,
          .name      = "hevc",
 -        .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
 +        .long_name = NULL_IF_CONFIG_SMALL("H.265 / HEVC (High Efficiency Video Coding)"),
          .props     = AV_CODEC_PROP_LOSSY,
      },
+     {
+         .id        = AV_CODEC_ID_FIC,
+         .type      = AVMEDIA_TYPE_VIDEO,
+         .name      = "fic",
+         .long_name = NULL_IF_CONFIG_SMALL("Mirillis FIC"),
+         .props     = AV_CODEC_PROP_LOSSY,
+     },
  
      /* various PCM "codecs" */
      {
index 0000000,9a3bc3e..fc0c2a5
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,298 +1,298 @@@
 - * This file is part of Libav.
+ /*
+  * Mirillis FIC decoder
+  *
+  * Copyright (c) 2014 Konstantin Shishkov
+  * Copyright (c) 2014 Derek Buitenhuis
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "libavutil/common.h"
+ #include "avcodec.h"
+ #include "internal.h"
+ #include "dsputil.h"
+ #include "get_bits.h"
+ #include "golomb.h"
+ typedef struct FICThreadContext {
+     DECLARE_ALIGNED(16, int16_t, block)[64];
+     uint8_t *src;
+     int slice_h;
+     int src_size;
+     int y_off;
+ } FICThreadContext;
+ typedef struct FICContext {
+     AVCodecContext *avctx;
+     AVFrame *frame;
+     DSPContext dsp;
+     ScanTable scantable;
+     FICThreadContext *slice_data;
+     int slice_data_size;
+     const uint8_t *qmat;
+     enum AVPictureType cur_frame_type;
+     int aligned_width, aligned_height;
+     int num_slices, slice_h;
+ } FICContext;
+ static const uint8_t fic_qmat_hq[64] = {
+     1, 2, 2, 2, 3, 3, 3, 4,
+     2, 2, 2, 3, 3, 3, 4, 4,
+     2, 2, 3, 3, 3, 4, 4, 4,
+     2, 2, 3, 3, 3, 4, 4, 5,
+     2, 3, 3, 3, 4, 4, 5, 6,
+     3, 3, 3, 4, 4, 5, 6, 7,
+     3, 3, 3, 4, 4, 5, 7, 7,
+     3, 3, 4, 4, 5, 7, 7, 7,
+ };
+ static const uint8_t fic_qmat_lq[64] = {
+     1,  5,  6,  7,  8,  9,  9, 11,
+     5,  5,  7,  8,  9,  9, 11, 12,
+     6,  7,  8,  9,  9, 11, 11, 12,
+     7,  7,  8,  9,  9, 11, 12, 13,
+     7,  8,  9,  9, 10, 11, 13, 16,
+     8,  9,  9, 10, 11, 13, 16, 19,
+     8,  9,  9, 11, 12, 15, 18, 23,
+     9,  9, 11, 12, 15, 18, 23, 27
+ };
+ static const uint8_t fic_header[7] = { 0, 0, 1, 'F', 'I', 'C', 'V' };
+ #define FIC_HEADER_SIZE 27
+ static int fic_decode_block(FICContext *ctx, GetBitContext *gb,
+                             uint8_t *dst, int stride, int16_t *block)
+ {
+     int i, num_coeff;
+     /* Is it a skip block? */
+     if (get_bits1(gb)) {
+         /* This is a P-frame. */
+         ctx->frame->key_frame = 0;
+         ctx->frame->pict_type = AV_PICTURE_TYPE_P;
+         return 0;
+     }
+     ctx->dsp.clear_block(block);
+     num_coeff = get_bits(gb, 7);
+     if (num_coeff > 64)
+         return AVERROR_INVALIDDATA;
+     for (i = 0; i < num_coeff; i++)
+         block[ctx->scantable.permutated[i]] = get_se_golomb(gb) * ctx->qmat[i];
+     ctx->dsp.idct_put(dst, stride, block);
+     return 0;
+ }
+ static int fic_decode_slice(AVCodecContext *avctx, void *tdata)
+ {
+     FICContext *ctx        = avctx->priv_data;
+     FICThreadContext *tctx = tdata;
+     GetBitContext gb;
+     uint8_t *src = tctx->src;
+     int slice_h  = tctx->slice_h;
+     int src_size = tctx->src_size;
+     int y_off    = tctx->y_off;
+     int x, y, p;
+     init_get_bits(&gb, src, src_size * 8);
+     for (p = 0; p < 3; p++) {
+         int stride   = ctx->frame->linesize[p];
+         uint8_t* dst = ctx->frame->data[p] + (y_off >> !!p) * stride;
+         for (y = 0; y < (slice_h >> !!p); y += 8) {
+             for (x = 0; x < (ctx->aligned_width >> !!p); x += 8) {
+                 int ret;
+                 if ((ret = fic_decode_block(ctx, &gb, dst + x, stride, tctx->block)) != 0)
+                     return ret;
+             }
+             dst += 8 * stride;
+         }
+     }
+     return 0;
+ }
+ static int fic_decode_frame(AVCodecContext *avctx, void *data,
+                             int *got_frame, AVPacket *avpkt)
+ {
+     FICContext *ctx = avctx->priv_data;
+     uint8_t *src = avpkt->data;
+     int ret;
+     int slice, nslices;
+     int msize;
+     int tsize;
+     uint8_t *sdata;
+     if ((ret = ff_reget_buffer(avctx, ctx->frame)) < 0) {
+         av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
+         return ret;
+     }
+     /* Header + at least one slice (4) */
+     if (avpkt->size < FIC_HEADER_SIZE + 4) {
+         av_log(avctx, AV_LOG_ERROR, "Frame data is too small.\n");
+         return AVERROR_INVALIDDATA;
+     }
+     /* Check for header. */
+     if (memcmp(src, fic_header, 7))
+         av_log(avctx, AV_LOG_WARNING, "Invalid FIC Header.\n");
+     nslices = src[13];
+     if (!nslices) {
+         av_log(avctx, AV_LOG_ERROR, "Zero slices found.\n");
+         return AVERROR_INVALIDDATA;
+     }
+     /* High or Low Quality Matrix? */
+     ctx->qmat = src[23] ? fic_qmat_hq : fic_qmat_lq;
+     /* Skip cursor data. */
+     tsize = AV_RB24(src + 24);
+     if (tsize > avpkt->size - FIC_HEADER_SIZE) {
+         av_log(avctx, AV_LOG_ERROR, "Invalid cursor data size.\n");
+         return AVERROR_INVALIDDATA;
+     }
+     /* Slice height for all but the last slice. */
+     ctx->slice_h = 16 * (ctx->aligned_height >> 4) / nslices;
+     if (ctx->slice_h % 16)
+         ctx->slice_h = FFALIGN(ctx->slice_h - 16, 16);
+     /* First slice offset and remaining data. */
+     sdata = src + tsize + FIC_HEADER_SIZE + 4 * nslices;
+     msize = avpkt->size - nslices * 4 - tsize - FIC_HEADER_SIZE;
+     if (msize <= 0) {
+         av_log(avctx, AV_LOG_ERROR, "Not enough frame data to decode.\n");
+         return AVERROR_INVALIDDATA;
+     }
+     /*
+      * Set the frametype to I initially. It will be set to P if the frame
+      * has any dependencies (skip blocks). There will be a race condition
+      * inside the slice decode function to set these, but we do not care.
+      * since they will only ever be set to 0/P.
+      */
+     ctx->frame->key_frame = 1;
+     ctx->frame->pict_type = AV_PICTURE_TYPE_I;
+     /* Allocate slice data. */
+     av_fast_malloc(&ctx->slice_data, &ctx->slice_data_size,
+                    nslices * sizeof(ctx->slice_data[0]));
+     if (!ctx->slice_data_size) {
+         av_log(avctx, AV_LOG_ERROR, "Could not allocate slice data.\n");
+         return AVERROR(ENOMEM);
+     }
+     for (slice = 0; slice < nslices; slice++) {
+         int slice_off = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4);
+         int slice_size;
+         int y_off   = ctx->slice_h * slice;
+         int slice_h = ctx->slice_h;
+         /*
+          * Either read the slice size, or consume all data left.
+          * Also, special case the last slight height.
+          */
+         if (slice == nslices - 1) {
+             slice_size   = msize;
+             slice_h      = FFALIGN(avctx->height - ctx->slice_h * (nslices - 1), 16);
+         } else {
+             slice_size = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4 + 4);
+         }
+         slice_size -= slice_off;
+         if (slice_off > msize || slice_off + slice_size > msize)
+             continue;
+         ctx->slice_data[slice].src      = sdata + slice_off;
+         ctx->slice_data[slice].src_size = slice_size;
+         ctx->slice_data[slice].slice_h  = slice_h;
+         ctx->slice_data[slice].y_off    = y_off;
+     }
+     if (ret = avctx->execute(avctx, fic_decode_slice, ctx->slice_data,
+                              NULL, nslices, sizeof(ctx->slice_data[0])) < 0)
+         return ret;
+     *got_frame = 1;
+     if ((ret = av_frame_ref(data, ctx->frame)) < 0)
+         return ret;
+     return avpkt->size;
+ }
+ static av_cold int fic_decode_close(AVCodecContext *avctx)
+ {
+     FICContext *ctx = avctx->priv_data;
+     av_freep(&ctx->slice_data);
+     av_frame_free(&ctx->frame);
+     return 0;
+ }
+ static av_cold int fic_decode_init(AVCodecContext *avctx)
+ {
+     FICContext *ctx = avctx->priv_data;
+     /* Initialize various context values */
+     ctx->avctx            = avctx;
+     ctx->aligned_width    = FFALIGN(avctx->width,  16);
+     ctx->aligned_height   = FFALIGN(avctx->height, 16);
+     avctx->pix_fmt             = AV_PIX_FMT_YUV420P;
+     avctx->bits_per_raw_sample = 8;
+     ctx->frame = av_frame_alloc();
+     if (!ctx->frame)
+         return AVERROR(ENOMEM);
+     ff_dsputil_init(&ctx->dsp, avctx);
+     ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, ff_zigzag_direct);
+     return 0;
+ }
+ AVCodec ff_fic_decoder = {
+     .name           = "fic",
+     .long_name      = NULL_IF_CONFIG_SMALL("Mirillis FIC"),
+     .type           = AVMEDIA_TYPE_VIDEO,
+     .id             = AV_CODEC_ID_FIC,
+     .priv_data_size = sizeof(FICContext),
+     .init           = fic_decode_init,
+     .decode         = fic_decode_frame,
+     .close          = fic_decode_close,
+     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
+ };
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVCODEC_VERSION_MAJOR 55
- #define LIBAVCODEC_VERSION_MINOR  49
- #define LIBAVCODEC_VERSION_MICRO 101
 -#define LIBAVCODEC_VERSION_MINOR 33
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  50
++#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge