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
