zmbv.c
Go to the documentation of this file.
1 /*
2  * Zip Motion Blocks Video (ZMBV) decoder
3  * Copyright (c) 2006 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Zip Motion Blocks Video decoder
25  */
26 
27 #include <stdio.h>
28 #include <stdlib.h>
29 
30 #include "libavutil/common.h"
31 #include "libavutil/intreadwrite.h"
32 #include "avcodec.h"
33 #include "internal.h"
34 
35 #include <zlib.h>
36 
37 #define ZMBV_KEYFRAME 1
38 #define ZMBV_DELTAPAL 2
39 
40 enum ZmbvFormat {
50 };
51 
52 /*
53  * Decoder context
54  */
55 typedef struct ZmbvContext {
57 
58  int bpp;
59  unsigned int decomp_size;
61  uint8_t pal[768];
63  int width, height;
64  int fmt;
65  int comp;
66  int flags;
67  int stride;
68  int bw, bh, bx, by;
70  z_stream zstream;
71  int (*decode_intra)(struct ZmbvContext *c);
72  int (*decode_xor)(struct ZmbvContext *c);
73 } ZmbvContext;
74 
75 /**
76  * Decode XOR'ed frame - 8bpp version
77  */
78 
80 {
81  uint8_t *src = c->decomp_buf;
82  uint8_t *output, *prev;
83  int8_t *mvec;
84  int x, y;
85  int d, dx, dy, bw2, bh2;
86  int block;
87  int i, j;
88  int mx, my;
89 
90  output = c->cur;
91  prev = c->prev;
92 
93  if (c->flags & ZMBV_DELTAPAL) {
94  for (i = 0; i < 768; i++)
95  c->pal[i] ^= *src++;
96  }
97 
98  mvec = (int8_t*)src;
99  src += ((c->bx * c->by * 2 + 3) & ~3);
100 
101  block = 0;
102  for (y = 0; y < c->height; y += c->bh) {
103  bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y);
104  for (x = 0; x < c->width; x += c->bw) {
105  uint8_t *out, *tprev;
106 
107  d = mvec[block] & 1;
108  dx = mvec[block] >> 1;
109  dy = mvec[block + 1] >> 1;
110  block += 2;
111 
112  bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x);
113 
114  /* copy block - motion vectors out of bounds are used to zero blocks */
115  out = output + x;
116  tprev = prev + x + dx + dy * c->width;
117  mx = x + dx;
118  my = y + dy;
119  for (j = 0; j < bh2; j++) {
120  if (my + j < 0 || my + j >= c->height) {
121  memset(out, 0, bw2);
122  } else {
123  for (i = 0; i < bw2; i++) {
124  if (mx + i < 0 || mx + i >= c->width)
125  out[i] = 0;
126  else
127  out[i] = tprev[i];
128  }
129  }
130  out += c->width;
131  tprev += c->width;
132  }
133 
134  if (d) { /* apply XOR'ed difference */
135  out = output + x;
136  for (j = 0; j < bh2; j++) {
137  for (i = 0; i < bw2; i++)
138  out[i] ^= *src++;
139  out += c->width;
140  }
141  }
142  }
143  output += c->width * c->bh;
144  prev += c->width * c->bh;
145  }
146  if (src - c->decomp_buf != c->decomp_len)
147  av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n",
148  src-c->decomp_buf, c->decomp_len);
149  return 0;
150 }
151 
152 /**
153  * Decode XOR'ed frame - 15bpp and 16bpp version
154  */
155 
157 {
158  uint8_t *src = c->decomp_buf;
159  uint16_t *output, *prev;
160  int8_t *mvec;
161  int x, y;
162  int d, dx, dy, bw2, bh2;
163  int block;
164  int i, j;
165  int mx, my;
166 
167  output = (uint16_t*)c->cur;
168  prev = (uint16_t*)c->prev;
169 
170  mvec = (int8_t*)src;
171  src += ((c->bx * c->by * 2 + 3) & ~3);
172 
173  block = 0;
174  for (y = 0; y < c->height; y += c->bh) {
175  bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y);
176  for (x = 0; x < c->width; x += c->bw) {
177  uint16_t *out, *tprev;
178 
179  d = mvec[block] & 1;
180  dx = mvec[block] >> 1;
181  dy = mvec[block + 1] >> 1;
182  block += 2;
183 
184  bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x);
185 
186  /* copy block - motion vectors out of bounds are used to zero blocks */
187  out = output + x;
188  tprev = prev + x + dx + dy * c->width;
189  mx = x + dx;
190  my = y + dy;
191  for (j = 0; j < bh2; j++) {
192  if (my + j < 0 || my + j >= c->height) {
193  memset(out, 0, bw2 * 2);
194  } else {
195  for (i = 0; i < bw2; i++) {
196  if (mx + i < 0 || mx + i >= c->width)
197  out[i] = 0;
198  else
199  out[i] = tprev[i];
200  }
201  }
202  out += c->width;
203  tprev += c->width;
204  }
205 
206  if (d) { /* apply XOR'ed difference */
207  out = output + x;
208  for (j = 0; j < bh2; j++){
209  for (i = 0; i < bw2; i++) {
210  out[i] ^= *((uint16_t*)src);
211  src += 2;
212  }
213  out += c->width;
214  }
215  }
216  }
217  output += c->width * c->bh;
218  prev += c->width * c->bh;
219  }
220  if (src - c->decomp_buf != c->decomp_len)
221  av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n",
222  src-c->decomp_buf, c->decomp_len);
223  return 0;
224 }
225 
226 #ifdef ZMBV_ENABLE_24BPP
227 /**
228  * Decode XOR'ed frame - 24bpp version
229  */
230 
231 static int zmbv_decode_xor_24(ZmbvContext *c)
232 {
233  uint8_t *src = c->decomp_buf;
234  uint8_t *output, *prev;
235  int8_t *mvec;
236  int x, y;
237  int d, dx, dy, bw2, bh2;
238  int block;
239  int i, j;
240  int mx, my;
241  int stride;
242 
243  output = c->cur;
244  prev = c->prev;
245 
246  stride = c->width * 3;
247  mvec = (int8_t*)src;
248  src += ((c->bx * c->by * 2 + 3) & ~3);
249 
250  block = 0;
251  for (y = 0; y < c->height; y += c->bh) {
252  bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y);
253  for (x = 0; x < c->width; x += c->bw) {
254  uint8_t *out, *tprev;
255 
256  d = mvec[block] & 1;
257  dx = mvec[block] >> 1;
258  dy = mvec[block + 1] >> 1;
259  block += 2;
260 
261  bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x);
262 
263  /* copy block - motion vectors out of bounds are used to zero blocks */
264  out = output + x * 3;
265  tprev = prev + (x + dx) * 3 + dy * stride;
266  mx = x + dx;
267  my = y + dy;
268  for (j = 0; j < bh2; j++) {
269  if (my + j < 0 || my + j >= c->height) {
270  memset(out, 0, bw2 * 3);
271  } else {
272  for (i = 0; i < bw2; i++){
273  if (mx + i < 0 || mx + i >= c->width) {
274  out[i * 3 + 0] = 0;
275  out[i * 3 + 1] = 0;
276  out[i * 3 + 2] = 0;
277  } else {
278  out[i * 3 + 0] = tprev[i * 3 + 0];
279  out[i * 3 + 1] = tprev[i * 3 + 1];
280  out[i * 3 + 2] = tprev[i * 3 + 2];
281  }
282  }
283  }
284  out += stride;
285  tprev += stride;
286  }
287 
288  if (d) { /* apply XOR'ed difference */
289  out = output + x * 3;
290  for (j = 0; j < bh2; j++) {
291  for (i = 0; i < bw2; i++) {
292  out[i * 3 + 0] ^= *src++;
293  out[i * 3 + 1] ^= *src++;
294  out[i * 3 + 2] ^= *src++;
295  }
296  out += stride;
297  }
298  }
299  }
300  output += stride * c->bh;
301  prev += stride * c->bh;
302  }
303  if (src - c->decomp_buf != c->decomp_len)
304  av_log(c->avctx, AV_LOG_ERROR, "Used %i of %i bytes\n",
305  src-c->decomp_buf, c->decomp_len);
306  return 0;
307 }
308 #endif //ZMBV_ENABLE_24BPP
309 
310 /**
311  * Decode XOR'ed frame - 32bpp version
312  */
313 
315 {
316  uint8_t *src = c->decomp_buf;
317  uint32_t *output, *prev;
318  int8_t *mvec;
319  int x, y;
320  int d, dx, dy, bw2, bh2;
321  int block;
322  int i, j;
323  int mx, my;
324 
325  output = (uint32_t*)c->cur;
326  prev = (uint32_t*)c->prev;
327 
328  mvec = (int8_t*)src;
329  src += ((c->bx * c->by * 2 + 3) & ~3);
330 
331  block = 0;
332  for (y = 0; y < c->height; y += c->bh) {
333  bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y);
334  for (x = 0; x < c->width; x += c->bw) {
335  uint32_t *out, *tprev;
336 
337  d = mvec[block] & 1;
338  dx = mvec[block] >> 1;
339  dy = mvec[block + 1] >> 1;
340  block += 2;
341 
342  bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x);
343 
344  /* copy block - motion vectors out of bounds are used to zero blocks */
345  out = output + x;
346  tprev = prev + x + dx + dy * c->width;
347  mx = x + dx;
348  my = y + dy;
349  for (j = 0; j < bh2; j++) {
350  if (my + j < 0 || my + j >= c->height) {
351  memset(out, 0, bw2 * 4);
352  } else {
353  for (i = 0; i < bw2; i++){
354  if (mx + i < 0 || mx + i >= c->width)
355  out[i] = 0;
356  else
357  out[i] = tprev[i];
358  }
359  }
360  out += c->width;
361  tprev += c->width;
362  }
363 
364  if (d) { /* apply XOR'ed difference */
365  out = output + x;
366  for (j = 0; j < bh2; j++){
367  for (i = 0; i < bw2; i++) {
368  out[i] ^= *((uint32_t *) src);
369  src += 4;
370  }
371  out += c->width;
372  }
373  }
374  }
375  output += c->width * c->bh;
376  prev += c->width * c->bh;
377  }
378  if (src - c->decomp_buf != c->decomp_len)
379  av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n",
380  src-c->decomp_buf, c->decomp_len);
381  return 0;
382 }
383 
384 /**
385  * Decode intraframe
386  */
388 {
389  uint8_t *src = c->decomp_buf;
390 
391  /* make the palette available on the way out */
392  if (c->fmt == ZMBV_FMT_8BPP) {
393  memcpy(c->pal, src, 768);
394  src += 768;
395  }
396 
397  memcpy(c->cur, src, c->width * c->height * (c->bpp / 8));
398  return 0;
399 }
400 
401 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
402 {
403  AVFrame *frame = data;
404  const uint8_t *buf = avpkt->data;
405  int buf_size = avpkt->size;
406  ZmbvContext * const c = avctx->priv_data;
407  int zret = Z_OK; // Zlib return code
408  int len = buf_size;
409  int hi_ver, lo_ver, ret;
410 
411  /* parse header */
412  c->flags = buf[0];
413  buf++; len--;
414  if (c->flags & ZMBV_KEYFRAME) {
415  void *decode_intra = NULL;
416  c->decode_intra= NULL;
417  hi_ver = buf[0];
418  lo_ver = buf[1];
419  c->comp = buf[2];
420  c->fmt = buf[3];
421  c->bw = buf[4];
422  c->bh = buf[5];
423  c->decode_intra = NULL;
424  c->decode_xor = NULL;
425 
426  buf += 6;
427  len -= 6;
428  av_log(avctx, AV_LOG_DEBUG,
429  "Flags=%X ver=%i.%i comp=%i fmt=%i blk=%ix%i\n",
430  c->flags,hi_ver,lo_ver,c->comp,c->fmt,c->bw,c->bh);
431  if (hi_ver != 0 || lo_ver != 1) {
432  avpriv_request_sample(avctx, "Version %i.%i", hi_ver, lo_ver);
433  return AVERROR_PATCHWELCOME;
434  }
435  if (c->bw == 0 || c->bh == 0) {
436  avpriv_request_sample(avctx, "Block size %ix%i", c->bw, c->bh);
437  return AVERROR_PATCHWELCOME;
438  }
439  if (c->comp != 0 && c->comp != 1) {
440  avpriv_request_sample(avctx, "Compression type %i", c->comp);
441  return AVERROR_PATCHWELCOME;
442  }
443 
444  switch (c->fmt) {
445  case ZMBV_FMT_8BPP:
446  c->bpp = 8;
447  decode_intra = zmbv_decode_intra;
449  avctx->pix_fmt = AV_PIX_FMT_PAL8;
450  c->stride = c->width;
451  break;
452  case ZMBV_FMT_15BPP:
453  case ZMBV_FMT_16BPP:
454  c->bpp = 16;
455  decode_intra = zmbv_decode_intra;
457  if (c->fmt == ZMBV_FMT_15BPP)
458  avctx->pix_fmt = AV_PIX_FMT_RGB555LE;
459  else
460  avctx->pix_fmt = AV_PIX_FMT_RGB565LE;
461  c->stride = c->width * 2;
462  break;
463 #ifdef ZMBV_ENABLE_24BPP
464  case ZMBV_FMT_24BPP:
465  c->bpp = 24;
466  decode_intra = zmbv_decode_intra;
467  c->decode_xor = zmbv_decode_xor_24;
468  avctx->pix_fmt = AV_PIX_FMT_RGB24;
469  c->stride = c->width * 3;
470  break;
471 #endif //ZMBV_ENABLE_24BPP
472  case ZMBV_FMT_32BPP:
473  c->bpp = 32;
474  decode_intra = zmbv_decode_intra;
476  avctx->pix_fmt = AV_PIX_FMT_BGR0;
477  c->stride = c->width * 4;
478  break;
479  default:
480  c->decode_xor = NULL;
481  avpriv_request_sample(avctx, "Format %i", c->fmt);
482  return AVERROR_PATCHWELCOME;
483  }
484 
485  zret = inflateReset(&c->zstream);
486  if (zret != Z_OK) {
487  av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
488  return AVERROR_UNKNOWN;
489  }
490 
491  c->cur = av_realloc_f(c->cur, avctx->width * avctx->height, (c->bpp / 8));
492  c->prev = av_realloc_f(c->prev, avctx->width * avctx->height, (c->bpp / 8));
493  c->bx = (c->width + c->bw - 1) / c->bw;
494  c->by = (c->height+ c->bh - 1) / c->bh;
495  if (!c->cur || !c->prev)
496  return -1;
497  memset(c->cur, 0, avctx->width * avctx->height * (c->bpp / 8));
498  memset(c->prev, 0, avctx->width * avctx->height * (c->bpp / 8));
500  }
501 
502  if (c->decode_intra == NULL) {
503  av_log(avctx, AV_LOG_ERROR, "Error! Got no format or no keyframe!\n");
504  return AVERROR_INVALIDDATA;
505  }
506 
507  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
508  return ret;
509 
510  if (c->comp == 0) { //Uncompressed data
511  if (c->decomp_size < len) {
512  av_log(avctx, AV_LOG_ERROR, "decomp buffer too small\n");
513  return AVERROR_INVALIDDATA;
514  }
515  memcpy(c->decomp_buf, buf, len);
516  } else { // ZLIB-compressed data
517  c->zstream.total_in = c->zstream.total_out = 0;
518  c->zstream.next_in = (uint8_t*)buf;
519  c->zstream.avail_in = len;
520  c->zstream.next_out = c->decomp_buf;
521  c->zstream.avail_out = c->decomp_size;
522  zret = inflate(&c->zstream, Z_SYNC_FLUSH);
523  if (zret != Z_OK && zret != Z_STREAM_END) {
524  av_log(avctx, AV_LOG_ERROR, "inflate error %d\n", zret);
525  return AVERROR_INVALIDDATA;
526  }
527  c->decomp_len = c->zstream.total_out;
528  }
529  if (c->flags & ZMBV_KEYFRAME) {
530  frame->key_frame = 1;
531  frame->pict_type = AV_PICTURE_TYPE_I;
532  c->decode_intra(c);
533  } else {
534  frame->key_frame = 0;
535  frame->pict_type = AV_PICTURE_TYPE_P;
536  if (c->decomp_len)
537  c->decode_xor(c);
538  }
539 
540  /* update frames */
541  {
542  uint8_t *out, *src;
543  int j;
544 
545  out = frame->data[0];
546  src = c->cur;
547  switch (c->fmt) {
548  case ZMBV_FMT_8BPP:
549  for (j = 0; j < 256; j++)
550  AV_WN32(&frame->data[1][j * 4], 0xFFU << 24 | AV_RB24(&c->pal[j * 3]));
551  case ZMBV_FMT_15BPP:
552  case ZMBV_FMT_16BPP:
553 #ifdef ZMBV_ENABLE_24BPP
554  case ZMBV_FMT_24BPP:
555 #endif
556  case ZMBV_FMT_32BPP:
557  for (j = 0; j < c->height; j++) {
558  memcpy(out, src, c->stride);
559  src += c->stride;
560  out += frame->linesize[0];
561  }
562  break;
563  default:
564  av_log(avctx, AV_LOG_ERROR, "Cannot handle format %i\n", c->fmt);
565  }
566  FFSWAP(uint8_t *, c->cur, c->prev);
567  }
568  *got_frame = 1;
569 
570  /* always report that the buffer was completely consumed */
571  return buf_size;
572 }
573 
575 {
576  ZmbvContext * const c = avctx->priv_data;
577  int zret; // Zlib return code
578 
579  c->avctx = avctx;
580 
581  c->width = avctx->width;
582  c->height = avctx->height;
583 
584  c->bpp = avctx->bits_per_coded_sample;
585 
586  // Needed if zlib unused or init aborted before inflateInit
587  memset(&c->zstream, 0, sizeof(z_stream));
588 
589  c->decomp_size = (avctx->width + 255) * 4 * (avctx->height + 64);
590 
591  /* Allocate decompression buffer */
592  if (c->decomp_size) {
593  if ((c->decomp_buf = av_mallocz(c->decomp_size)) == NULL) {
594  av_log(avctx, AV_LOG_ERROR,
595  "Can't allocate decompression buffer.\n");
596  return AVERROR(ENOMEM);
597  }
598  }
599 
600  c->zstream.zalloc = Z_NULL;
601  c->zstream.zfree = Z_NULL;
602  c->zstream.opaque = Z_NULL;
603  zret = inflateInit(&c->zstream);
604  if (zret != Z_OK) {
605  av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
606  return AVERROR_UNKNOWN;
607  }
608 
609  return 0;
610 }
611 
613 {
614  ZmbvContext * const c = avctx->priv_data;
615 
616  av_freep(&c->decomp_buf);
617 
618  inflateEnd(&c->zstream);
619  av_freep(&c->cur);
620  av_freep(&c->prev);
621 
622  return 0;
623 }
624 
626  .name = "zmbv",
627  .type = AVMEDIA_TYPE_VIDEO,
628  .id = AV_CODEC_ID_ZMBV,
629  .priv_data_size = sizeof(ZmbvContext),
630  .init = decode_init,
631  .close = decode_end,
632  .decode = decode_frame,
633  .capabilities = CODEC_CAP_DR1,
634  .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"),
635 };
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
uint8_t pal[768]
Definition: zmbv.c:61
int stride
Definition: zmbv.c:67
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
int decomp_len
Definition: zmbv.c:69
void * av_realloc_f(void *ptr, size_t nelem, size_t elsize)
Allocate or reallocate a block of memory.
Definition: mem.c:168
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:70
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int zmbv_decode_xor_32(ZmbvContext *c)
Decode XOR&#39;ed frame - 32bpp version.
Definition: zmbv.c:314
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: zmbv.c:401
packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 ...
Definition: pixfmt.h:117
#define AV_RB24
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
AVCodecContext * avctx
Definition: zmbv.c:56
struct ZmbvContext ZmbvContext
AVCodec ff_zmbv_decoder
Definition: zmbv.c:625
int flags
Definition: zmbv.c:66
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
Definition: pixfmt.h:115
set threshold d
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
int(* decode_xor)(struct ZmbvContext *c)
Definition: zmbv.c:72
uint8_t
#define av_cold
Definition: attributes.h:78
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
int comp
Definition: zmbv.c:65
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
static av_cold int decode_init(AVCodecContext *avctx)
Definition: zmbv.c:574
#define ZMBV_KEYFRAME
Definition: zmbv.c:37
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
static int zmbv_decode_xor_8(ZmbvContext *c)
Decode XOR&#39;ed frame - 8bpp version.
Definition: zmbv.c:79
frame
Definition: stft.m:14
int by
Definition: zmbv.c:68
Discrete Time axis x
int bx
Definition: zmbv.c:68
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
ZmbvFormat
Definition: zmbv.c:40
int bw
Definition: zmbv.c:68
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static av_cold int decode_end(AVCodecContext *avctx)
Definition: zmbv.c:612
external API header
int(* decode_intra)(struct ZmbvContext *c)
Definition: zmbv.c:71
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
ret
Definition: avfilter.c:821
int width
picture width / height.
uint8_t * decomp_buf
Definition: zmbv.c:60
int bh
Definition: zmbv.c:68
unsigned int decomp_size
Definition: zmbv.c:59
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
NULL
Definition: eval.c:55
AVS_Value src
Definition: avisynth_c.h:523
static int zmbv_decode_xor_16(ZmbvContext *c)
Decode XOR&#39;ed frame - 15bpp and 16bpp version.
Definition: zmbv.c:156
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
synthesis window for stochastic i
packed BGR 8:8:8, 32bpp, BGR0BGR0...
Definition: pixfmt.h:217
int height
Definition: zmbv.c:63
z_stream zstream
Definition: zmbv.c:70
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
int bpp
Definition: zmbv.c:58
int width
Definition: zmbv.c:63
common internal api header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
common internal and external API header
#define AV_WN32(p, v)
Definition: intreadwrite.h:368
static double c[64]
uint8_t * prev
Definition: zmbv.c:62
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
function y
Definition: D.m:1
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:71
int len
int fmt
Definition: zmbv.c:64
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
static int zmbv_decode_intra(ZmbvContext *c)
Decode intraframe.
Definition: zmbv.c:387
#define ZMBV_DELTAPAL
Definition: zmbv.c:38
uint8_t * cur
Definition: zmbv.c:62
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
#define FFSWAP(type, a, b)
Definition: common.h:61
This structure stores compressed data.
Predicted.
Definition: avutil.h:217