Merge commit '9a3202a98b2e095b54dd784c3e01a09a676fc3fa'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sat, 3 Oct 2015 10:22:41 +0000 (12:22 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sat, 3 Oct 2015 10:22:41 +0000 (12:22 +0200)
* commit '9a3202a98b2e095b54dd784c3e01a09a676fc3fa':
  Screenpresso SPV1 decoder

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
Changelog
configure
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/codec_desc.c
libavcodec/screenpresso.c
libavcodec/version.h
libavformat/riff.c
tests/fate/video.mak

diff --cc Changelog
+++ b/Changelog
@@@ -2,114 -2,17 +2,115 @@@ Entries are sorted chronologically fro
  releases are sorted from youngest to oldest.
  
  version <next>:
 -- aliases and defaults for Ogg subtypes (opus, spx)
 -- HEVC/H.265 RTP payload format (draft v6) packetizer and depacketizer
 -- avplay now exits by default at the end of playback
 -- XCB-based screen-grabber
 -- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
 -- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer
 +- DXV decoding
 +- extrastereo filter
 +- ocr filter
 +- alimiter filter
 +- stereowiden filter
 +- stereotools filter
 +- rubberband filter
 +- tremolo filter
 +- agate filter
 +- chromakey filter
 +- maskedmerge filter
++- Screenpresso SPV1 decoding
 +
 +
 +version 2.8:
 +- colorkey video filter
 +- BFSTM/BCSTM demuxer
 +- little-endian ADPCM_THP decoder
 +- Hap decoder and encoder
 +- DirectDraw Surface image/texture decoder
 +- ssim filter
 +- optional new ASF demuxer
 +- showvolume filter
 +- Many improvements to the JPEG 2000 decoder
 +- Go2Meeting decoding support
 +- adrawgraph audio and drawgraph video filter
 +- removegrain video filter
 +- Intel QSV-accelerated MPEG-2 video and HEVC encoding
 +- Intel QSV-accelerated MPEG-2 video and HEVC decoding
 +- Intel QSV-accelerated VC-1 video decoding
 +- libkvazaar HEVC encoder
 +- erosion, dilation, deflate and inflate video filters
 +- Dynamic Audio Normalizer as dynaudnorm filter
 +- Reverse video and areverse audio filter
 +- Random filter
 +- deband filter
 +- AAC fixed-point decoding
 +- sidechaincompress audio filter
 +- bitstream filter for converting HEVC from MP4 to Annex B
 +- acrossfade audio filter
 +- allyuv and allrgb video sources
 +- atadenoise video filter
 +- OS X VideoToolbox support
 +- aphasemeter filter
 +- showfreqs filter
 +- vectorscope filter
 +- waveform filter
 +- hstack and vstack filter
 +- Support DNx100 (1440x1080@8)
 +- VAAPI hevc hwaccel
 +- VDPAU hevc hwaccel
 +- framerate filter
 +- Switched default encoders for webm to VP9 and Opus
 +- Removed experimental flag from the JPEG 2000 encoder
 +
 +
 +version 2.7:
 +- FFT video filter
 +- TDSC decoder
 +- DTS lossless extension (XLL) decoding (not lossless, disabled by default)
 +- showwavespic filter
 +- DTS decoding through libdcadec
 +- Drop support for nvenc API before 5.0
 +- nvenc HEVC encoder
 +- Detelecine filter
 +- Intel QSV-accelerated H.264 encoding
 +- MMAL-accelerated H.264 decoding
 +- basic APNG encoder and muxer with default extension "apng"
 +- unpack DivX-style packed B-frames in MPEG-4 bitstream filter
 +- WebM Live Chunk Muxer
 +- nvenc level and tier options
 +- chorus filter
 +- Canopus HQ/HQA decoder
 +- Automatically rotate videos based on metadata in ffmpeg
 +- improved Quickdraw compatibility
 +- VP9 high bit-depth and extended colorspaces decoding support
 +- WebPAnimEncoder API when available for encoding and muxing WebP
 +- Direct3D11-accelerated decoding
 +- Support Secure Transport
 +- Multipart JPEG demuxer
 +
 +
 +version 2.6:
 +- nvenc encoder
 +- 10bit spp filter
 +- colorlevels filter
 +- RIFX format for *.wav files
  - RTP/mpegts muxer
 -- VP8 in Ogg demuxing
 +- non continuous cache protocol support
 +- tblend filter
 +- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold
 +- Camellia symmetric block cipher
  - OpenH264 encoder wrapper
 +- VOC seeking support
 +- Closed caption Decoder
 +- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters
 +- showpalette filter
 +- Twofish symmetric block cipher
  - Support DNx100 (960x720@8)
 -- Direct3D11-accelerated decoding
 +- eq2 filter ported from libmpcodecs as eq filter
 +- removed libmpcodecs
 +- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range
 +- ported softpulldown filter from libmpcodecs as repeatfields filter
 +- dcshift filter
 +- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219)
 +- RTP depacketizer for AC3 payload format (RFC 4184)
 +- palettegen and paletteuse filters
 +- VP9 RTP payload format (draft 0) experimental depacketizer
 +- RTP depacketizer for DV (RFC 6469)
  - DXVA2-accelerated HEVC decoding
  - AAC ELD 480 decoding
  - Intel QSV-accelerated H.264 decoding
