#include <stdio.h>
#include <stdlib.h>
+#include "libavutil/intreadwrite.h"
#include "avcodec.h"
-#ifdef CONFIG_ZLIB
#include <zlib.h>
-#endif
#define ZMBV_KEYFRAME 1
#define ZMBV_DELTAPAL 2
int flags;
int bw, bh, bx, by;
int decomp_len;
-#ifdef CONFIG_ZLIB
z_stream zstream;
-#endif
int (*decode_intra)(struct ZmbvContext *c);
int (*decode_xor)(struct ZmbvContext *c);
} ZmbvContext;
return 0;
}
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
{
ZmbvContext * const c = avctx->priv_data;
uint8_t *outptr;
-#ifdef CONFIG_ZLIB
int zret = Z_OK; // Zlib return code
-#endif
int len = buf_size;
int hi_ver, lo_ver;
av_log(avctx, AV_LOG_ERROR, "Unsupported (for now) format %i\n", c->fmt);
return -1;
}
-#ifdef CONFIG_ZLIB
+
zret = inflateReset(&c->zstream);
if (zret != Z_OK) {
av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
return -1;
}
-#else
- av_log(avctx, AV_LOG_ERROR, "BUG! Zlib support not compiled in frame decoder.\n");
- return -1;
-#endif /* CONFIG_ZLIB */
+
c->cur = av_realloc(c->cur, avctx->width * avctx->height * (c->bpp / 8));
c->prev = av_realloc(c->prev, avctx->width * avctx->height * (c->bpp / 8));
c->bx = (c->width + c->bw - 1) / c->bw;
memcpy(c->decomp_buf, buf, len);
c->decomp_size = 1;
} else { // ZLIB-compressed data
-#ifdef CONFIG_ZLIB
c->zstream.total_in = c->zstream.total_out = 0;
c->zstream.next_in = buf;
c->zstream.avail_in = len;
c->zstream.avail_out = c->decomp_size;
inflate(&c->zstream, Z_FINISH);
c->decomp_len = c->zstream.total_out;
-#else
- av_log(avctx, AV_LOG_ERROR, "BUG! Zlib support not compiled in frame decoder.\n");
- return -1;
-#endif
}
if(c->flags & ZMBV_KEYFRAME) {
c->pic.key_frame = 1;
} else {
c->pic.key_frame = 0;
c->pic.pict_type = FF_P_TYPE;
- c->decode_xor(c);
+ if(c->decomp_len)
+ c->decode_xor(c);
}
/* update frames */
* Init zmbv decoder
*
*/
-static int decode_init(AVCodecContext *avctx)
+static av_cold int decode_init(AVCodecContext *avctx)
{
ZmbvContext * const c = avctx->priv_data;
int zret; // Zlib return code
if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
return 1;
}
- c->bpp = avctx->bits_per_sample;
+ c->bpp = avctx->bits_per_coded_sample;
-#ifdef CONFIG_ZLIB
// Needed if zlib unused or init aborted before inflateInit
memset(&(c->zstream), 0, sizeof(z_stream));
-#else
- av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled.\n");
- return 1;
-#endif
+
avctx->pix_fmt = PIX_FMT_RGB24;
c->decomp_size = (avctx->width + 255) * 4 * (avctx->height + 64);
}
}
-#ifdef CONFIG_ZLIB
c->zstream.zalloc = Z_NULL;
c->zstream.zfree = Z_NULL;
c->zstream.opaque = Z_NULL;
av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
return 1;
}
-#endif
return 0;
}
* Uninit zmbv decoder
*
*/
-static int decode_end(AVCodecContext *avctx)
+static av_cold int decode_end(AVCodecContext *avctx)
{
ZmbvContext * const c = avctx->priv_data;
if (c->pic.data[0])
avctx->release_buffer(avctx, &c->pic);
-#ifdef CONFIG_ZLIB
inflateEnd(&(c->zstream));
-#endif
av_freep(&c->cur);
av_freep(&c->prev);
decode_init,
NULL,
decode_end,
- decode_frame
+ decode_frame,
+ .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"),
};