On Sat, Mar 17, 2012 at 04:21:37PM -0400, Derek Buitenhuis wrote:
> An obscure Japanese screen capture video codec.

s/screen capture/lossless/
It doesn't say anything on its site about being intended specifically for
screen recordings.
 
> Signed-off-by: Derek Buitenhuis <[email protected]>
> ---
>  Changelog              |    1 +
>  configure              |    1 +
>  doc/general.texi       |    1 +
>  libavcodec/Makefile    |    1 +
>  libavcodec/allcodecs.c |    1 +
>  libavcodec/avcodec.h   |    1 +
>  libavcodec/version.h   |    2 +-
>  libavcodec/zerocodec.c |  172 
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  libavformat/riff.c     |    1 +
>  9 files changed, 180 insertions(+), 1 deletions(-)
>  create mode 100644 libavcodec/zerocodec.c
> 
> diff --git a/Changelog b/Changelog
> index 58ba986..d9e79c7 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -13,6 +13,7 @@ version <next>:
>  - ID3v2 attached pictures reading and writing
>  - WMA Lossless decoder
>  - XBM encoder
> +- ZeroCodec decoder
>  
>  
>  version 0.8:
> diff --git a/configure b/configure
> index 29fb432..eba9cfe 100755
> --- a/configure
> +++ b/configure
> @@ -1399,6 +1399,7 @@ wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
>  wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
>  wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
>  wmv3image_decoder_select="wmv3_decoder"
> +zerocodec_decoder_select="zlib"
>  zlib_decoder_select="zlib"
>  zlib_encoder_select="zlib"
>  zmbv_decoder_select="zlib"
> diff --git a/doc/general.texi b/doc/general.texi
> index 88949c6..1cab593 100644
> --- a/doc/general.texi
> +++ b/doc/general.texi
> @@ -329,6 +329,7 @@ library:
>      @tab Microsoft audio container used by XAudio 2.
>  @item YUV4MPEG pipe             @tab X @tab X
>  @item Psygnosis YOP             @tab   @tab X
> +@item ZeroCodec Lossless Video  @tab   @tab X
>  @end multitable
>  
>  @code{X} means that encoding (resp. decoding) is supported.
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 95ed39a..efc7d15 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -447,6 +447,7 @@ OBJS-$(CONFIG_XSUB_ENCODER)            += xsubenc.o
>  OBJS-$(CONFIG_XWD_DECODER)             += xwddec.o
>  OBJS-$(CONFIG_XWD_ENCODER)             += xwdenc.o
>  OBJS-$(CONFIG_YOP_DECODER)             += yop.o
> +OBJS-$(CONFIG_ZEROCODEC_DECODER)       += zerocodec.o
>  OBJS-$(CONFIG_ZLIB_DECODER)            += lcldec.o
>  OBJS-$(CONFIG_ZLIB_ENCODER)            += lclenc.o
>  OBJS-$(CONFIG_ZMBV_DECODER)            += zmbv.o
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 615946a..f387b99 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -234,6 +234,7 @@ void avcodec_register_all(void)
>      REGISTER_DECODER (XL, xl);
>      REGISTER_ENCDEC  (XWD, xwd);
>      REGISTER_DECODER (YOP, yop);
> +    REGISTER_DECODER (ZEROCODEC, zerocodec);
>      REGISTER_ENCDEC  (ZLIB, zlib);
>      REGISTER_ENCDEC  (ZMBV, zmbv);
>  
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 9f4aaa9..fc33d1b 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -246,6 +246,7 @@ enum CodecID {
>      CODEC_ID_XWD,
>      CODEC_ID_CDXL,
>      CODEC_ID_XBM,
> +    CODEC_ID_ZEROCODEC,
>  
>      /* various PCM "codecs" */
>      CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the 
> start of audio codecs
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 4573568..39ecd68 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -21,7 +21,7 @@
>  #define AVCODEC_VERSION_H
>  
>  #define LIBAVCODEC_VERSION_MAJOR 54
> -#define LIBAVCODEC_VERSION_MINOR  9
> +#define LIBAVCODEC_VERSION_MINOR 10
>  #define LIBAVCODEC_VERSION_MICRO  0
>  
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
> new file mode 100644
> index 0000000..92c71ec
> --- /dev/null
> +++ b/libavcodec/zerocodec.c
> @@ -0,0 +1,172 @@
> +/*
> + * ZeroCodec Decoder
> + *
> + * Copyright (c) 2012, Derek Buitenhuis
> + *
> + * This file is part of Libav.
> + *
> + * Permission to use, copy, modify, and/or distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <zlib.h>
> +#include "avcodec.h"
> +
> +typedef struct {
> +    AVFrame  previous_frame;
> +    z_stream zstream; 
> +    int size;
> +} ZeroCodecContext;
> +
> +static int zerocodec_decode_frame(AVCodecContext *avctx, void *data,
> +                                  int *data_size, AVPacket *avpkt)
> +{
> +    ZeroCodecContext *zc = avctx->priv_data;
> +    AVFrame *pic         = avctx->coded_frame;
> +    AVFrame *prev_pic    = &zc->previous_frame;
> +    z_stream *zstream    = &zc->zstream;
> +    uint8_t *prev, *dst;
> +    int i, j, zret;
> +
> +    pic->reference = 3;
> +
> +    if (avctx->get_buffer(avctx, pic) < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
> +        return AVERROR(ENOMEM);
> +    }
> +
> +    zret = inflateReset(zstream);
> +
> +    if (zret != Z_OK) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d\n", zret);
> +        return AVERROR(EINVAL);
> +    }
> +
> +    zstream->next_in   = avpkt->data;
> +    zstream->avail_in  = avpkt->size;
> +
> +    prev = prev_pic->data[0];
> +    dst  = pic->data[0];
> +
> +    /**
> +     * ZeroCodec has very simple interframe compression. If a value
> +     * is the same as the previous frame, set it to 0.
> +     */
> +
> +    if (avpkt->flags & AV_PKT_FLAG_KEY) {
> +
> +        pic->key_frame = 1;
> +        pic->pict_type = AV_PICTURE_TYPE_I;
> +
> +        for (i = 0; i < avctx->height; i++) {
> +
> +            zstream->next_out  = dst;
> +            zstream->avail_out = avctx->width << 1;
> +
> +            inflate(zstream, Z_FINISH);

I'd check return codes (frame may be damaged).

> +
> +            dst += pic->linesize[0];
> +        }
> +    } else {
> +
> +        pic->key_frame = 0;
> +        pic->pict_type = AV_PICTURE_TYPE_P;
> +
> +        for (i = 0; i < avctx->height; i++) {
> +
> +            zstream->next_out  = dst;
> +            zstream->avail_out = avctx->width << 1;
> +
> +            inflate(zstream, Z_FINISH);

here too

> +
> +            for (j = 0; j < avctx->width << 1; j++)
> +                dst[j] += prev[j] & -(!dst[j]);

useless parentheses

In general LGTM
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to