diff --cc configure
+++ b/configure
@@@ -2314,24 -1964,17 +2314,25 @@@ prores_decoder_select="blockdsp idctdsp
  prores_encoder_select="fdctdsp"
  qcelp_decoder_select="lsp"
  qdm2_decoder_select="mdct rdft mpegaudiodsp"
 -ra_144_encoder_select="audio_frame_queue lpc"
 +ra_144_encoder_select="audio_frame_queue lpc audiodsp"
 +ra_144_decoder_select="audiodsp"
  ralf_decoder_select="golomb"
 -rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
 +rawvideo_decoder_select="bswapdsp"
 +rtjpeg_decoder_select="me_cmp"
 +rv10_decoder_select="h263_decoder"
  rv10_encoder_select="h263_encoder"
 -rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
 +rv20_decoder_select="h263_decoder"
  rv20_encoder_select="h263_encoder"
 -rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo rv34dsp videodsp"
 -rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo rv34dsp videodsp"
 +rv30_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
 +rv40_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
+ screenpresso_decoder_deps="zlib"
  shorten_decoder_select="golomb"
  sipr_decoder_select="lsp"
 +snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp"
 +snow_encoder_select="aandcttables dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder"
 +sonic_decoder_select="golomb rangecoder"
 +sonic_encoder_select="golomb rangecoder"
 +sonic_ls_encoder_select="golomb rangecoder"
  sp5x_decoder_select="mjpeg_decoder"
  svq1_decoder_select="hpeldsp"
  svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
@@@ -474,7 -409,7 +474,8 @@@ library
  @item RTP                       @tab X @tab X
  @item RTSP                      @tab X @tab X
  @item SAP                       @tab X @tab X
 +@item SBG                       @tab   @tab X
+ @item Screenpresso              @tab   @tab X
  @item SDP                       @tab   @tab X
  @item Sega FILM/CPK             @tab   @tab X
      @tab Used in many Sega Saturn console games.
@@@ -451,10 -383,9 +451,11 @@@ OBJS-$(CONFIG_RV20_DECODER)            
  OBJS-$(CONFIG_RV20_ENCODER)            += rv20enc.o
  OBJS-$(CONFIG_RV30_DECODER)            += rv30.o rv34.o rv30dsp.o
  OBJS-$(CONFIG_RV40_DECODER)            += rv40.o rv34.o rv40dsp.o
 +OBJS-$(CONFIG_SAMI_DECODER)            += samidec.o ass.o htmlsubtitles.o
  OBJS-$(CONFIG_S302M_DECODER)           += s302m.o
 +OBJS-$(CONFIG_S302M_ENCODER)           += s302menc.o
  OBJS-$(CONFIG_SANM_DECODER)            += sanm.o
+ OBJS-$(CONFIG_SCREENPRESSO_DECODER)    += screenpresso.o
  OBJS-$(CONFIG_SGI_DECODER)             += sgidec.o
  OBJS-$(CONFIG_SGI_ENCODER)             += sgienc.o rle.o
  OBJS-$(CONFIG_SGIRLE_DECODER)          += sgirledec.o
