Merge commit '533a6198505edd1379e1cd722852350ae4a85acc'
authorHendrik Leppkes <h.leppkes@gmail.com>
Tue, 27 Oct 2015 12:58:44 +0000 (13:58 +0100)
committerHendrik Leppkes <h.leppkes@gmail.com>
Tue, 27 Oct 2015 12:58:44 +0000 (13:58 +0100)
* commit '533a6198505edd1379e1cd722852350ae4a85acc':
  innoHeim/Rsupport Screen Capture Codec decoder

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

diff --cc Changelog
+++ b/Changelog
@@@ -2,128 -2,17 +2,129 @@@ 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
 +- chromaprint fingerprinting muxer
 +- ffplay dynamic volume control
 +- displace filter
 +- selectivecolor filter
 +- extensive native AAC encoder improvements
 +- ADPCM PSX decoder
 +- genh, vag, xvag, ads, msf & svag demuxer
 +- zscale filter
 +- wve demuxer
 +- zero-copy Intel QSV transcoding in ffmpeg
 +- shuffleframes filter
 +- SDX2 DPCM decoder
 +- vibrato filter
++- innoHeim/Rsupport Screen Capture Codec decoder
 +
 +
 +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
@@@ -2340,25 -1987,18 +2340,26 @@@ 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"
 -rscc_decoder_deps="zlib"
 -rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
 +rawvideo_decoder_select="bswapdsp"
++rscc_decoder_select="zlib"
 +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"
 -screenpresso_decoder_deps="zlib"
 +rv30_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
 +rv40_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
 +screenpresso_decoder_select="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"
Simple merge
Simple merge
@@@ -297,24 -300,8 +297,25 @@@ enum AVCodecID 
      AV_CODEC_ID_DDS,
      AV_CODEC_ID_DXV,
      AV_CODEC_ID_SCREENPRESSO,
