FFmpeg
gdv.c
Go to the documentation of this file.
1 /*
2  * Gremlin Digital Video (GDV) decoder
3  * Copyright (c) 2017 Konstantin Shishkov
4  * Copyright (c) 2017 Paul B Mahol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "libavutil/common.h"
24 #include "avcodec.h"
25 #include "bytestream.h"
26 #include "internal.h"
27 
28 typedef struct GDVContext {
30 
34 
35  uint32_t pal[256];
37  unsigned frame_size;
38  unsigned scale_h, scale_v;
39 } GDVContext;
40 
41 typedef struct Bits8 {
44 } Bits8;
45 
46 typedef struct Bits32 {
47  uint32_t queue;
49 } Bits32;
50 
51 #define PREAMBLE_SIZE 4096
52 
54 {
55  GDVContext *gdv = avctx->priv_data;
56  int i, j, k;
57 
58  avctx->pix_fmt = AV_PIX_FMT_PAL8;
59  gdv->frame_size = avctx->width * avctx->height + PREAMBLE_SIZE;
60  gdv->frame = av_calloc(gdv->frame_size, 1);
61  if (!gdv->frame)
62  return AVERROR(ENOMEM);
63 
64  for (i = 0; i < 2; i++) {
65  for (j = 0; j < 256; j++) {
66  for (k = 0; k < 8; k++) {
67  gdv->frame[i * 2048 + j * 8 + k] = j;
68  }
69  }
70  }
71 
72  return 0;
73 }
74 
75 static void scaleup(uint8_t *dst, const uint8_t *src, int w)
76 {
77  int x;
78  for (x = 0; x < w - 7; x+=8) {
79  dst[x + 0] =
80  dst[x + 1] = src[(x>>1) + 0];
81  dst[x + 2] =
82  dst[x + 3] = src[(x>>1) + 1];
83  dst[x + 4] =
84  dst[x + 5] = src[(x>>1) + 2];
85  dst[x + 6] =
86  dst[x + 7] = src[(x>>1) + 3];
87  }
88  for (; x < w; x++) {
89  dst[x] = src[(x>>1)];
90  }
91 }
92 
93 static void scaleup_rev(uint8_t *dst, const uint8_t *src, int w)
94 {
95  int x;
96 
97  for (x = w - 1; (x+1) & 7; x--) {
98  dst[x] = src[(x>>1)];
99  }
100  for (x -= 7; x >= 0; x -= 8) {
101  dst[x + 6] =
102  dst[x + 7] = src[(x>>1) + 3];
103  dst[x + 4] =
104  dst[x + 5] = src[(x>>1) + 2];
105  dst[x + 2] =
106  dst[x + 3] = src[(x>>1) + 1];
107  dst[x + 0] =
108  dst[x + 1] = src[(x>>1) + 0];
109  }
110 }
111 
112 static void scaledown(uint8_t *dst, const uint8_t *src, int w)
113 {
114  int x;
115  for (x = 0; x < w - 7; x+=8) {
116  dst[x + 0] = src[2*x + 0];
117  dst[x + 1] = src[2*x + 2];
118  dst[x + 2] = src[2*x + 4];
119  dst[x + 3] = src[2*x + 6];
120  dst[x + 4] = src[2*x + 8];
121  dst[x + 5] = src[2*x +10];
122  dst[x + 6] = src[2*x +12];
123  dst[x + 7] = src[2*x +14];
124  }
125  for (; x < w; x++) {
126  dst[x] = src[2*x];
127  }
128 }
129 
130 static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
131 {
132  int j, y;
133 
134  if ((gdv->scale_v == scale_v) && (gdv->scale_h == scale_h)) {
135  return;
136  }
137 
138  if (gdv->scale_v) {
139  for (j = 0; j < h; j++) {
140  int y = h - j - 1;
141  uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
142  uint8_t *src1 = dst + PREAMBLE_SIZE + (y>>!!gdv->scale_h) * (w>>1);
143 
144  scaleup_rev(dst1, src1, w);
145  }
146  } else if (gdv->scale_h) {
147  for (j = 0; j < h; j++) {
148  int y = h - j - 1;
149  uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
150  uint8_t *src1 = dst + PREAMBLE_SIZE + (y>>1) * w;
151  memcpy(dst1, src1, w);
152  }
153  }
154 
155  if (scale_h && scale_v) {
156  for (y = 0; y < (h>>1); y++) {
157  uint8_t *dst1 = dst + PREAMBLE_SIZE + y * (w>>1);
158  uint8_t *src1 = dst + PREAMBLE_SIZE + y*2 * w;
159  scaledown(dst1, src1, w>>1);
160  }
161  } else if (scale_h) {
162  for (y = 0; y < (h>>1); y++) {
163  uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
164  uint8_t *src1 = dst + PREAMBLE_SIZE + y*2 * w;
165  memcpy(dst1, src1, w);
166  }
167  } else if (scale_v) {
168  for (y = 0; y < h; y++) {
169  uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
170  scaledown(dst1, dst1, w>>1);
171  }
172  }
173 
174  gdv->scale_v = scale_v;
175  gdv->scale_h = scale_h;
176 }
177 
179 {
180  int res;
181 
182  if (bits->fill == 0) {
183  bits->queue |= bytestream2_get_byte(gb);
184  bits->fill = 8;
185  }
186  res = bits->queue >> 6;
187  bits->queue <<= 2;
188  bits->fill -= 2;
189 
190  return res;
191 }
192 
194 {
195  bits->queue = bytestream2_get_le32(gb);
196  bits->fill = 32;
197 }
198 
199 static int read_bits32(Bits32 *bits, GetByteContext *gb, int nbits)
200 {
201  int res = bits->queue & ((1 << nbits) - 1);
202 
203  bits->queue >>= nbits;
204  bits->fill -= nbits;
205  if (bits->fill <= 16) {
206  bits->queue |= bytestream2_get_le16(gb) << bits->fill;
207  bits->fill += 16;
208  }
209 
210  return res;
211 }
212 
213 static void lz_copy(PutByteContext *pb, GetByteContext *g2, int offset, unsigned len)
214 {
215  int i;
216 
217  if (offset == -1) {
218  int c;
219 
220  bytestream2_seek(g2, bytestream2_tell_p(pb) - 1, SEEK_SET);
221  c = bytestream2_get_byte(g2);
222  for (i = 0; i < len; i++) {
223  bytestream2_put_byte(pb, c);
224  }
225  } else if (offset < 0) {
226  int start = bytestream2_tell_p(pb) - (-offset);
227 
228  bytestream2_seek(g2, start, SEEK_SET);
229  for (i = 0; i < len; i++) {
230  bytestream2_put_byte(pb, bytestream2_get_byte(g2));
231  }
232  } else {
233  int start = bytestream2_tell_p(pb) + offset;
234 
235  bytestream2_seek(g2, start, SEEK_SET);
236  for (i = 0; i < len; i++) {
237  bytestream2_put_byte(pb, bytestream2_get_byte(g2));
238  }
239  }
240 }
241 
242 static int decompress_2(AVCodecContext *avctx)
243 {
244  GDVContext *gdv = avctx->priv_data;
245  GetByteContext *gb = &gdv->gb;
246  GetByteContext *g2 = &gdv->g2;
247  PutByteContext *pb = &gdv->pb;
248  Bits8 bits = { 0 };
249  int c, i;
250 
251  bytestream2_init(g2, gdv->frame, gdv->frame_size);
253 
254  for (c = 0; c < 256; c++) {
255  for (i = 0; i < 16; i++) {
256  gdv->frame[c * 16 + i] = c;
257  }
258  }
259 
260  while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
261  int tag = read_bits2(&bits, gb);
262  if (tag == 0) {
263  bytestream2_put_byte(pb, bytestream2_get_byte(gb));
264  } else if (tag == 1) {
265  int b = bytestream2_get_byte(gb);
266  int len = (b & 0xF) + 3;
267  int top = (b >> 4) & 0xF;
268  int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
269  lz_copy(pb, g2, off, len);
270  } else if (tag == 2) {
271  int len = (bytestream2_get_byte(gb)) + 2;
272  bytestream2_skip_p(pb, len);
273  } else {
274  break;
275  }
276  }
277 
278  if (bytestream2_get_bytes_left_p(pb) > 0)
279  return AVERROR_INVALIDDATA;
280 
281  return 0;
282 }
283 
284 static int decompress_5(AVCodecContext *avctx, unsigned skip)
285 {
286  GDVContext *gdv = avctx->priv_data;
287  GetByteContext *gb = &gdv->gb;
288  GetByteContext *g2 = &gdv->g2;
289  PutByteContext *pb = &gdv->pb;
290  Bits8 bits = { 0 };
291 
292  bytestream2_init(g2, gdv->frame, gdv->frame_size);
293  bytestream2_skip_p(pb, skip + PREAMBLE_SIZE);
294 
295  while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
296  int tag = read_bits2(&bits, gb);
297  if (bytestream2_get_bytes_left(gb) < 1)
298  return AVERROR_INVALIDDATA;
299  if (tag == 0) {
300  bytestream2_put_byte(pb, bytestream2_get_byte(gb));
301  } else if (tag == 1) {
302  int b = bytestream2_get_byte(gb);
303  int len = (b & 0xF) + 3;
304  int top = b >> 4;
305  int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
306  lz_copy(pb, g2, off, len);
307  } else if (tag == 2) {
308  int len;
309  int b = bytestream2_get_byte(gb);
310  if (b == 0) {
311  return 0;
312  }
313  if (b != 0xFF) {
314  len = b;
315  } else {
316  len = bytestream2_get_le16(gb);
317  }
318  bytestream2_skip_p(pb, len + 1);
319  } else {
320  int b = bytestream2_get_byte(gb);
321  int len = (b & 0x3) + 2;
322  int off = -(b >> 2) - 1;
323  lz_copy(pb, g2, off, len);
324  }
325  }
326  if (bytestream2_get_bytes_left_p(pb) > 0)
327  return AVERROR_INVALIDDATA;
328  return 0;
329 }
330 
331 static int decompress_68(AVCodecContext *avctx, unsigned skip, unsigned use8)
332 {
333  GDVContext *gdv = avctx->priv_data;
334  GetByteContext *gb = &gdv->gb;
335  GetByteContext *g2 = &gdv->g2;
336  PutByteContext *pb = &gdv->pb;
337  Bits32 bits;
338 
339  bytestream2_init(g2, gdv->frame, gdv->frame_size);
340  bytestream2_skip_p(pb, skip + PREAMBLE_SIZE);
341  fill_bits32(&bits, gb);
342 
343  while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
344  int tag = read_bits32(&bits, gb, 2);
345  if (tag == 0) {
346  int b = read_bits32(&bits, gb, 1);
347  if (b == 0) {
348  bytestream2_put_byte(pb, bytestream2_get_byte(gb));
349  } else {
350  int i, len = 2;
351  int lbits = 0;
352  while (1) {
353  int val;
354 
355  lbits += 1;
356  val = read_bits32(&bits, gb, lbits);
357  len += val;
358  if (val != ((1 << lbits) - 1)) {
359  break;
360  }
361  if (lbits >= 16)
362  return AVERROR_INVALIDDATA;
363  }
364  for (i = 0; i < len; i++) {
365  bytestream2_put_byte(pb, bytestream2_get_byte(gb));
366  }
367  }
368  } else if (tag == 1) {
369  int b = read_bits32(&bits, gb, 1);
370  int len;
371 
372  if (b == 0) {
373  len = (read_bits32(&bits, gb, 4)) + 2;
374  } else {
375  int bb = bytestream2_get_byte(gb);
376  if ((bb & 0x80) == 0) {
377  len = bb + 18;
378  } else {
379  int top = (bb & 0x7F) << 8;
380  len = top + bytestream2_get_byte(gb) + 146;
381  }
382  }
383  bytestream2_skip_p(pb, len);
384  } else if (tag == 2) {
385  int i, subtag = read_bits32(&bits, gb, 2);
386 
387  if (subtag != 3) {
388  int top = (read_bits32(&bits, gb, 4)) << 8;
389  int offs = top + bytestream2_get_byte(gb);
390  if ((subtag != 0) || (offs <= 0xF80)) {
391  int len = (subtag) + 3;
392  lz_copy(pb, g2, (offs) - 4096, len);
393  } else {
394  int real_off, len, c1, c2;
395 
396  if (offs == 0xFFF) {
397  return 0;
398  }
399 
400  real_off = ((offs >> 4) & 0x7) + 1;
401  len = ((offs & 0xF) + 2) * 2;
402  c1 = gdv->frame[bytestream2_tell_p(pb) - real_off];
403  c2 = gdv->frame[bytestream2_tell_p(pb) - real_off + 1];
404  for (i = 0; i < len/2; i++) {
405  bytestream2_put_byte(pb, c1);
406  bytestream2_put_byte(pb, c2);
407  }
408  }
409  } else {
410  int b = bytestream2_get_byte(gb);
411  int off = ((b & 0x7F)) + 1;
412  int len = ((b & 0x80) == 0) ? 2 : 3;
413 
414  lz_copy(pb, g2, -off, len);
415  }
416  } else {
417  int len;
418  int off;
419  if (use8) {
420  int q, b = bytestream2_get_byte(gb);
421  if ((b & 0xC0) == 0xC0) {
422  len = ((b & 0x3F)) + 8;
423  q = read_bits32(&bits, gb, 4);
424  off = (q << 8) + (bytestream2_get_byte(gb)) + 1;
425  } else {
426  int ofs1;
427  if ((b & 0x80) == 0) {
428  len = ((b >> 4)) + 6;
429  ofs1 = (b & 0xF);
430  } else {
431  len = ((b & 0x3F)) + 14;
432  ofs1 = read_bits32(&bits, gb, 4);
433  }
434  off = (ofs1 << 8) + (bytestream2_get_byte(gb)) - 4096;
435  }
436  } else {
437  int ofs1, b = bytestream2_get_byte(gb);
438 
439  if ((b >> 4) == 0xF) {
440  len = bytestream2_get_byte(gb) + 21;
441  } else {
442  len = (b >> 4) + 6;
443  }
444  ofs1 = (b & 0xF);
445  off = (ofs1 << 8) + bytestream2_get_byte(gb) - 4096;
446  }
447  lz_copy(pb, g2, off, len);
448  }
449  }
450 
451  if (bytestream2_get_bytes_left_p(pb) > 0)
452  return AVERROR_INVALIDDATA;
453 
454  return 0;
455 }
456 
457 static int gdv_decode_frame(AVCodecContext *avctx, void *data,
458  int *got_frame, AVPacket *avpkt)
459 {
460  GDVContext *gdv = avctx->priv_data;
461  GetByteContext *gb = &gdv->gb;
462  PutByteContext *pb = &gdv->pb;
463  AVFrame *frame = data;
464  int ret, i;
465  buffer_size_t pal_size;
466  const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &pal_size);
467  int compression;
468  unsigned flags;
469  uint8_t *dst;
470 
471  bytestream2_init(gb, avpkt->data, avpkt->size);
472  bytestream2_init_writer(pb, gdv->frame, gdv->frame_size);
473 
474  flags = bytestream2_get_le32(gb);
475  compression = flags & 0xF;
476 
477  if (compression == 4 || compression == 7 || compression > 8)
478  return AVERROR_INVALIDDATA;
479 
480  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
481  return ret;
482  if (pal && pal_size == AVPALETTE_SIZE)
483  memcpy(gdv->pal, pal, AVPALETTE_SIZE);
484 
485  if (compression < 2 && bytestream2_get_bytes_left(gb) < 256*3)
486  return AVERROR_INVALIDDATA;
487  rescale(gdv, gdv->frame, avctx->width, avctx->height,
488  !!(flags & 0x10), !!(flags & 0x20));
489 
490  switch (compression) {
491  case 1:
492  memset(gdv->frame + PREAMBLE_SIZE, 0, gdv->frame_size - PREAMBLE_SIZE);
493  case 0:
494  for (i = 0; i < 256; i++) {
495  unsigned r = bytestream2_get_byte(gb);
496  unsigned g = bytestream2_get_byte(gb);
497  unsigned b = bytestream2_get_byte(gb);
498  gdv->pal[i] = 0xFFU << 24 | r << 18 | g << 10 | b << 2;
499  }
500  break;
501  case 2:
502  ret = decompress_2(avctx);
503  break;
504  case 3:
505  break;
506  case 5:
507  ret = decompress_5(avctx, flags >> 8);
508  break;
509  case 6:
510  ret = decompress_68(avctx, flags >> 8, 0);
511  break;
512  case 8:
513  ret = decompress_68(avctx, flags >> 8, 1);
514  break;
515  default:
516  av_assert0(0);
517  }
518  if (ret < 0)
519  return ret;
520 
521  memcpy(frame->data[1], gdv->pal, AVPALETTE_SIZE);
522  dst = frame->data[0];
523 
524  if (!gdv->scale_v && !gdv->scale_h) {
525  int sidx = PREAMBLE_SIZE, didx = 0;
526  int y;
527 
528  for (y = 0; y < avctx->height; y++) {
529  memcpy(dst + didx, gdv->frame + sidx, avctx->width);
530  sidx += avctx->width;
531  didx += frame->linesize[0];
532  }
533  } else {
534  int sidx = PREAMBLE_SIZE, didx = 0;
535  int y;
536 
537  for (y = 0; y < avctx->height; y++) {
538  if (!gdv->scale_v) {
539  memcpy(dst + didx, gdv->frame + sidx, avctx->width);
540  } else {
541  uint8_t *dst2 = dst + didx;
542  uint8_t *src2 = gdv->frame + sidx;
543 
544  scaleup(dst2, src2, avctx->width);
545  }
546  if (!gdv->scale_h || ((y & 1) == 1)) {
547  sidx += !gdv->scale_v ? avctx->width : avctx->width/2;
548  }
549  didx += frame->linesize[0];
550  }
551  }
552 
553  *got_frame = 1;
554 
555  return avpkt->size;
556 }
557 
559 {
560  GDVContext *gdv = avctx->priv_data;
561  av_freep(&gdv->frame);
562  return 0;
563 }
564 
566  .name = "gdv",
567  .long_name = NULL_IF_CONFIG_SMALL("Gremlin Digital Video"),
568  .type = AVMEDIA_TYPE_VIDEO,
569  .id = AV_CODEC_ID_GDV,
570  .priv_data_size = sizeof(GDVContext),
572  .close = gdv_decode_close,
574  .capabilities = AV_CODEC_CAP_DR1,
575  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
576 };
AVCodec
AVCodec.
Definition: codec.h:197
GDVContext::pb
PutByteContext pb
Definition: gdv.c:33
FF_CODEC_CAP_INIT_THREADSAFE
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:41
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
r
const char * r
Definition: vf_curves.c:116
AVERROR
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
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, buffer_size_t *size)
Definition: avpacket.c:368
GetByteContext
Definition: bytestream.h:33
decompress_2
static int decompress_2(AVCodecContext *avctx)
Definition: gdv.c:242
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
bytestream2_seek
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition: bytestream.h:212
w
uint8_t w
Definition: llviddspenc.c:39
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:369
b
#define b
Definition: input.c:41
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:46
decompress_68
static int decompress_68(AVCodecContext *avctx, unsigned skip, unsigned use8)
Definition: gdv.c:331
bytestream2_tell_p
static av_always_inline int bytestream2_tell_p(PutByteContext *p)
Definition: bytestream.h:197
data
const char data[16]
Definition: mxf.c:142
GDVContext::avctx
AVCodecContext * avctx
Definition: gdv.c:29
AV_CODEC_ID_GDV
@ AV_CODEC_ID_GDV
Definition: codec_id.h:284
c1
static const uint64_t c1
Definition: murmur3.c:51
Bits32::fill
uint8_t fill
Definition: gdv.c:48
GDVContext::frame
uint8_t * frame
Definition: gdv.c:36
GDVContext::frame_size
unsigned frame_size
Definition: gdv.c:37
U
#define U(x)
Definition: vp56_arith.h:37
val
static double val(void *priv, double ch)
Definition: aeval.c:76
PREAMBLE_SIZE
#define PREAMBLE_SIZE
Definition: gdv.c:51
scaleup
static void scaleup(uint8_t *dst, const uint8_t *src, int w)
Definition: gdv.c:75
bytestream2_get_bytes_left_p
static av_always_inline int bytestream2_get_bytes_left_p(PutByteContext *p)
Definition: bytestream.h:163
av_cold
#define av_cold
Definition: attributes.h:90
bytestream2_init_writer
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
Definition: bytestream.h:147
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
read_bits2
static int read_bits2(Bits8 *bits, GetByteContext *gb)
Definition: gdv.c:178
buffer_size_t
int buffer_size_t
Definition: internal.h:306
g
const char * g
Definition: vf_curves.c:117
bits
uint8_t bits
Definition: vp3data.h:141
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
gdv_decode_init
static av_cold int gdv_decode_init(AVCodecContext *avctx)
Definition: gdv.c:53
GDVContext::scale_v
unsigned scale_v
Definition: gdv.c:38
lz_copy
static void lz_copy(PutByteContext *pb, GetByteContext *g2, int offset, unsigned len)
Definition: gdv.c:213
Bits8
Definition: gdv.c:41
Bits8::fill
uint8_t fill
Definition: gdv.c:43
ff_gdv_decoder
AVCodec ff_gdv_decoder
Definition: gdv.c:565
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
src
#define src
Definition: vp8dsp.c:255
Bits32::queue
uint32_t queue
Definition: gdv.c:47
gdv_decode_close
static av_cold int gdv_decode_close(AVCodecContext *avctx)
Definition: gdv.c:558
c
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
Definition: undefined.txt:32
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
PutByteContext
Definition: bytestream.h:37
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1900
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:370
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
rescale
static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
Definition: gdv.c:130
GDVContext
Definition: gdv.c:28
fill_bits32
static void fill_bits32(Bits32 *bits, GetByteContext *gb)
Definition: gdv.c:193
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
src1
#define src1
Definition: h264pred.c:140
i
int i
Definition: input.c:407
scaledown
static void scaledown(uint8_t *dst, const uint8_t *src, int w)
Definition: gdv.c:112
bytestream2_skip_p
static av_always_inline void bytestream2_skip_p(PutByteContext *p, unsigned int size)
Definition: bytestream.h:180
common.h
gdv_decode_frame
static int gdv_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: gdv.c:457
uint8_t
uint8_t
Definition: audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:204
len
int len
Definition: vorbis_enc_data.h:452
AVCodecContext::height
int height
Definition: avcodec.h:709
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
avcodec.h
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:77
GDVContext::pal
uint32_t pal[256]
Definition: gdv.c:35
tag
uint32_t tag
Definition: movenc.c:1611
ret
ret
Definition: filter_design.txt:187
frame
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
Definition: filter_design.txt:264
scaleup_rev
static void scaleup_rev(uint8_t *dst, const uint8_t *src, int w)
Definition: gdv.c:93
GDVContext::g2
GetByteContext g2
Definition: gdv.c:32
AVCodecContext
main external API structure.
Definition: avcodec.h:536
c2
static const uint64_t c2
Definition: murmur3.c:52
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
Definition: mem.c:245
decompress_5
static int decompress_5(AVCodecContext *avctx, unsigned skip)
Definition: gdv.c:284
GDVContext::gb
GetByteContext gb
Definition: gdv.c:31
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVPacket
This structure stores compressed data.
Definition: packet.h:346
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:563
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
Bits8::queue
uint8_t queue
Definition: gdv.c:42
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:709
GDVContext::scale_h
unsigned scale_h
Definition: gdv.c:38
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
h
h
Definition: vp9dsp_template.c:2038
Bits32
Definition: gdv.c:46
read_bits32
static int read_bits32(Bits32 *bits, GetByteContext *gb, int nbits)
Definition: gdv.c:199