FFmpeg
imm4.c
Go to the documentation of this file.
1 /*
2  * Infinity IMM4 decoder
3  *
4  * Copyright (c) 2018 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 <stddef.h>
24 #include <string.h>
25 
26 #include "libavutil/attributes.h"
27 #include "libavutil/mem.h"
28 #include "libavutil/mem_internal.h"
29 #include "libavutil/thread.h"
30 
31 #include "avcodec.h"
32 #include "bswapdsp.h"
33 #include "codec_internal.h"
34 #include "decode.h"
35 #include "copy_block.h"
36 #include "get_bits.h"
37 #include "idctdsp.h"
38 
39 #define CBPLO_VLC_BITS 6
40 #define CBPHI_VLC_BITS 6
41 #define BLKTYPE_VLC_BITS 9
42 #define BLOCK_VLC_BITS 12
43 
44 typedef struct IMM4Context {
47 
49  uint8_t *bitstream;
51 
52  int factor;
53  unsigned lo;
54  unsigned hi;
55 
57  DECLARE_ALIGNED(32, int16_t, block)[6][64];
58 } IMM4Context;
59 
60 static const uint8_t intra_cb[] = {
61  24, 18, 12
62 };
63 
64 static const uint8_t inter_cb[] = {
65  30, 20, 15
66 };
67 
68 static const uint8_t cbplo[][2] = {
69  { 0,-6 }, { 0x01, 6 }, { 0x02, 6 }, { 0x03, 6 }, { 0x00, 4 },
70  { 0x01, 3 }, { 0x02, 3 }, { 0x03, 3 }, { 0x00, 1 },
71 };
72 
73 static const uint8_t cbphi_bits[] = {
74  4, 5, 5, 4, 5, 4, 6, 4, 5, 6, 4, 4, 4, 4, 4, 2
75 };
76 
77 static const uint8_t cbphi_codes[] = {
78  3, 5, 4, 9, 3, 7, 2, 11, 2, 3, 5, 10, 4, 8, 6, 3
79 };
80 
81 static const uint8_t blktype[][2] = {
82  { 0,-8 }, { 0x34, 9 }, { 0,-9 }, { 0x14, 9 }, { 0,-9 },
83  { 0x23, 8 }, { 0x13, 8 }, { 0x32, 8 }, { 0x33, 7 }, { 0x22, 7 },
84  { 0x12, 7 }, { 0x21, 7 }, { 0x11, 7 }, { 0x04, 6 }, { 0x30, 6 },
85  { 0x03, 5 }, { 0x20, 4 }, { 0x10, 4 }, { 0x02, 3 }, { 0x01, 3 },
86  { 0x00, 1 },
87 };
88 
89 static const uint16_t block_symbols[] = {
90  0, 0x4082, 0x4003, 0x000B, 0x000A, 0x4E01, 0x4D81, 0x4D01, 0x4C81,
91  0x0482, 0x0402, 0x0382, 0x0302, 0x0282, 0x0183, 0x0103, 0x0084, 0x000C,
92  0x0085, 0x0B81, 0x0C01, 0x4E81, 0x4F01, 0x4F81, 0x5001, 0x0086, 0x0104,
93  0x0203, 0x0283, 0x0303, 0x0502, 0x0C81, 0x0D01, 0x5081, 0x5101, 0x5181,
94  0x5201, 0x5281, 0x5301, 0x5381, 0x5401, 0x0000, 0x0009, 0x0008, 0x4C01,
95  0x4B81, 0x4B01, 0x4A81, 0x4A01, 0x4981, 0x4901, 0x4881, 0x4002, 0x0B01,
96  0x0A81, 0x0A01, 0x0981, 0x0901, 0x0881, 0x0801, 0x0781, 0x0202, 0x0182,
97  0x0007, 0x0006, 0x4801, 0x4781, 0x4701, 0x4681, 0x4601, 0x4581, 0x4501,
98  0x4481, 0x0701, 0x0681, 0x0102, 0x0083, 0x0005, 0x4401, 0x4381, 0x4301,
99  0x4281, 0x0601, 0x0581, 0x0501, 0x0004, 0x4201, 0x4181, 0x4101, 0x4081,
100  0x0481, 0x0401, 0x0381, 0x0301, 0x0082, 0x0003, 0x0281, 0x0201, 0x0181,
101  0x4001, 0x0001, 0x0081, 0x0101, 0x0002,
102 };
103 
104 static const uint8_t block_bits[] = {
105  -9, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11,
106  11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
107  12, 12, 12, 7, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
108  9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
109  8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6,
110  6, 5, 5, 5, 4, 2, 3, 4, 4,
111 };
112 
117 
118 static int get_cbphi(GetBitContext *gb, int x)
119 {
120  int value;
121 
123  if (value < 0)
124  return AVERROR_INVALIDDATA;
125 
126  return x ? value : 15 - value;
127 }
128 
130  int block, int factor, int flag, int offset, int flag2)
131 {
132  IMM4Context *s = avctx->priv_data;
133  const uint8_t *idct_permutation = s->idsp.idct_permutation;
134  int i, last, len, factor2;
135 
136  for (i = !flag; i < 64; i++) {
137  int value;
138 
140  if (value < 0)
141  return AVERROR_INVALIDDATA;
142  if (value == 0) {
143  last = get_bits1(gb);
144  len = get_bits(gb, 6);
145  factor2 = get_sbits(gb, 8);
146  } else {
147  factor2 = value & 0x7F;
148  last = (value >> 14) & 1;
149  len = (value >> 7) & 0x3F;
150  if (get_bits1(gb))
151  factor2 = -factor2;
152  }
153  i += len;
154  if (i >= 64)
155  break;
156  s->block[block][idct_permutation[i]] = offset * (factor2 < 0 ? -1 : 1) + factor * factor2;
157  if (last)
158  break;
159  }
160 
161  if (s->hi == 2 && flag2 && block < 4) {
162  if (flag)
163  s->block[block][idct_permutation[0]] *= 2;
164  s->block[block][idct_permutation[1]] *= 2;
165  s->block[block][idct_permutation[8]] *= 2;
166  s->block[block][idct_permutation[16]] *= 2;
167  }
168 
169  return 0;
170 }
171 
173  unsigned cbp, int flag, int offset, unsigned flag2)
174 {
175  IMM4Context *s = avctx->priv_data;
176  const uint8_t *idct_permutation = s->idsp.idct_permutation;
177  int ret, i;
178 
179  memset(s->block, 0, sizeof(s->block));
180 
181  for (i = 0; i < 6; i++) {
182  if (!flag) {
183  int x = get_bits(gb, 8);
184 
185  if (x == 255)
186  x = 128;
187  x *= 8;
188 
189  s->block[i][idct_permutation[0]] = x;
190  }
191 
192  if (cbp & (1 << (5 - i))) {
193  ret = decode_block(avctx, gb, i, s->factor, flag, offset, flag2);
194  if (ret < 0)
195  return ret;
196  }
197  }
198 
199  return 0;
200 }
201 
203 {
204  IMM4Context *s = avctx->priv_data;
205  int ret, x, y, offset = 0;
206 
207  if (s->hi == 0) {
208  if (s->lo > 2)
209  return AVERROR_INVALIDDATA;
210  s->factor = intra_cb[s->lo];
211  } else {
212  s->factor = s->lo * 2;
213  }
214 
215  if (s->hi) {
216  offset = s->factor;
217  offset >>= 1;
218  if (!(offset & 1))
219  offset--;
220  }
221 
222  for (y = 0; y < avctx->height; y += 16) {
223  for (x = 0; x < avctx->width; x += 16) {
224  unsigned flag, cbplo;
225  int cbphi;
226 
228  flag = get_bits1(gb);
229 
230  cbphi = get_cbphi(gb, 1);
231  if (cbphi < 0)
232  return cbphi;
233 
234  ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset, flag);
235  if (ret < 0)
236  return ret;
237 
238  s->idsp.idct_put(frame->data[0] + y * frame->linesize[0] + x,
239  frame->linesize[0], s->block[0]);
240  s->idsp.idct_put(frame->data[0] + y * frame->linesize[0] + x + 8,
241  frame->linesize[0], s->block[1]);
242  s->idsp.idct_put(frame->data[0] + (y + 8) * frame->linesize[0] + x,
243  frame->linesize[0], s->block[2]);
244  s->idsp.idct_put(frame->data[0] + (y + 8) * frame->linesize[0] + x + 8,
245  frame->linesize[0], s->block[3]);
246  s->idsp.idct_put(frame->data[1] + (y >> 1) * frame->linesize[1] + (x >> 1),
247  frame->linesize[1], s->block[4]);
248  s->idsp.idct_put(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
249  frame->linesize[2], s->block[5]);
250  }
251  }
252 
253  return 0;
254 }
255 
257  AVFrame *frame, AVFrame *prev)
258 {
259  IMM4Context *s = avctx->priv_data;
260  int ret, x, y, offset = 0;
261 
262  if (s->hi == 0) {
263  if (s->lo > 2)
264  return AVERROR_INVALIDDATA;
265  s->factor = inter_cb[s->lo];
266  } else {
267  s->factor = s->lo * 2;
268  }
269 
270  if (s->hi) {
271  offset = s->factor;
272  offset >>= 1;
273  if (!(offset & 1))
274  offset--;
275  }
276 
277  for (y = 0; y < avctx->height; y += 16) {
278  for (x = 0; x < avctx->width; x += 16) {
279  int reverse, intra_block, value;
280  unsigned cbplo, flag2 = 0;
281  int cbphi;
282 
283  if (get_bits1(gb)) {
284  copy_block16(frame->data[0] + y * frame->linesize[0] + x,
285  prev->data[0] + y * prev->linesize[0] + x,
286  frame->linesize[0], prev->linesize[0], 16);
287  copy_block8(frame->data[1] + (y >> 1) * frame->linesize[1] + (x >> 1),
288  prev->data[1] + (y >> 1) * prev->linesize[1] + (x >> 1),
289  frame->linesize[1], prev->linesize[1], 8);
290  copy_block8(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
291  prev->data[2] + (y >> 1) * prev->linesize[2] + (x >> 1),
292  frame->linesize[2], prev->linesize[2], 8);
293  continue;
294  }
295 
297  if (value < 0)
298  return AVERROR_INVALIDDATA;
299 
300  intra_block = value & 0x07;
301  reverse = intra_block == 3;
302  if (reverse)
303  flag2 = get_bits1(gb);
304 
305  cbplo = value >> 4;
306  cbphi = get_cbphi(gb, reverse);
307  if (cbphi < 0)
308  return cbphi;
309 
310  if (intra_block) {
311  ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset, flag2);
312  if (ret < 0)
313  return ret;
314 
315  s->idsp.idct_put(frame->data[0] + y * frame->linesize[0] + x,
316  frame->linesize[0], s->block[0]);
317  s->idsp.idct_put(frame->data[0] + y * frame->linesize[0] + x + 8,
318  frame->linesize[0], s->block[1]);
319  s->idsp.idct_put(frame->data[0] + (y + 8) * frame->linesize[0] + x,
320  frame->linesize[0], s->block[2]);
321  s->idsp.idct_put(frame->data[0] + (y + 8) * frame->linesize[0] + x + 8,
322  frame->linesize[0], s->block[3]);
323  s->idsp.idct_put(frame->data[1] + (y >> 1) * frame->linesize[1] + (x >> 1),
324  frame->linesize[1], s->block[4]);
325  s->idsp.idct_put(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
326  frame->linesize[2], s->block[5]);
327  } else {
328  flag2 = get_bits1(gb);
329  skip_bits1(gb);
330  ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 1, offset, flag2);
331  if (ret < 0)
332  return ret;
333 
334  copy_block16(frame->data[0] + y * frame->linesize[0] + x,
335  prev->data[0] + y * prev->linesize[0] + x,
336  frame->linesize[0], prev->linesize[0], 16);
337  copy_block8(frame->data[1] + (y >> 1) * frame->linesize[1] + (x >> 1),
338  prev->data[1] + (y >> 1) * prev->linesize[1] + (x >> 1),
339  frame->linesize[1], prev->linesize[1], 8);
340  copy_block8(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
341  prev->data[2] + (y >> 1) * prev->linesize[2] + (x >> 1),
342  frame->linesize[2], prev->linesize[2], 8);
343 
344  s->idsp.idct_add(frame->data[0] + y * frame->linesize[0] + x,
345  frame->linesize[0], s->block[0]);
346  s->idsp.idct_add(frame->data[0] + y * frame->linesize[0] + x + 8,
347  frame->linesize[0], s->block[1]);
348  s->idsp.idct_add(frame->data[0] + (y + 8) * frame->linesize[0] + x,
349  frame->linesize[0], s->block[2]);
350  s->idsp.idct_add(frame->data[0] + (y + 8) * frame->linesize[0] + x + 8,
351  frame->linesize[0], s->block[3]);
352  s->idsp.idct_add(frame->data[1] + (y >> 1) * frame->linesize[1] + (x >> 1),
353  frame->linesize[1], s->block[4]);
354  s->idsp.idct_add(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
355  frame->linesize[2], s->block[5]);
356  }
357  }
358  }
359 
360  return 0;
361 }
362 
364  int *got_frame, AVPacket *avpkt)
365 {
366  IMM4Context *s = avctx->priv_data;
367  GetBitContext *gb = &s->gb;
368  int width, height;
369  unsigned type;
370  int ret, scaled;
371 
372  if (avpkt->size <= 32)
373  return AVERROR_INVALIDDATA;
374 
375  av_fast_padded_malloc(&s->bitstream, &s->bitstream_size,
376  FFALIGN(avpkt->size, 4));
377  if (!s->bitstream)
378  return AVERROR(ENOMEM);
379 
380  s->bdsp.bswap_buf((uint32_t *)s->bitstream,
381  (uint32_t *)avpkt->data,
382  (avpkt->size + 3) >> 2);
383 
384  if ((ret = init_get_bits8(gb, s->bitstream, FFALIGN(avpkt->size, 4))) < 0)
385  return ret;
386 
387  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
388  avctx->color_range = AVCOL_RANGE_JPEG;
389 
390  width = avctx->width;
391  height = avctx->height;
392 
393  scaled = avpkt->data[8];
394  if (scaled < 2) {
395  int mode = avpkt->data[10];
396 
397  switch (mode) {
398  case 1:
399  width = 352;
400  height = 240;
401  break;
402  case 2:
403  width = 704;
404  height = 240;
405  break;
406  case 4:
407  width = 480;
408  height = 704;
409  break;
410  case 17:
411  width = 352;
412  height = 288;
413  break;
414  case 18:
415  width = 704;
416  height = 288;
417  break;
418  default:
419  width = 704;
420  height = 576;
421  break;
422  }
423  }
424 
425  skip_bits_long(gb, 24 * 8);
426  type = get_bits_long(gb, 32);
427  s->hi = get_bits(gb, 16);
428  s->lo = get_bits(gb, 16);
429 
430  switch (type) {
431  case 0x19781977:
432  frame->flags |= AV_FRAME_FLAG_KEY;
433  frame->pict_type = AV_PICTURE_TYPE_I;
434  break;
435  case 0x12250926:
436  frame->flags &= ~AV_FRAME_FLAG_KEY;
437  frame->pict_type = AV_PICTURE_TYPE_P;
438  break;
439  default:
440  avpriv_request_sample(avctx, "type %X", type);
441  return AVERROR_PATCHWELCOME;
442  }
443 
444  if (avctx->width != width ||
445  avctx->height != height) {
446  if (!(frame->flags & AV_FRAME_FLAG_KEY)) {
447  av_log(avctx, AV_LOG_ERROR, "Frame size change is unsupported.\n");
448  return AVERROR_INVALIDDATA;
449  }
450  av_frame_unref(s->prev_frame);
451  }
452 
453  ret = ff_set_dimensions(avctx, width, height);
454  if (ret < 0)
455  return ret;
456 
457  if (((avctx->width + 15) / 16) * ((avctx->height + 15) / 16) > get_bits_left(gb))
458  return AVERROR_INVALIDDATA;
459 
460 
461  if ((ret = ff_get_buffer(avctx, frame, (frame->flags & AV_FRAME_FLAG_KEY) ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
462  return ret;
463 
464  if (frame->flags & AV_FRAME_FLAG_KEY) {
465  ret = decode_intra(avctx, gb, frame);
466  if (ret < 0)
467  return ret;
468 
469  if ((ret = av_frame_replace(s->prev_frame, frame)) < 0)
470  return ret;
471  } else {
472  if (!s->prev_frame->data[0]) {
473  av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
474  return AVERROR_INVALIDDATA;
475  }
476 
477  ret = decode_inter(avctx, gb, frame, s->prev_frame);
478  if (ret < 0)
479  return ret;
480  }
481 
482  *got_frame = 1;
483 
484  return avpkt->size;
485 }
486 
488 {
490  &cbplo[0][1], 2, &cbplo[0][0], 2, 1,
491  0, 0);
492 
494  cbphi_bits, 1, 1, cbphi_codes, 1, 1, 0);
495 
497  &blktype[0][1], 2, &blktype[0][0], 2, 1,
498  0, 0);
499 
501  block_bits, 1, block_symbols, 2, 2,
502  0, 0);
503 }
504 
506 {
507  static AVOnce init_static_once = AV_ONCE_INIT;
508  IMM4Context *s = avctx->priv_data;
509 
510  ff_bswapdsp_init(&s->bdsp);
511  ff_idctdsp_init(&s->idsp, avctx);
512 
513  s->prev_frame = av_frame_alloc();
514  if (!s->prev_frame)
515  return AVERROR(ENOMEM);
516 
517  ff_thread_once(&init_static_once, imm4_init_static_data);
518 
519  return 0;
520 }
521 
523 {
524  IMM4Context *s = avctx->priv_data;
525 
526  av_frame_unref(s->prev_frame);
527 }
528 
530 {
531  IMM4Context *s = avctx->priv_data;
532 
533  av_frame_free(&s->prev_frame);
534  av_freep(&s->bitstream);
535  s->bitstream_size = 0;
536 
537  return 0;
538 }
539 
541  .p.name = "imm4",
542  CODEC_LONG_NAME("Infinity IMM4"),
543  .p.type = AVMEDIA_TYPE_VIDEO,
544  .p.id = AV_CODEC_ID_IMM4,
545  .priv_data_size = sizeof(IMM4Context),
546  .init = decode_init,
547  .close = decode_close,
549  .flush = decode_flush,
550  .p.capabilities = AV_CODEC_CAP_DR1,
551  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
552 };
imm4_init_static_data
static av_cold void imm4_init_static_data(void)
Definition: imm4.c:487
bswapdsp.h
IMM4Context::factor
int factor
Definition: imm4.c:52
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:276
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:689
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
blktype_tab
static VLCElem blktype_tab[1<< BLKTYPE_VLC_BITS]
Definition: imm4.c:115
mem_internal.h
get_cbphi
static int get_cbphi(GetBitContext *gb, int x)
Definition: imm4.c:118
thread.h
block_bits
static const uint8_t block_bits[]
Definition: imm4.c:104
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:419
cbplo_tab
static VLCElem cbplo_tab[1<< CBPLO_VLC_BITS]
Definition: imm4.c:113
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
mode
Definition: swscale.c:56
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:767
AVPacket::data
uint8_t * data
Definition: packet.h:558
decode_flush
static av_cold void decode_flush(AVCodecContext *avctx)
Definition: imm4.c:522
FFCodec
Definition: codec_internal.h:127
copy_block8
static void copy_block8(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
Definition: copy_block.h:47
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition: imm4.c:363
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:91
intra_cb
static const uint8_t intra_cb[]
Definition: imm4.c:60
ff_idctdsp_init
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition: idctdsp.c:228
decode_close
static av_cold int decode_close(AVCodecContext *avctx)
Definition: imm4.c:529
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:448
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:333
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
cbplo
static const uint8_t cbplo[][2]
Definition: imm4.c:68
GetBitContext
Definition: get_bits.h:109
type
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 type
Definition: writing_filters.txt:86
decode_intra
static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
Definition: imm4.c:202
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
CBPHI_VLC_BITS
#define CBPHI_VLC_BITS
Definition: imm4.c:40
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:539
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:642
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:346
decode_block
static int decode_block(AVCodecContext *avctx, GetBitContext *gb, int block, int factor, int flag, int offset, int flag2)
Definition: imm4.c:129
s
#define s(width, name)
Definition: cbs_vp9.c:198
blktype
static const uint8_t blktype[][2]
Definition: imm4.c:81
BLKTYPE_VLC_BITS
#define BLKTYPE_VLC_BITS
Definition: imm4.c:41
IMM4Context::bdsp
BswapDSPContext bdsp
Definition: imm4.c:45
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
get_sbits
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:318
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: imm4.c:505
decode.h
cbphi_codes
static const uint8_t cbphi_codes[]
Definition: imm4.c:77
get_bits.h
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:331
IMM4Context::hi
unsigned hi
Definition: imm4.c:54
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
copy_block16
static void copy_block16(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
Definition: copy_block.h:68
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:49
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:669
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:386
cbphi_bits
static const uint8_t cbphi_bits[]
Definition: imm4.c:73
CBPLO_VLC_BITS
#define CBPLO_VLC_BITS
Definition: imm4.c:39
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:646
AVOnce
#define AVOnce
Definition: thread.h:202
inter_cb
static const uint8_t inter_cb[]
Definition: imm4.c:64
IMM4Context::bitstream_size
int bitstream_size
Definition: imm4.c:50
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1720
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
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:559
height
#define height
Definition: dsp.h:89
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
block_symbols
static const uint16_t block_symbols[]
Definition: imm4.c:89
VLCElem
Definition: vlc.h:32
decode_inter
static int decode_inter(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame, AVFrame *prev)
Definition: imm4.c:256
AV_CODEC_ID_IMM4
@ AV_CODEC_ID_IMM4
Definition: codec_id.h:291
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
attributes.h
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:411
IMM4Context::prev_frame
AVFrame * prev_frame
Definition: imm4.c:48
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
copy_block.h
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:53
value
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 default value
Definition: writing_filters.txt:86
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
cbphi_tab
static VLCElem cbphi_tab[1<< CBPHI_VLC_BITS]
Definition: imm4.c:114
IMM4Context::bitstream
uint8_t * bitstream
Definition: imm4.c:49
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
len
int len
Definition: vorbis_enc_data.h:426
AVCodecContext::height
int height
Definition: avcodec.h:592
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
IMM4Context::block
int16_t block[6][64]
Definition: imm4.c:57
idctdsp.h
avcodec.h
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:265
IDCTDSPContext
Definition: idctdsp.h:43
flag
#define flag(name)
Definition: cbs_av1.c:496
ff_imm4_decoder
const FFCodec ff_imm4_decoder
Definition: imm4.c:540
av_frame_replace
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
Definition: frame.c:376
AVCodecContext
main external API structure.
Definition: avcodec.h:431
IMM4Context::gb
GetBitContext gb
Definition: imm4.c:46
VLC_INIT_STATIC_TABLE
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:278
factor
static const int factor[16]
Definition: vf_pp7.c:80
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
BLOCK_VLC_BITS
#define BLOCK_VLC_BITS
Definition: imm4.c:42
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
VLC_INIT_STATIC_TABLE_FROM_LENGTHS
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
Definition: vlc.h:288
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:535
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
IMM4Context
Definition: imm4.c:44
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
block_tab
static VLCElem block_tab[1<< BLOCK_VLC_BITS]
Definition: imm4.c:116
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:472
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
BswapDSPContext
Definition: bswapdsp.h:24
width
#define width
Definition: dsp.h:89
decode_blocks
static int decode_blocks(AVCodecContext *avctx, GetBitContext *gb, unsigned cbp, int flag, int offset, unsigned flag2)
Definition: imm4.c:172
IMM4Context::idsp
IDCTDSPContext idsp
Definition: imm4.c:56
IMM4Context::lo
unsigned lo
Definition: imm4.c:53