Go to the documentation of this file.
41 #define ZMBV_KEYFRAME 1
42 #define ZMBV_DELTAPAL 2
86 uint8_t *
src =
c->decomp_buf;
90 int d, dx, dy, bw2, bh2;
99 for (
i = 0;
i < 768;
i++)
104 src += ((
c->bx *
c->by * 2 + 3) & ~3);
107 for (y = 0; y <
c->height; y +=
c->bh) {
108 bh2 = ((
c->height - y) >
c->bh) ?
c->bh : (
c->height - y);
109 for (x = 0; x <
c->width; x +=
c->bw) {
110 uint8_t *
out, *tprev;
113 dx = mvec[
block] >> 1;
114 dy = mvec[
block + 1] >> 1;
117 bw2 = ((
c->width - x) >
c->bw) ?
c->bw : (
c->width - x);
121 tprev =
prev + x + dx + dy *
c->width;
124 for (j = 0; j < bh2; j++) {
125 if (
my + j < 0 || my + j >=
c->height) {
127 }
else if (
mx >= 0 &&
mx + bw2 <= c->
width){
128 memcpy(
out, tprev,
sizeof(*
out) * bw2);
130 for (
i = 0;
i < bw2;
i++) {
131 if (
mx + i < 0 || mx + i >=
c->width)
142 if (
c->decomp_len - (
src -
c->decomp_buf) < bw2 * bh2)
145 for (j = 0; j < bh2; j++) {
146 for (
i = 0;
i < bw2;
i++)
155 if (
src -
c->decomp_buf !=
c->decomp_len)
157 src-
c->decomp_buf,
c->decomp_len);
167 uint8_t *
src =
c->decomp_buf;
171 int d, dx, dy, bw2, bh2;
177 prev = (uint16_t*)
c->prev;
180 src += ((
c->bx *
c->by * 2 + 3) & ~3);
183 for (y = 0; y <
c->height; y +=
c->bh) {
184 bh2 = ((
c->height - y) >
c->bh) ?
c->bh : (
c->height - y);
185 for (x = 0; x <
c->width; x +=
c->bw) {
186 uint16_t *
out, *tprev;
189 dx = mvec[
block] >> 1;
190 dy = mvec[
block + 1] >> 1;
193 bw2 = ((
c->width - x) >
c->bw) ?
c->bw : (
c->width - x);
197 tprev =
prev + x + dx + dy *
c->width;
200 for (j = 0; j < bh2; j++) {
201 if (
my + j < 0 || my + j >=
c->height) {
202 memset(
out, 0, bw2 * 2);
203 }
else if (
mx >= 0 &&
mx + bw2 <= c->
width){
204 memcpy(
out, tprev,
sizeof(*
out) * bw2);
206 for (
i = 0;
i < bw2;
i++) {
207 if (
mx + i < 0 || mx + i >=
c->width)
218 if (
c->decomp_len - (
src -
c->decomp_buf) < bw2 * bh2 * 2)
221 for (j = 0; j < bh2; j++){
222 for (
i = 0;
i < bw2;
i++) {
233 if (
src -
c->decomp_buf !=
c->decomp_len)
235 src-
c->decomp_buf,
c->decomp_len);
239 #ifdef ZMBV_ENABLE_24BPP
246 uint8_t *
src =
c->decomp_buf;
250 int d, dx, dy, bw2, bh2;
261 src += ((
c->bx *
c->by * 2 + 3) & ~3);
264 for (y = 0; y <
c->height; y +=
c->bh) {
265 bh2 = ((
c->height - y) >
c->bh) ?
c->bh : (
c->height - y);
266 for (x = 0; x <
c->width; x +=
c->bw) {
267 uint8_t *
out, *tprev;
270 dx = mvec[
block] >> 1;
271 dy = mvec[
block + 1] >> 1;
274 bw2 = ((
c->width - x) >
c->bw) ?
c->bw : (
c->width - x);
281 for (j = 0; j < bh2; j++) {
282 if (
my + j < 0 || my + j >=
c->height) {
283 memset(
out, 0, bw2 * 3);
284 }
else if (
mx >= 0 &&
mx + bw2 <= c->
width){
285 memcpy(
out, tprev, 3 * bw2);
287 for (
i = 0;
i < bw2;
i++){
288 if (
mx + i < 0 || mx + i >=
c->width) {
293 out[
i * 3 + 0] = tprev[
i * 3 + 0];
294 out[
i * 3 + 1] = tprev[
i * 3 + 1];
295 out[
i * 3 + 2] = tprev[
i * 3 + 2];
304 if (
c->decomp_len - (
src -
c->decomp_buf) < bw2 * bh2 * 3)
307 for (j = 0; j < bh2; j++) {
308 for (
i = 0;
i < bw2;
i++) {
320 if (
src -
c->decomp_buf !=
c->decomp_len)
322 src-
c->decomp_buf,
c->decomp_len);
325 #endif //ZMBV_ENABLE_24BPP
333 uint8_t *
src =
c->decomp_buf;
337 int d, dx, dy, bw2, bh2;
343 prev = (uint32_t*)
c->prev;
346 src += ((
c->bx *
c->by * 2 + 3) & ~3);
349 for (y = 0; y <
c->height; y +=
c->bh) {
350 bh2 = ((
c->height - y) >
c->bh) ?
c->bh : (
c->height - y);
351 for (x = 0; x <
c->width; x +=
c->bw) {
352 uint32_t *
out, *tprev;
355 dx = mvec[
block] >> 1;
356 dy = mvec[
block + 1] >> 1;
359 bw2 = ((
c->width - x) >
c->bw) ?
c->bw : (
c->width - x);
363 tprev =
prev + x + dx + dy *
c->width;
366 for (j = 0; j < bh2; j++) {
367 if (
my + j < 0 || my + j >=
c->height) {
368 memset(
out, 0, bw2 * 4);
369 }
else if (
mx >= 0 &&
mx + bw2 <= c->
width){
370 memcpy(
out, tprev,
sizeof(*
out) * bw2);
372 for (
i = 0;
i < bw2;
i++){
373 if (
mx + i < 0 || mx + i >=
c->width)
384 if (
c->decomp_len - (
src -
c->decomp_buf) < bw2 * bh2 * 4)
387 for (j = 0; j < bh2; j++){
388 for (
i = 0;
i < bw2;
i++) {
399 if (
src -
c->decomp_buf !=
c->decomp_len)
401 src-
c->decomp_buf,
c->decomp_len);
410 uint8_t *
src =
c->decomp_buf;
414 memcpy(
c->pal,
src, 768);
418 memcpy(
c->cur,
src,
c->width *
c->height * (
c->bpp / 8));
425 const uint8_t *buf = avpkt->
data;
426 int buf_size = avpkt->
size;
430 int hi_ver, lo_ver,
ret;
449 c->decode_xor =
NULL;
454 "Flags=%X ver=%i.%i comp=%i fmt=%i blk=%ix%i\n",
455 c->flags,hi_ver,lo_ver,
c->comp,
c->fmt,
c->bw,
c->bh);
456 if (hi_ver != 0 || lo_ver != 1) {
460 if (
c->bw == 0 ||
c->bh == 0) {
464 if (
c->comp != 0 &&
c->comp != 1) {
474 c->stride =
c->width;
484 c->stride =
c->width * 2;
486 #ifdef ZMBV_ENABLE_24BPP
489 c->decode_xor = zmbv_decode_xor_24;
491 c->stride =
c->width * 3;
493 #endif //ZMBV_ENABLE_24BPP
498 c->stride =
c->width * 4;
501 c->decode_xor =
NULL;
506 zret = inflateReset(&
c->zstream.zstream);
512 if (
c->alloc_bpp <
c->bpp) {
515 c->alloc_bpp =
c->bpp;
517 c->bx = (
c->width +
c->bw - 1) /
c->bw;
518 c->by = (
c->height+
c->bh - 1) /
c->bh;
519 if (!
c->cur || !
c->prev) {
530 expected_size = (
c->bx *
c->by * 2 + 3) & ~3;
534 expected_size += 768;
536 if (!
c->got_keyframe) {
542 if (
c->decomp_size <
len) {
546 memcpy(
c->decomp_buf, buf,
len);
549 z_stream *
const zstream = &
c->zstream.zstream;
555 zstream->avail_out =
c->decomp_size;
557 if (zret != Z_OK && zret != Z_STREAM_END) {
563 if (expected_size >
c->decomp_len ||
578 if (
c->decomp_len < 2LL * ((
c->width +
c->bw - 1) /
c->bw) * ((
c->height +
c->bh - 1) /
c->bh))
581 if ((
ret =
c->decode_xor(
c)) < 0)
595 for (j = 0; j < 256; j++)
600 #ifdef ZMBV_ENABLE_24BPP
605 c->stride,
c->height);
638 if (!
c->decomp_buf) {
640 "Can't allocate decompression buffer.\n");
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
This structure describes decoded (raw) audio or video data.
const FFCodec ff_zmbv_decoder
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
static av_cold void close(AVCodecParserContext *s)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
AVCodec p
The public AVCodec.
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
static int zmbv_decode_xor_8(ZmbvContext *c)
Decode XOR'ed frame - 8bpp version.
static av_cold int decode_init(AVCodecContext *avctx)
int(* decode_xor)(struct ZmbvContext *c)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
#define FF_CODEC_DECODE_CB(func)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int64_t max_pixels
The number of pixels per image to maximally accept.
#define CODEC_LONG_NAME(str)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
#define av_realloc_f(p, o, n)
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define i(width, name, range_min, range_max)
static int zmbv_decode_xor_32(ZmbvContext *c)
Decode XOR'ed frame - 32bpp version.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
const char * name
Name of the codec implementation.
void ff_inflate_end(FFZStream *zstream)
Wrapper around inflateEnd().
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
#define FFSWAP(type, a, b)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static av_cold int decode_end(AVCodecContext *avctx)
main external API structure.
@ AV_PICTURE_TYPE_P
Predicted.
#define avpriv_request_sample(...)
static int zmbv_decode_xor_16(ZmbvContext *c)
Decode XOR'ed frame - 15bpp and 16bpp version.
This structure stores compressed data.
int ff_inflate_init(FFZStream *zstream, void *logctx)
Wrapper around inflateInit().
int width
picture width / height.
static int zmbv_decode_intra(ZmbvContext *c)
Decode intraframe.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24