vqavideo.c
Go to the documentation of this file.
1 /*
2  * Westwood Studios VQA Video Decoder
3  * Copyright (C) 2003 the ffmpeg project
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  * VQA Video Decoder
25  * @author Mike Melanson (melanson@pcisys.net)
26  * @see http://wiki.multimedia.cx/index.php?title=VQA
27  *
28  * The VQA video decoder outputs PAL8 or RGB555 colorspace data, depending
29  * on the type of data in the file.
30  *
31  * This decoder needs the 42-byte VQHD header from the beginning
32  * of the VQA file passed through the extradata field. The VQHD header
33  * is laid out as:
34  *
35  * bytes 0-3 chunk fourcc: 'VQHD'
36  * bytes 4-7 chunk size in big-endian format, should be 0x0000002A
37  * bytes 8-49 VQHD chunk data
38  *
39  * Bytes 8-49 are what this decoder expects to see.
40  *
41  * Briefly, VQA is a vector quantized animation format that operates in a
42  * VGA palettized colorspace. It operates on pixel vectors (blocks)
43  * of either 4x2 or 4x4 in size. Compressed VQA chunks can contain vector
44  * codebooks, palette information, and code maps for rendering vectors onto
45  * frames. Any of these components can also be compressed with a run-length
46  * encoding (RLE) algorithm commonly referred to as "format80".
47  *
48  * VQA takes a novel approach to rate control. Each group of n frames
49  * (usually, n = 8) relies on a different vector codebook. Rather than
50  * transporting an entire codebook every 8th frame, the new codebook is
51  * broken up into 8 pieces and sent along with the compressed video chunks
52  * for each of the 8 frames preceding the 8 frames which require the
53  * codebook. A full codebook is also sent on the very first frame of a
54  * file. This is an interesting technique, although it makes random file
55  * seeking difficult despite the fact that the frames are all intracoded.
56  *
57  * V1,2 VQA uses 12-bit codebook indexes. If the 12-bit indexes were
58  * packed into bytes and then RLE compressed, bytewise, the results would
59  * be poor. That is why the coding method divides each index into 2 parts,
60  * the top 4 bits and the bottom 8 bits, then RL encodes the 4-bit pieces
61  * together and the 8-bit pieces together. If most of the vectors are
62  * clustered into one group of 256 vectors, most of the 4-bit index pieces
63  * should be the same.
64  */
65 
66 #include <stdio.h>
67 #include <stdlib.h>
68 #include <string.h>
69 
70 #include "libavutil/intreadwrite.h"
71 #include "libavutil/imgutils.h"
72 #include "avcodec.h"
73 #include "bytestream.h"
74 #include "internal.h"
75 
76 #define PALETTE_COUNT 256
77 #define VQA_HEADER_SIZE 0x2A
78 
79 /* allocate the maximum vector space, regardless of the file version:
80  * (0xFF00 codebook vectors + 0x100 solid pixel vectors) * (4x4 pixels/block) */
81 #define MAX_CODEBOOK_VECTORS 0xFF00
82 #define SOLID_PIXEL_VECTORS 0x100
83 #define MAX_VECTORS (MAX_CODEBOOK_VECTORS + SOLID_PIXEL_VECTORS)
84 #define MAX_CODEBOOK_SIZE (MAX_VECTORS * 4 * 4)
85 
86 #define CBF0_TAG MKBETAG('C', 'B', 'F', '0')
87 #define CBFZ_TAG MKBETAG('C', 'B', 'F', 'Z')
88 #define CBP0_TAG MKBETAG('C', 'B', 'P', '0')
89 #define CBPZ_TAG MKBETAG('C', 'B', 'P', 'Z')
90 #define CPL0_TAG MKBETAG('C', 'P', 'L', '0')
91 #define CPLZ_TAG MKBETAG('C', 'P', 'L', 'Z')
92 #define VPTZ_TAG MKBETAG('V', 'P', 'T', 'Z')
93 
94 typedef struct VqaContext {
95 
98 
100 
101  int width; /* width of a frame */
102  int height; /* height of a frame */
103  int vector_width; /* width of individual vector */
104  int vector_height; /* height of individual vector */
105  int vqa_version; /* this should be either 1, 2 or 3 */
106 
107  unsigned char *codebook; /* the current codebook */
109  unsigned char *next_codebook_buffer; /* accumulator for next codebook */
111 
112  unsigned char *decode_buffer;
114 
115  /* number of frames to go before replacing codebook */
118 
119 } VqaContext;
120 
122 {
123  VqaContext *s = avctx->priv_data;
124  int i, j, codebook_index, ret;
125 
126  s->avctx = avctx;
127  avctx->pix_fmt = AV_PIX_FMT_PAL8;
128 
129  /* make sure the extradata made it */
130  if (s->avctx->extradata_size != VQA_HEADER_SIZE) {
131  av_log(s->avctx, AV_LOG_ERROR, "expected extradata size of %d\n", VQA_HEADER_SIZE);
132  return AVERROR(EINVAL);
133  }
134 
135  /* load up the VQA parameters from the header */
136  s->vqa_version = s->avctx->extradata[0];
137  if (s->vqa_version < 1 || s->vqa_version > 3) {
138  av_log(s->avctx, AV_LOG_ERROR, "unsupported version %d\n", s->vqa_version);
139  return AVERROR_PATCHWELCOME;
140  }
141  s->width = AV_RL16(&s->avctx->extradata[6]);
142  s->height = AV_RL16(&s->avctx->extradata[8]);
143  if ((ret = av_image_check_size(s->width, s->height, 0, avctx)) < 0) {
144  s->width= s->height= 0;
145  return ret;
146  }
147  s->vector_width = s->avctx->extradata[10];
148  s->vector_height = s->avctx->extradata[11];
150 
151  /* the vector dimensions have to meet very stringent requirements */
152  if ((s->vector_width != 4) ||
153  ((s->vector_height != 2) && (s->vector_height != 4))) {
154  /* return without further initialization */
155  return AVERROR_INVALIDDATA;
156  }
157 
158  if (s->width % s->vector_width || s->height % s->vector_height) {
159  av_log(avctx, AV_LOG_ERROR, "Image size not multiple of block size\n");
160  return AVERROR_INVALIDDATA;
161  }
162 
163  /* allocate codebooks */
166  if (!s->codebook)
167  goto fail;
169  if (!s->next_codebook_buffer)
170  goto fail;
171 
172  /* allocate decode buffer */
173  s->decode_buffer_size = (s->width / s->vector_width) *
174  (s->height / s->vector_height) * 2;
176  if (!s->decode_buffer)
177  goto fail;
178 
179  /* initialize the solid-color vectors */
180  if (s->vector_height == 4) {
181  codebook_index = 0xFF00 * 16;
182  for (i = 0; i < 256; i++)
183  for (j = 0; j < 16; j++)
184  s->codebook[codebook_index++] = i;
185  } else {
186  codebook_index = 0xF00 * 8;
187  for (i = 0; i < 256; i++)
188  for (j = 0; j < 8; j++)
189  s->codebook[codebook_index++] = i;
190  }
192 
193  return 0;
194 fail:
195  av_freep(&s->codebook);
197  av_freep(&s->decode_buffer);
198  return AVERROR(ENOMEM);
199 }
200 
201 #define CHECK_COUNT() \
202  if (dest_index + count > dest_size) { \
203  av_log(s->avctx, AV_LOG_ERROR, "decode_format80 problem: next op would overflow dest_index\n"); \
204  av_log(s->avctx, AV_LOG_ERROR, "current dest_index = %d, count = %d, dest_size = %d\n", \
205  dest_index, count, dest_size); \
206  return AVERROR_INVALIDDATA; \
207  }
208 
209 #define CHECK_COPY(idx) \
210  if (idx < 0 || idx + count > dest_size) { \
211  av_log(s->avctx, AV_LOG_ERROR, "decode_format80 problem: next op would overflow dest_index\n"); \
212  av_log(s->avctx, AV_LOG_ERROR, "current src_pos = %d, count = %d, dest_size = %d\n", \
213  src_pos, count, dest_size); \
214  return AVERROR_INVALIDDATA; \
215  }
216 
217 
218 static int decode_format80(VqaContext *s, int src_size,
219  unsigned char *dest, int dest_size, int check_size) {
220 
221  int dest_index = 0;
222  int count, opcode, start;
223  int src_pos;
224  unsigned char color;
225  int i;
226 
227  start = bytestream2_tell(&s->gb);
228  while (bytestream2_tell(&s->gb) - start < src_size) {
229  opcode = bytestream2_get_byte(&s->gb);
230  av_dlog(s->avctx, "opcode %02X: ", opcode);
231 
232  /* 0x80 means that frame is finished */
233  if (opcode == 0x80)
234  return 0;
235 
236  if (dest_index >= dest_size) {
237  av_log(s->avctx, AV_LOG_ERROR, "decode_format80 problem: dest_index (%d) exceeded dest_size (%d)\n",
238  dest_index, dest_size);
239  return AVERROR_INVALIDDATA;
240  }
241 
242  if (opcode == 0xFF) {
243 
244  count = bytestream2_get_le16(&s->gb);
245  src_pos = bytestream2_get_le16(&s->gb);
246  av_dlog(s->avctx, "(1) copy %X bytes from absolute pos %X\n", count, src_pos);
247  CHECK_COUNT();
248  CHECK_COPY(src_pos);
249  for (i = 0; i < count; i++)
250  dest[dest_index + i] = dest[src_pos + i];
251  dest_index += count;
252 
253  } else if (opcode == 0xFE) {
254 
255  count = bytestream2_get_le16(&s->gb);
256  color = bytestream2_get_byte(&s->gb);
257  av_dlog(s->avctx, "(2) set %X bytes to %02X\n", count, color);
258  CHECK_COUNT();
259  memset(&dest[dest_index], color, count);
260  dest_index += count;
261 
262  } else if ((opcode & 0xC0) == 0xC0) {
263 
264  count = (opcode & 0x3F) + 3;
265  src_pos = bytestream2_get_le16(&s->gb);
266  av_dlog(s->avctx, "(3) copy %X bytes from absolute pos %X\n", count, src_pos);
267  CHECK_COUNT();
268  CHECK_COPY(src_pos);
269  for (i = 0; i < count; i++)
270  dest[dest_index + i] = dest[src_pos + i];
271  dest_index += count;
272 
273  } else if (opcode > 0x80) {
274 
275  count = opcode & 0x3F;
276  av_dlog(s->avctx, "(4) copy %X bytes from source to dest\n", count);
277  CHECK_COUNT();
278  bytestream2_get_buffer(&s->gb, &dest[dest_index], count);
279  dest_index += count;
280 
281  } else {
282 
283  count = ((opcode & 0x70) >> 4) + 3;
284  src_pos = bytestream2_get_byte(&s->gb) | ((opcode & 0x0F) << 8);
285  av_dlog(s->avctx, "(5) copy %X bytes from relpos %X\n", count, src_pos);
286  CHECK_COUNT();
287  CHECK_COPY(dest_index - src_pos);
288  for (i = 0; i < count; i++)
289  dest[dest_index + i] = dest[dest_index - src_pos + i];
290  dest_index += count;
291  }
292  }
293 
294  /* validate that the entire destination buffer was filled; this is
295  * important for decoding frame maps since each vector needs to have a
296  * codebook entry; it is not important for compressed codebooks because
297  * not every entry needs to be filled */
298  if (check_size)
299  if (dest_index < dest_size)
300  av_log(s->avctx, AV_LOG_ERROR, "decode_format80 problem: decode finished with dest_index (%d) < dest_size (%d)\n",
301  dest_index, dest_size);
302 
303  return 0; // let's display what we decoded anyway
304 }
305 
307 {
308  unsigned int chunk_type;
309  unsigned int chunk_size;
310  int byte_skip;
311  unsigned int index = 0;
312  int i;
313  unsigned char r, g, b;
314  int index_shift;
315  int res;
316 
317  int cbf0_chunk = -1;
318  int cbfz_chunk = -1;
319  int cbp0_chunk = -1;
320  int cbpz_chunk = -1;
321  int cpl0_chunk = -1;
322  int cplz_chunk = -1;
323  int vptz_chunk = -1;
324 
325  int x, y;
326  int lines = 0;
327  int pixel_ptr;
328  int vector_index = 0;
329  int lobyte = 0;
330  int hibyte = 0;
331  int lobytes = 0;
332  int hibytes = s->decode_buffer_size / 2;
333 
334  /* first, traverse through the frame and find the subchunks */
335  while (bytestream2_get_bytes_left(&s->gb) >= 8) {
336 
337  chunk_type = bytestream2_get_be32u(&s->gb);
338  index = bytestream2_tell(&s->gb);
339  chunk_size = bytestream2_get_be32u(&s->gb);
340 
341  switch (chunk_type) {
342 
343  case CBF0_TAG:
344  cbf0_chunk = index;
345  break;
346 
347  case CBFZ_TAG:
348  cbfz_chunk = index;
349  break;
350 
351  case CBP0_TAG:
352  cbp0_chunk = index;
353  break;
354 
355  case CBPZ_TAG:
356  cbpz_chunk = index;
357  break;
358 
359  case CPL0_TAG:
360  cpl0_chunk = index;
361  break;
362 
363  case CPLZ_TAG:
364  cplz_chunk = index;
365  break;
366 
367  case VPTZ_TAG:
368  vptz_chunk = index;
369  break;
370 
371  default:
372  av_log(s->avctx, AV_LOG_ERROR, "Found unknown chunk type: %c%c%c%c (%08X)\n",
373  (chunk_type >> 24) & 0xFF,
374  (chunk_type >> 16) & 0xFF,
375  (chunk_type >> 8) & 0xFF,
376  (chunk_type >> 0) & 0xFF,
377  chunk_type);
378  break;
379  }
380 
381  byte_skip = chunk_size & 0x01;
382  bytestream2_skip(&s->gb, chunk_size + byte_skip);
383  }
384 
385  /* next, deal with the palette */
386  if ((cpl0_chunk != -1) && (cplz_chunk != -1)) {
387 
388  /* a chunk should not have both chunk types */
389  av_log(s->avctx, AV_LOG_ERROR, "problem: found both CPL0 and CPLZ chunks\n");
390  return AVERROR_INVALIDDATA;
391  }
392 
393  /* decompress the palette chunk */
394  if (cplz_chunk != -1) {
395 
396 /* yet to be handled */
397 
398  }
399 
400  /* convert the RGB palette into the machine's endian format */
401  if (cpl0_chunk != -1) {
402 
403  bytestream2_seek(&s->gb, cpl0_chunk, SEEK_SET);
404  chunk_size = bytestream2_get_be32(&s->gb);
405  /* sanity check the palette size */
406  if (chunk_size / 3 > 256 || chunk_size > bytestream2_get_bytes_left(&s->gb)) {
407  av_log(s->avctx, AV_LOG_ERROR, "problem: found a palette chunk with %d colors\n",
408  chunk_size / 3);
409  return AVERROR_INVALIDDATA;
410  }
411  for (i = 0; i < chunk_size / 3; i++) {
412  /* scale by 4 to transform 6-bit palette -> 8-bit */
413  r = bytestream2_get_byteu(&s->gb) * 4;
414  g = bytestream2_get_byteu(&s->gb) * 4;
415  b = bytestream2_get_byteu(&s->gb) * 4;
416  s->palette[i] = 0xFFU << 24 | r << 16 | g << 8 | b;
417  s->palette[i] |= s->palette[i] >> 6 & 0x30303;
418  }
419  }
420 
421  /* next, look for a full codebook */
422  if ((cbf0_chunk != -1) && (cbfz_chunk != -1)) {
423 
424  /* a chunk should not have both chunk types */
425  av_log(s->avctx, AV_LOG_ERROR, "problem: found both CBF0 and CBFZ chunks\n");
426  return AVERROR_INVALIDDATA;
427  }
428 
429  /* decompress the full codebook chunk */
430  if (cbfz_chunk != -1) {
431 
432  bytestream2_seek(&s->gb, cbfz_chunk, SEEK_SET);
433  chunk_size = bytestream2_get_be32(&s->gb);
434  if ((res = decode_format80(s, chunk_size, s->codebook,
435  s->codebook_size, 0)) < 0)
436  return res;
437  }
438 
439  /* copy a full codebook */
440  if (cbf0_chunk != -1) {
441 
442  bytestream2_seek(&s->gb, cbf0_chunk, SEEK_SET);
443  chunk_size = bytestream2_get_be32(&s->gb);
444  /* sanity check the full codebook size */
445  if (chunk_size > MAX_CODEBOOK_SIZE) {
446  av_log(s->avctx, AV_LOG_ERROR, "problem: CBF0 chunk too large (0x%X bytes)\n",
447  chunk_size);
448  return AVERROR_INVALIDDATA;
449  }
450 
451  bytestream2_get_buffer(&s->gb, s->codebook, chunk_size);
452  }
453 
454  /* decode the frame */
455  if (vptz_chunk == -1) {
456 
457  /* something is wrong if there is no VPTZ chunk */
458  av_log(s->avctx, AV_LOG_ERROR, "problem: no VPTZ chunk found\n");
459  return AVERROR_INVALIDDATA;
460  }
461 
462  bytestream2_seek(&s->gb, vptz_chunk, SEEK_SET);
463  chunk_size = bytestream2_get_be32(&s->gb);
464  if ((res = decode_format80(s, chunk_size,
465  s->decode_buffer, s->decode_buffer_size, 1)) < 0)
466  return res;
467 
468  /* render the final PAL8 frame */
469  if (s->vector_height == 4)
470  index_shift = 4;
471  else
472  index_shift = 3;
473  for (y = 0; y < s->height; y += s->vector_height) {
474  for (x = 0; x < s->width; x += 4, lobytes++, hibytes++) {
475  pixel_ptr = y * frame->linesize[0] + x;
476 
477  /* get the vector index, the method for which varies according to
478  * VQA file version */
479  switch (s->vqa_version) {
480 
481  case 1:
482  lobyte = s->decode_buffer[lobytes * 2];
483  hibyte = s->decode_buffer[(lobytes * 2) + 1];
484  vector_index = ((hibyte << 8) | lobyte) >> 3;
485  vector_index <<= index_shift;
486  lines = s->vector_height;
487  /* uniform color fill - a quick hack */
488  if (hibyte == 0xFF) {
489  while (lines--) {
490  frame->data[0][pixel_ptr + 0] = 255 - lobyte;
491  frame->data[0][pixel_ptr + 1] = 255 - lobyte;
492  frame->data[0][pixel_ptr + 2] = 255 - lobyte;
493  frame->data[0][pixel_ptr + 3] = 255 - lobyte;
494  pixel_ptr += frame->linesize[0];
495  }
496  lines=0;
497  }
498  break;
499 
500  case 2:
501  lobyte = s->decode_buffer[lobytes];
502  hibyte = s->decode_buffer[hibytes];
503  vector_index = (hibyte << 8) | lobyte;
504  vector_index <<= index_shift;
505  lines = s->vector_height;
506  break;
507 
508  case 3:
509 /* not implemented yet */
510  lines = 0;
511  break;
512  }
513 
514  while (lines--) {
515  frame->data[0][pixel_ptr + 0] = s->codebook[vector_index++];
516  frame->data[0][pixel_ptr + 1] = s->codebook[vector_index++];
517  frame->data[0][pixel_ptr + 2] = s->codebook[vector_index++];
518  frame->data[0][pixel_ptr + 3] = s->codebook[vector_index++];
519  pixel_ptr += frame->linesize[0];
520  }
521  }
522  }
523 
524  /* handle partial codebook */
525  if ((cbp0_chunk != -1) && (cbpz_chunk != -1)) {
526  /* a chunk should not have both chunk types */
527  av_log(s->avctx, AV_LOG_ERROR, "problem: found both CBP0 and CBPZ chunks\n");
528  return AVERROR_INVALIDDATA;
529  }
530 
531  if (cbp0_chunk != -1) {
532 
533  bytestream2_seek(&s->gb, cbp0_chunk, SEEK_SET);
534  chunk_size = bytestream2_get_be32(&s->gb);
535 
536  if (chunk_size > MAX_CODEBOOK_SIZE - s->next_codebook_buffer_index) {
537  av_log(s->avctx, AV_LOG_ERROR, "cbp0 chunk too large (%u bytes)\n",
538  chunk_size);
539  return AVERROR_INVALIDDATA;
540  }
541 
542  /* accumulate partial codebook */
544  chunk_size);
545  s->next_codebook_buffer_index += chunk_size;
546 
547  s->partial_countdown--;
548  if (s->partial_countdown <= 0) {
549 
550  /* time to replace codebook */
551  memcpy(s->codebook, s->next_codebook_buffer,
553 
554  /* reset accounting */
557  }
558  }
559 
560  if (cbpz_chunk != -1) {
561 
562  bytestream2_seek(&s->gb, cbpz_chunk, SEEK_SET);
563  chunk_size = bytestream2_get_be32(&s->gb);
564 
565  if (chunk_size > MAX_CODEBOOK_SIZE - s->next_codebook_buffer_index) {
566  av_log(s->avctx, AV_LOG_ERROR, "cbpz chunk too large (%u bytes)\n",
567  chunk_size);
568  return AVERROR_INVALIDDATA;
569  }
570 
571  /* accumulate partial codebook */
573  chunk_size);
574  s->next_codebook_buffer_index += chunk_size;
575 
576  s->partial_countdown--;
577  if (s->partial_countdown <= 0) {
579  /* decompress codebook */
581  s->codebook, s->codebook_size, 0)) < 0)
582  return res;
583 
584  /* reset accounting */
587  }
588  }
589 
590  return 0;
591 }
592 
594  void *data, int *got_frame,
595  AVPacket *avpkt)
596 {
597  VqaContext *s = avctx->priv_data;
598  AVFrame *frame = data;
599  int res;
600 
601  if ((res = ff_get_buffer(avctx, frame, 0)) < 0)
602  return res;
603 
604  bytestream2_init(&s->gb, avpkt->data, avpkt->size);
605  if ((res = vqa_decode_chunk(s, frame)) < 0)
606  return res;
607 
608  /* make the palette available on the way out */
609  memcpy(frame->data[1], s->palette, PALETTE_COUNT * 4);
610  frame->palette_has_changed = 1;
611 
612  *got_frame = 1;
613 
614  /* report that the buffer was completely consumed */
615  return avpkt->size;
616 }
617 
619 {
620  VqaContext *s = avctx->priv_data;
621 
622  av_freep(&s->codebook);
624  av_freep(&s->decode_buffer);
625 
626  return 0;
627 }
628 
630  .name = "vqavideo",
631  .type = AVMEDIA_TYPE_VIDEO,
632  .id = AV_CODEC_ID_WS_VQA,
633  .priv_data_size = sizeof(VqaContext),
637  .capabilities = CODEC_CAP_DR1,
638  .long_name = NULL_IF_CONFIG_SMALL("Westwood Studios VQA (Vector Quantized Animation) video"),
639 };
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define CPLZ_TAG
Definition: vqavideo.c:91
static int vqa_decode_chunk(VqaContext *s, AVFrame *frame)
Definition: vqavideo.c:306
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
#define VQA_HEADER_SIZE
Definition: vqavideo.c:77
static int check_size(TiffEncoderContext *s, uint64_t need)
Check free space in buffer.
Definition: tiffenc.c:89
misc image utilities
#define CBP0_TAG
Definition: vqavideo.c:88
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:130
#define AV_RL16
int next_codebook_buffer_index
Definition: vqavideo.c:110
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
static int decode_format80(VqaContext *s, int src_size, unsigned char *dest, int dest_size, int check_size)
Definition: vqavideo.c:218
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
#define av_cold
Definition: attributes.h:78
#define CHECK_COUNT()
Definition: vqavideo.c:201
int vector_width
Definition: vqavideo.c:103
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
unsigned char * decode_buffer
Definition: vqavideo.c:112
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:77
int vqa_version
Definition: vqavideo.c:105
#define b
Definition: input.c:42
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int width
Definition: vqavideo.c:101
uint8_t * data
#define CPL0_TAG
Definition: vqavideo.c:90
frame
Definition: stft.m:14
Discrete Time axis x
#define U(x)
int vector_height
Definition: vqavideo.c:104
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:159
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
const char * r
Definition: vf_curves.c:94
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:258
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:149
#define CBF0_TAG
Definition: vqavideo.c:86
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
unsigned char * codebook
Definition: vqavideo.c:107
external API header
#define CBPZ_TAG
Definition: vqavideo.c:89
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:231
FFT buffer for g
Definition: stft_peak.m:17
#define CBFZ_TAG
Definition: vqavideo.c:87
ret
Definition: avfilter.c:821
#define PALETTE_COUNT
Definition: vqavideo.c:76
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:183
dest
Definition: start.py:60
uint32_t palette[PALETTE_COUNT]
Definition: vqavideo.c:99
GetByteContext gb
Definition: vqavideo.c:97
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 partial_count
Definition: vqavideo.c:117
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 * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
int palette_has_changed
Tell user application that palette has changed from previous frame.
Definition: frame.h:280
int codebook_size
Definition: vqavideo.c:108
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
#define MAX_CODEBOOK_SIZE
Definition: vqavideo.c:84
int height
Definition: vqavideo.c:102
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
AVCodec ff_vqa_decoder
Definition: vqavideo.c:629
int decode_buffer_size
Definition: vqavideo.c:113
#define CHECK_COPY(idx)
Definition: vqavideo.c:209
common internal api header.
static av_cold int vqa_decode_end(AVCodecContext *avctx)
Definition: vqavideo.c:618
static int vqa_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: vqavideo.c:593
int partial_countdown
Definition: vqavideo.c:116
struct VqaContext VqaContext
function y
Definition: D.m:1
static av_cold int vqa_decode_init(AVCodecContext *avctx)
Definition: vqavideo.c:121
unsigned char * next_codebook_buffer
Definition: vqavideo.c:109
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition: bytestream.h:203
#define VPTZ_TAG
Definition: vqavideo.c:92
void INT64 INT64 count
Definition: avisynth_c.h:594
void INT64 start
Definition: avisynth_c.h:594
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
AVCodecContext * avctx
Definition: vqavideo.c:96
This structure stores compressed data.