@@@ -283,8 -247,9 +283,9 @@@ void avcodec_register_all(void
      REGISTER_ENCDEC (RV20,              rv20);
      REGISTER_DECODER(RV30,              rv30);
      REGISTER_DECODER(RV40,              rv40);
 -    REGISTER_DECODER(S302M,             s302m);
 +    REGISTER_ENCDEC (S302M,             s302m);
      REGISTER_DECODER(SANM,              sanm);
+     REGISTER_DECODER(SCREENPRESSO,      screenpresso);
      REGISTER_ENCDEC (SGI,               sgi);
      REGISTER_DECODER(SGIRLE,            sgirle);
      REGISTER_DECODER(SMACKER,           smacker);
@@@ -296,23 -299,8 +296,24 @@@ enum AVCodecID 
      AV_CODEC_ID_HAP,
      AV_CODEC_ID_DDS,
      AV_CODEC_ID_DXV,
+     AV_CODEC_ID_SCREENPRESSO,
  
 +    AV_CODEC_ID_Y41P = 0x8000,
 +    AV_CODEC_ID_AVRP,
 +    AV_CODEC_ID_012V,
 +    AV_CODEC_ID_AVUI,
 +    AV_CODEC_ID_AYUV,
 +    AV_CODEC_ID_TARGA_Y216,
 +    AV_CODEC_ID_V308,
 +    AV_CODEC_ID_V408,
 +    AV_CODEC_ID_YUV4,
 +    AV_CODEC_ID_AVRN,
 +    AV_CODEC_ID_CPIA,
 +    AV_CODEC_ID_XFACE,
 +    AV_CODEC_ID_SNOW,
 +    AV_CODEC_ID_SMVJPEG,
 +    AV_CODEC_ID_APNG,
 +
      /* 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,
Simple merge
index 0000000,d25d0eb..e3150e9
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,186 +1,186 @@@
 - * This file is part of Libav.
+ /*
+  * Screenpresso decoder
+  * Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com>
+  *
 - * 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
+  */
+ /**
+  * @file
+  * Screenpresso decoder
+  *
+  * Fourcc: SPV1
+  *
+  * Screenpresso simply horizontally flips and then deflates frames,
+  * alternating full pictures and deltas. Deltas are related to the currently
+  * rebuilt frame (not the reference), and since there is no coordinate system
+  * they contain exactly as many pixel as the keyframe.
+  *
+  * Supports: BGR24
+  */
+ #include <stdint.h>
+ #include <string.h>
+ #include <zlib.h>
+ #include "libavutil/imgutils.h"
+ #include "libavutil/internal.h"
+ #include "avcodec.h"
+ #include "internal.h"
+ typedef struct ScreenpressoContext {
+     AVFrame *current;
+     /* zlib interation */
+     uint8_t *inflated_buf;
+     uLongf inflated_size;
+ } ScreenpressoContext;
+ static av_cold int screenpresso_close(AVCodecContext *avctx)
+ {
+     ScreenpressoContext *ctx = avctx->priv_data;
+     av_frame_free(&ctx->current);
+     av_freep(&ctx->inflated_buf);
+     return 0;
+ }
+ static av_cold int screenpresso_init(AVCodecContext *avctx)
+ {
+     ScreenpressoContext *ctx = avctx->priv_data;
+     /* These needs to be set to estimate uncompressed buffer */
+     int ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
+     if (ret < 0) {
+         av_log(avctx, AV_LOG_ERROR, "Invalid image size %dx%d.\n",
+                avctx->width, avctx->height);
+         return ret;
+     }
+     /* Allocate current frame */
+     ctx->current = av_frame_alloc();
+     if (!ctx->current)
+         return AVERROR(ENOMEM);
+     avctx->pix_fmt = AV_PIX_FMT_BGR24;
+     return 0;
+ }
+ static void sum_delta_flipped(uint8_t       *dst, int dst_linesize,
+                               const uint8_t *src, int src_linesize,
+                               int bytewidth, int height)
+ {
+     int i;
+     for (; height > 0; height--) {
+         for (i = 0; i < bytewidth; i++)
+             dst[i] += src[(height - 1) * src_linesize + i];
+         dst += dst_linesize;
+     }
+ }
+ static int screenpresso_decode_frame(AVCodecContext *avctx, void *data,
+                                      int *got_frame, AVPacket *avpkt)
+ {
+     ScreenpressoContext *ctx = avctx->priv_data;
+     AVFrame *frame = data;
+     int keyframe;
+     int ret;
+     /* Size check */
+     if (avpkt->size < 3) {
+         av_log(avctx, AV_LOG_ERROR, "Packet too small (%d)\n", avpkt->size);
+         return AVERROR_INVALIDDATA;
+     }
+     /* Basic sanity check, but not really harmful */
+     if ((avpkt->data[0] != 0x73 && avpkt->data[0] != 0x72) ||
+         avpkt->data[1] != 8) { // bpp probably
+         av_log(avctx, AV_LOG_WARNING, "Unknown header 0x%02X%02X\n",
+                avpkt->data[0], avpkt->data[1]);
+     }
+     keyframe = (avpkt->data[0] == 0x73);
+     /* Resize deflate buffer and frame on resolution change */
+     if (ctx->inflated_size != avctx->width * avctx->height * 3) {
+         av_frame_unref(ctx->current);
+         ret = ff_get_buffer(avctx, ctx->current, AV_GET_BUFFER_FLAG_REF);
+         if (ret < 0)
+             return ret;
+         /* If malloc fails, reset len to avoid preserving an invalid value */
+         ctx->inflated_size = avctx->width * avctx->height * 3;
+         ret = av_reallocp(&ctx->inflated_buf, ctx->inflated_size);
+         if (ret < 0) {
+             ctx->inflated_size = 0;
+             return ret;
+         }
+     }
+     /* Inflate the frame after the 2 byte header */
+     ret = uncompress(ctx->inflated_buf, &ctx->inflated_size,
+                      avpkt->data + 2, avpkt->size - 2);
+     if (ret) {
+         av_log(avctx, AV_LOG_ERROR, "Deflate error %d.\n", ret);
+         return AVERROR_UNKNOWN;
+     }
+     /* When a keyframe is found, copy it (flipped) */
+     if (keyframe)
+         av_image_copy_plane(ctx->current->data[0] +
+                             ctx->current->linesize[0] * (avctx->height - 1),
+                             -1 * ctx->current->linesize[0],
+                             ctx->inflated_buf, avctx->width * 3,
+                             avctx->width * 3, avctx->height);
+     /* Otherwise sum the delta on top of the current frame */
+     else
+         sum_delta_flipped(ctx->current->data[0], ctx->current->linesize[0],
+                           ctx->inflated_buf, avctx->width * 3,
+                           avctx->width * 3, avctx->height);
+     /* Frame is ready to be output */
+     ret = av_frame_ref(frame, ctx->current);
+     if (ret < 0)
+         return ret;
+     /* Usual properties */
+     if (keyframe) {
+         frame->pict_type = AV_PICTURE_TYPE_I;
+         frame->key_frame = 1;
+     } else {
+         frame->pict_type = AV_PICTURE_TYPE_P;
+     }
+     *got_frame = 1;
+     return 0;
+ }
+ AVCodec ff_screenpresso_decoder = {
+     .name           = "screenpresso",
+     .long_name      = NULL_IF_CONFIG_SMALL("Screenpresso"),
+     .type           = AVMEDIA_TYPE_VIDEO,
+     .id             = AV_CODEC_ID_SCREENPRESSO,
+     .init           = screenpresso_init,
+     .decode         = screenpresso_decode_frame,
+     .close          = screenpresso_close,
+     .priv_data_size = sizeof(ScreenpressoContext),
+     .capabilities   = AV_CODEC_CAP_DR1,
+     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                       FF_CODEC_CAP_INIT_CLEANUP,
+ };
@@@ -28,9 -28,9 +28,9 @@@
  
  #include "libavutil/version.h"
  
 -#define LIBAVCODEC_VERSION_MAJOR 57
 -#define LIBAVCODEC_VERSION_MINOR  3
 -#define LIBAVCODEC_VERSION_MICRO  0
 +#define LIBAVCODEC_VERSION_MAJOR  57
- #define LIBAVCODEC_VERSION_MINOR   3
++#define LIBAVCODEC_VERSION_MINOR   4
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge
@@@ -265,46 -254,52 +265,49 @@@ fate-nuv-rtjpeg: CMD = framecrc -idct s
  FATE_NUV += fate-nuv-rtjpeg-fh
  fate-nuv-rtjpeg-fh: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/nuv/rtjpeg_frameheader.nuv -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, NUV, NUV) += $(FATE_NUV)
 +FATE_VIDEO-$(call DEMDEC, NUV, NUV) += $(FATE_NUV)
  fate-nuv: $(FATE_NUV)
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, PAF, PAF_VIDEO) += fate-paf-video
 +FATE_VIDEO-$(call DEMDEC, PAF, PAF_VIDEO) += fate-paf-video
  fate-paf-video: CMD = framecrc -i $(TARGET_SAMPLES)/paf/hod1-partial.paf -pix_fmt rgb24 -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, QPEG) += fate-qpeg
 +FATE_VIDEO-$(call DEMDEC, AVI, QPEG) += fate-qpeg
  fate-qpeg: CMD = framecrc -i $(TARGET_SAMPLES)/qpeg/Clock.avi -an -pix_fmt rgb24
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, R210) += fate-r210
 +FATE_VIDEO-$(call DEMDEC, AVI, R210) += fate-r210
  fate-r210: CMD = framecrc -i $(TARGET_SAMPLES)/r210/r210.avi -pix_fmt rgb48le
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, RL2, RL2) += fate-rl2
 +FATE_VIDEO-$(call DEMDEC, RL2, RL2) += fate-rl2
  fate-rl2: CMD = framecrc -i $(TARGET_SAMPLES)/rl2/Z4915300.RL2 -pix_fmt rgb24 -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, ROQ, ROQ) += fate-roqvideo
 +FATE_VIDEO-$(call DEMDEC, ROQ, ROQ) += fate-roqvideo
  fate-roqvideo: CMD = framecrc -i $(TARGET_SAMPLES)/idroq/idlogo.roq -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, SMUSH, SANM) += fate-sanm
 +FATE_VIDEO-$(call DEMDEC, SMUSH, SANM) += fate-sanm
  fate-sanm: CMD = framecrc -i $(TARGET_SAMPLES)/smush/ronin_part.znm -an -pix_fmt rgb24
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, SCREENPRESSO) += fate-screenpresso
++FATE_VIDEO-$(call DEMDEC, AVI, SCREENPRESSO) += fate-screenpresso
+ fate-screenpresso: CMD = framecrc -i $(TARGET_SAMPLES)/spv1/bunny.avi
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, VMD, VMDVIDEO) += fate-sierra-vmd-video
 +FATE_VIDEO-$(call DEMDEC, VMD, VMDVIDEO) += fate-sierra-vmd-video
  fate-sierra-vmd-video: CMD = framecrc -i $(TARGET_SAMPLES)/vmd/12.vmd -pix_fmt rgb24 -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, SMACKER, SMACKER) += fate-smacker-video
 +FATE_VIDEO-$(call DEMDEC, SMACKER, SMACKER) += fate-smacker-video
  fate-smacker-video: CMD = framecrc -i $(TARGET_SAMPLES)/smacker/wetlogo.smk -pix_fmt rgb24 -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, MOV, SMC) += fate-smc
 +FATE_VIDEO-$(call DEMDEC, MOV, SMC) += fate-smc
  fate-smc: CMD = framecrc -i $(TARGET_SAMPLES)/smc/cass_schi.qt -pix_fmt rgb24
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, SP5X) += fate-sp5x
 +FATE_VIDEO-$(call DEMDEC, AVI, SP5X) += fate-sp5x
  fate-sp5x: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/sp5x/sp5x_problem.avi
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, SRT, SRT) += fate-sub-srt
 -fate-sub-srt: CMD = md5 -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt -f ass
 -
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, THP, THP) += fate-thp
 +FATE_VIDEO-$(call DEMDEC, THP, THP) += fate-thp
  fate-thp: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/thp/pikmin2-opening1-partial.thp -an
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, TIERTEXSEQ, TIERTEXSEQVIDEO) += fate-tiertex-seq
 +FATE_VIDEO-$(call DEMDEC, TIERTEXSEQ, TIERTEXSEQVIDEO) += fate-tiertex-seq
  fate-tiertex-seq: CMD = framecrc -i $(TARGET_SAMPLES)/tiertex-seq/Gameover.seq -pix_fmt rgb24
  
 -FATE_SAMPLES_AVCONV-$(call DEMDEC, TMV, TMV) += fate-tmv
 +FATE_VIDEO-$(call DEMDEC, TMV, TMV) += fate-tmv
  fate-tmv: CMD = framecrc -i $(TARGET_SAMPLES)/tmv/pop-partial.tmv -pix_fmt rgb24
  
  FATE_TXD += fate-txd-16bpp