+     AV_CODEC_ID_RSCC,
  
 +    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,
 +    AV_CODEC_ID_DAALA,
 +
      /* 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,c54482f..9e7887d
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,284 +1,284 @@@
 - * This file is part of Libav.
+ /*
+  * innoHeim/Rsupport Screen Capture Codec
+  * 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
+  * innoHeim/Rsupport Screen Capture Codec decoder
+  *
+  * Fourcc: ISCC, RSCC
+  *
+  * Lossless codec, data stored in tiles, with optional deflate compression.
+  *
+  * Header contains the number of tiles in a frame with the tile coordinates,
+  * and it can be deflated or not. Similarly, pixel data comes after the header
+  * and a variable size value, and it can be deflated or just raw.
+  *
+  * Supports: BGRA
+  */
+ #include <stdint.h>
+ #include <string.h>
+ #include <zlib.h>
+ #include "libavutil/imgutils.h"
+ #include "libavutil/internal.h"
+ #include "avcodec.h"
+ #include "bytestream.h"
+ #include "internal.h"
+ #define TILE_SIZE 8
+ typedef struct Tile {
+     int x, y;
+     int w, h;
+ } Tile;
+ typedef struct RsccContext {
+     GetByteContext gbc;
+     AVFrame *reference;
+     Tile *tiles;
+     unsigned int tiles_size;
+     /* zlib interaction */
+     uint8_t *inflated_buf;
+     uLongf inflated_size;
+ } RsccContext;
+ static av_cold int rscc_init(AVCodecContext *avctx)
+ {
+     RsccContext *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 reference frame */
+     ctx->reference = av_frame_alloc();
+     if (!ctx->reference)
+         return AVERROR(ENOMEM);
+     avctx->pix_fmt = AV_PIX_FMT_BGRA;
+     /* Store the value to check for keyframes */
+     ctx->inflated_size = avctx->width * avctx->height * 4;
+     /* Allocate maximum size possible, a full frame */
+     ctx->inflated_buf = av_malloc(ctx->inflated_size);
+     if (!ctx->inflated_buf)
+         return AVERROR(ENOMEM);
+     return 0;
+ }
+ static av_cold int rscc_close(AVCodecContext *avctx)
+ {
+     RsccContext *ctx = avctx->priv_data;
+     av_freep(&ctx->tiles);
+     av_freep(&ctx->inflated_buf);
+     av_frame_free(&ctx->reference);
+     return 0;
+ }
+ static int rscc_decode_frame(AVCodecContext *avctx, void *data,
+                                      int *got_frame, AVPacket *avpkt)
+ {
+     RsccContext *ctx = avctx->priv_data;
+     GetByteContext *gbc = &ctx->gbc;
+     GetByteContext tiles_gbc;
+     AVFrame *frame = data;
+     const uint8_t *pixels, *raw;
+     uint8_t *inflated_tiles = NULL;
+     int tiles_nb, packed_size, pixel_size = 0;
+     int i, ret = 0;
+     bytestream2_init(gbc, avpkt->data, avpkt->size);
+     /* Size check */
+     if (bytestream2_get_bytes_left(gbc) < 12) {
+         av_log(avctx, AV_LOG_ERROR, "Packet too small (%d)\n", avpkt->size);
+         return AVERROR_INVALIDDATA;
+     }
+     /* Read number of tiles, and allocate the array */
+     tiles_nb = bytestream2_get_le16(gbc);
+     av_fast_malloc(&ctx->tiles, &ctx->tiles_size,
+                    tiles_nb * sizeof(*ctx->tiles));
+     if (!ctx->tiles) {
+         ret = AVERROR(ENOMEM);
+         goto end;
+     }
+     av_log(avctx, AV_LOG_DEBUG, "Frame with %d tiles.\n", tiles_nb);
+     /* When there are more than 5 tiles, they are packed together with
+      * a size header. When that size does not match the number of tiles
+      * times the tile size, it means it needs to be inflated as well */
+     if (tiles_nb > 5) {
+         uLongf packed_tiles_size;
+         if (tiles_nb < 32)
+             packed_tiles_size = bytestream2_get_byte(gbc);
+         else
+             packed_tiles_size = bytestream2_get_le16(gbc);
+         ff_dlog(avctx, "packed tiles of size %lu.\n", packed_tiles_size);
+         /* If necessary, uncompress tiles, and hijack the bytestream reader */
+         if (packed_tiles_size != tiles_nb * TILE_SIZE) {
+             uLongf length = tiles_nb * TILE_SIZE;
+             inflated_tiles = av_malloc(length);
+             if (!inflated_tiles) {
+                 ret = AVERROR(ENOMEM);
+                 goto end;
+             }
+             ret = uncompress(inflated_tiles, &length,
+                              gbc->buffer, packed_tiles_size);
+             if (ret) {
+                 av_log(avctx, AV_LOG_ERROR, "Tile deflate error %d.\n", ret);
+                 ret = AVERROR_UNKNOWN;
+                 goto end;
+             }
+             /* Skip the compressed tile section in the main byte reader,
+              * and point it to read the newly uncompressed data */
+             bytestream2_skip(gbc, packed_tiles_size);
+             bytestream2_init(&tiles_gbc, inflated_tiles, length);
+             gbc = &tiles_gbc;
+         }
+     }
+     /* Fill in array of tiles, keeping track of how many pixels are updated */
+     for (i = 0; i < tiles_nb; i++) {
+         ctx->tiles[i].x = bytestream2_get_le16(gbc);
+         ctx->tiles[i].w = bytestream2_get_le16(gbc);
+         ctx->tiles[i].y = bytestream2_get_le16(gbc);
+         ctx->tiles[i].h = bytestream2_get_le16(gbc);
+         pixel_size += ctx->tiles[i].w * ctx->tiles[i].h * 4;
+         ff_dlog(avctx, "tile %d orig(%d,%d) %dx%d.\n", i,
+                 ctx->tiles[i].x, ctx->tiles[i].y,
+                 ctx->tiles[i].w, ctx->tiles[i].h);
+         if (ctx->tiles[i].w == 0 || ctx->tiles[i].h == 0) {
+             av_log(avctx, AV_LOG_ERROR,
+                    "invalid tile %d at (%d.%d) with size %dx%d.\n", i,
+                    ctx->tiles[i].x, ctx->tiles[i].y,
+                    ctx->tiles[i].w, ctx->tiles[i].h);
+             ret = AVERROR_INVALIDDATA;
+             goto end;
+         } else if (ctx->tiles[i].x + ctx->tiles[i].w > avctx->width ||
+                    ctx->tiles[i].y + ctx->tiles[i].h > avctx->height) {
+             av_log(avctx, AV_LOG_ERROR,
+                    "out of bounds tile %d at (%d.%d) with size %dx%d.\n", i,
+                    ctx->tiles[i].x, ctx->tiles[i].y,
+                    ctx->tiles[i].w, ctx->tiles[i].h);
+             ret = AVERROR_INVALIDDATA;
+             goto end;
+         }
+     }
+     /* Reset the reader in case it had been modified before */
+     gbc = &ctx->gbc;
+     /* Extract how much pixel data the tiles contain */
+     if (pixel_size < 0x100)
+         packed_size = bytestream2_get_byte(gbc);
+     else if (pixel_size < 0x10000)
+         packed_size = bytestream2_get_le16(gbc);
+     else if (pixel_size < 0x1000000)
+         packed_size = bytestream2_get_le24(gbc);
+     else
+         packed_size = bytestream2_get_le32(gbc);
+     ff_dlog(avctx, "pixel_size %d packed_size %d.\n", pixel_size, packed_size);
+     /* Get pixels buffer, it may be deflated or just raw */
+     if (pixel_size == packed_size) {
+         pixels = gbc->buffer;
+     } else {
+         uLongf len = ctx->inflated_size;
+         ret = uncompress(ctx->inflated_buf, &len, gbc->buffer, packed_size);
+         if (ret) {
+             av_log(avctx, AV_LOG_ERROR, "Pixel deflate error %d.\n", ret);
+             ret = AVERROR_UNKNOWN;
+             goto end;
+         }
+         pixels = ctx->inflated_buf;
+     }
+     /* Allocate when needed */
+     ret = ff_reget_buffer(avctx, ctx->reference);
+     if (ret < 0)
+         goto end;
+     /* Pointer to actual pixels, will be updated when data is consumed */
+     raw = pixels;
+     for (i = 0; i < tiles_nb; i++) {
+         uint8_t *dst = ctx->reference->data[0] + ctx->reference->linesize[0] *
+                        (avctx->height - ctx->tiles[i].y - 1) +
+                        ctx->tiles[i].x * 4;
+         av_image_copy_plane(dst, -1 * ctx->reference->linesize[0],
+                             raw, ctx->tiles[i].w * 4,
+                             ctx->tiles[i].w * 4, ctx->tiles[i].h);
+         raw += ctx->tiles[i].w * 4 * ctx->tiles[i].h;
+     }
+     /* Frame is ready to be output */
+     ret = av_frame_ref(frame, ctx->reference);
+     if (ret < 0)
+         goto end;
+     /* Keyframe when the number of pixels updated matches the whole surface */
+     if (pixel_size == ctx->inflated_size) {
+         frame->pict_type = AV_PICTURE_TYPE_I;
+         frame->key_frame = 1;
+     } else {
+         frame->pict_type = AV_PICTURE_TYPE_P;
+     }
+     *got_frame = 1;
+ end:
+     av_free(inflated_tiles);
+     return ret;
+ }
+ AVCodec ff_rscc_decoder = {
+     .name           = "rscc",
+     .long_name      = NULL_IF_CONFIG_SMALL("innoHeim/Rsupport Screen Capture Codec"),
+     .type           = AVMEDIA_TYPE_VIDEO,
+     .id             = AV_CODEC_ID_RSCC,
+     .init           = rscc_init,
+     .decode         = rscc_decode_frame,
+     .close          = rscc_close,
+     .priv_data_size = sizeof(RsccContext),
+     .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  7
 -#define LIBAVCODEC_VERSION_MICRO  0
 +#define LIBAVCODEC_VERSION_MAJOR  57
- #define LIBAVCODEC_VERSION_MINOR  10
++#define LIBAVCODEC_VERSION_MINOR  11
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge
Simple merge