FFmpeg
faxcompr.c
Go to the documentation of this file.
1 /*
2  * CCITT Fax Group 3 and 4 decompression
3  * Copyright (c) 2008 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  * CCITT Fax Group 3 and 4 decompression
25  * @author Konstantin Shishkov
26  */
27 #include "avcodec.h"
28 #include "get_bits.h"
29 #include "put_bits.h"
30 #include "faxcompr.h"
31 
32 #define CCITT_SYMS 104
33 
34 static const uint16_t ccitt_syms[CCITT_SYMS] = {
35  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
36  13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
37  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
38  39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
39  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
40  128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896,
41  960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728,
42  1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560
43 };
44 
46 {
47  {
48  0x35, 0x07, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, 0x13, 0x14, 0x07, 0x08, 0x08,
49  0x03, 0x34, 0x35, 0x2A, 0x2B, 0x27, 0x0C, 0x08, 0x17, 0x03, 0x04, 0x28, 0x2B,
50  0x13, 0x24, 0x18, 0x02, 0x03, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
51  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x04, 0x05, 0x0A, 0x0B, 0x52, 0x53, 0x54,
52  0x55, 0x24, 0x25, 0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34, 0x1B,
53  0x12, 0x17, 0x37, 0x36, 0x37, 0x64, 0x65, 0x68, 0x67, 0xCC, 0xCD, 0xD2, 0xD3,
54  0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98, 0x99, 0x9A, 0x18, 0x9B,
55  0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
56  },
57  {
58  0x37, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x05, 0x04, 0x04, 0x05, 0x07,
59  0x04, 0x07, 0x18, 0x17, 0x18, 0x08, 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18,
60  0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
61  0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
62  0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67, 0x0F,
63  0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35, 0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72,
64  0x73, 0x74, 0x75, 0x76, 0x77, 0x52, 0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65,
65  0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
66  }
67 };
68 
70 {
71  {
72  8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7,
73  7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75  8, 8, 8, 8, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
76  9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 11, 11, 11, 12, 12, 12, 12, 12, 12,
77  12, 12, 12, 12
78  },
79  {
80  10, 3, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11,
81  11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
82  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
83  12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
84  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 11, 12, 12, 12, 12, 12, 12,
85  12, 12, 12, 12
86  }
87 };
88 
89 static const uint8_t ccitt_group3_2d_bits[11] = {
90  1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
91 };
92 
93 static const uint8_t ccitt_group3_2d_lens[11] = {
94  4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
95 };
96 
98 
100 {
101  static VLC_TYPE code_table1[528][2];
102  static VLC_TYPE code_table2[648][2];
103  int i;
104  static int initialized = 0;
105 
106  if (initialized)
107  return;
108  ccitt_vlc[0].table = code_table1;
109  ccitt_vlc[0].table_allocated = 528;
110  ccitt_vlc[1].table = code_table2;
111  ccitt_vlc[1].table_allocated = 648;
112  for (i = 0; i < 2; i++) {
113  ff_init_vlc_sparse(&ccitt_vlc[i], 9, CCITT_SYMS,
114  ccitt_codes_lens[i], 1, 1,
115  ccitt_codes_bits[i], 1, 1,
116  ccitt_syms, 2, 2,
118  }
119  INIT_VLC_STATIC(&ccitt_group3_2d_vlc, 9, 11,
120  ccitt_group3_2d_lens, 1, 1,
121  ccitt_group3_2d_bits, 1, 1, 512);
122  initialized = 1;
123 }
124 
126  unsigned int *pix_left, int **runs,
127  const int *runend, int *mode)
128 {
129  int eob = 0;
130  int newmode;
131  int saved_run = 0;
132 
133  do {
134  int cwi, k;
135  int cw = 0;
136  int codes[2];
137  do {
138  cwi = show_bits(gb, 11);
139  if (!cwi) {
140  av_log(avctx, AV_LOG_ERROR, "Invalid uncompressed codeword\n");
141  return AVERROR_INVALIDDATA;
142  }
143  cwi = 10 - av_log2(cwi);
144  skip_bits(gb, cwi + 1);
145  if (cwi > 5) {
146  newmode = get_bits1(gb);
147  eob = 1;
148  cwi -= 6;
149  }
150  cw += cwi;
151  } while(cwi == 5);
152 
153  codes[0] = cw;
154  codes[1] = !eob;
155 
156  for (k = 0; k < 2; k++) {
157  if (codes[k]) {
158  if (*mode == !k) {
159  *(*runs)++ = saved_run;
160  if (*runs >= runend) {
161  av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
162  return AVERROR_INVALIDDATA;
163  }
164  if (*pix_left <= saved_run) {
165  av_log(avctx, AV_LOG_ERROR, "uncompressed run went out of bounds\n");
166  return AVERROR_INVALIDDATA;
167  }
168  *pix_left -= saved_run;
169  saved_run = 0;
170  *mode = !*mode;
171  }
172  saved_run += codes[k];
173  }
174  }
175  } while (!eob);
176  *(*runs)++ = saved_run;
177  if (*runs >= runend) {
178  av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
179  return AVERROR_INVALIDDATA;
180  }
181  if (*pix_left <= saved_run) {
182  if (*pix_left == saved_run)
183  return 1;
184  av_log(avctx, AV_LOG_ERROR, "uncompressed run went out of boundsE\n");
185  return AVERROR_INVALIDDATA;
186  }
187  *pix_left -= saved_run;
188  saved_run = 0;
189  *mode = !*mode;
190  if (newmode != *mode) { //FIXME CHECK
191  *(*runs)++ = 0;
192  if (*runs >= runend) {
193  av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
194  return AVERROR_INVALIDDATA;
195  }
196  *mode = newmode;
197  }
198  return 0;
199 }
200 
202  unsigned int pix_left, int *runs,
203  const int *runend)
204 {
205  int mode = 0;
206  unsigned int run = 0;
207  unsigned int t;
208  for (;;) {
209  t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
210  run += t;
211  if (t < 64) {
212  *runs++ = run;
213  if (runs >= runend) {
214  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
215  return AVERROR_INVALIDDATA;
216  }
217  if (pix_left <= run) {
218  if (pix_left == run)
219  break;
220  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
221  return AVERROR_INVALIDDATA;
222  }
223  pix_left -= run;
224  run = 0;
225  mode = !mode;
226  } else if ((int)t == -1) {
227  if (show_bits(gb, 12) == 15) {
228  int ret;
229  skip_bits(gb, 12);
230  ret = decode_uncompressed(avctx, gb, &pix_left, &runs, runend, &mode);
231  if (ret < 0) {
232  return ret;
233  } else if (ret)
234  break;
235  } else {
236  av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
237  return AVERROR_INVALIDDATA;
238  }
239  }
240  }
241  *runs++ = 0;
242  return 0;
243 }
244 
246  unsigned int width, int *runs,
247  const int *runend, const int *ref)
248 {
249  int mode = 0, saved_run = 0, t;
250  int run_off = *ref++;
251  unsigned int offs = 0, run = 0;
252 
253  while (offs < width) {
254  int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);
255  if (cmode == -1) {
256  av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");
257  return AVERROR_INVALIDDATA;
258  }
259  if (!cmode) { //pass mode
260  if (run_off < width)
261  run_off += *ref++;
262  run = run_off - offs;
263  offs = run_off;
264  if (run_off < width)
265  run_off += *ref++;
266  if (offs > width) {
267  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
268  return AVERROR_INVALIDDATA;
269  }
270  saved_run += run;
271  } else if (cmode == 1) { //horizontal mode
272  int k;
273  for (k = 0; k < 2; k++) {
274  run = 0;
275  for (;;) {
276  t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
277  if (t == -1) {
278  av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
279  return AVERROR_INVALIDDATA;
280  }
281  run += t;
282  if (t < 64)
283  break;
284  }
285  *runs++ = run + saved_run;
286  if (runs >= runend) {
287  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
288  return AVERROR_INVALIDDATA;
289  }
290  saved_run = 0;
291  offs += run;
292  if (offs > width || run > width) {
293  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
294  return AVERROR_INVALIDDATA;
295  }
296  mode = !mode;
297  }
298  } else if (cmode == 9 || cmode == 10) {
299  int xxx = get_bits(gb, 3);
300  if (cmode == 9 && xxx == 7) {
301  int ret;
302  int pix_left = width - offs;
303 
304  if (saved_run) {
305  av_log(avctx, AV_LOG_ERROR, "saved run %d on entering uncompressed mode\n", saved_run);
306  return AVERROR_INVALIDDATA;
307  }
308  ret = decode_uncompressed(avctx, gb, &pix_left, &runs, runend, &mode);
309  offs = width - pix_left;
310  if (ret < 0) {
311  return ret;
312  } else if (ret)
313  break;
314  } else {
315  avpriv_report_missing_feature(avctx, "Special mode %d xxx=%d support", cmode, xxx);
316  return AVERROR_PATCHWELCOME;
317  }
318  } else { //vertical mode
319  run = run_off - offs + (cmode - 5);
320  run_off -= *--ref;
321  offs += run;
322  if (offs > width || run > width) {
323  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
324  return AVERROR_INVALIDDATA;
325  }
326  *runs++ = run + saved_run;
327  if (runs >= runend) {
328  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
329  return AVERROR_INVALIDDATA;
330  }
331  saved_run = 0;
332  mode = !mode;
333  }
334  //sync line pointers
335  while (offs < width && run_off <= offs) {
336  run_off += *ref++;
337  run_off += *ref++;
338  }
339  }
340  *runs++ = saved_run;
341  if (saved_run) {
342  if (runs >= runend) {
343  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
344  return -1;
345  }
346  *runs++ = 0;
347  }
348  return 0;
349 }
350 
351 static void put_line(uint8_t *dst, int size, int width, const int *runs)
352 {
353  PutBitContext pb;
354  int run, mode = ~0, pix_left = width, run_idx = 0;
355 
356  init_put_bits(&pb, dst, size);
357  while (pix_left > 0) {
358  run = runs[run_idx++];
359  mode = ~mode;
360  pix_left -= run;
361  for (; run > 16; run -= 16)
362  put_sbits(&pb, 16, mode);
363  if (run)
364  put_sbits(&pb, run, mode);
365  }
366  flush_put_bits(&pb);
367 }
368 
369 static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
370 {
371  unsigned int state = -1;
372  srcsize -= get_bits_count(gb);
373  while (srcsize-- > 0) {
374  state += state + get_bits1(gb);
375  if ((state & 0xFFF) == 1)
376  return 0;
377  }
378  return -1;
379 }
380 
381 int ff_ccitt_unpack(AVCodecContext *avctx, const uint8_t *src, int srcsize,
382  uint8_t *dst, int height, int stride,
383  enum TiffCompr compr, int opts)
384 {
385  int j;
386  GetBitContext gb;
387  int *runs, *ref = NULL, *runend;
388  int ret;
389  int runsize = avctx->width + 2;
390  int has_eol;
391 
392  runs = av_malloc_array(runsize, sizeof(runs[0]));
393  ref = av_malloc_array(runsize, sizeof(ref[0]));
394  if (!runs || !ref) {
395  ret = AVERROR(ENOMEM);
396  goto fail;
397  }
398  ref[0] = avctx->width;
399  ref[1] = 0;
400  ref[2] = 0;
401  if ((ret = init_get_bits8(&gb, src, srcsize)) < 0)
402  goto fail;
403  has_eol = show_bits(&gb, 12) == 1 || show_bits(&gb, 16) == 1;
404 
405  for (j = 0; j < height; j++) {
406  runend = runs + runsize;
407  if (compr == TIFF_G4) {
408  ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend,
409  ref);
410  if (ret < 0)
411  goto fail;
412  } else {
413  int g3d1 = (compr == TIFF_G3) && !(opts & 1);
414  if (compr != TIFF_CCITT_RLE &&
415  has_eol &&
416  find_group3_syncmarker(&gb, srcsize * 8) < 0)
417  break;
418  if (compr == TIFF_CCITT_RLE || g3d1 || get_bits1(&gb))
419  ret = decode_group3_1d_line(avctx, &gb, avctx->width, runs,
420  runend);
421  else
422  ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs,
423  runend, ref);
424  if (compr == TIFF_CCITT_RLE)
425  align_get_bits(&gb);
426  }
427  if (avctx->err_recognition & AV_EF_EXPLODE && ret < 0)
428  goto fail;
429 
430  if (ret < 0) {
431  put_line(dst, stride, avctx->width, ref);
432  } else {
433  put_line(dst, stride, avctx->width, runs);
434  FFSWAP(int *, runs, ref);
435  }
436  dst += stride;
437  }
438  ret = 0;
439 fail:
440  av_free(runs);
441  av_free(ref);
442  return ret;
443 }
#define CCITT_SYMS
Definition: faxcompr.c:32
#define NULL
Definition: coverity.c:32
static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
Definition: faxcompr.c:369
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb, unsigned int pix_left, int *runs, const int *runend)
Definition: faxcompr.c:201
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:240
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
Definition: vlc.h:75
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Definition: bitstream.c:273
int av_log2(unsigned v)
Definition: intmath.c:26
static void put_line(uint8_t *dst, int size, int width, const int *runs)
Definition: faxcompr.c:351
uint8_t run
Definition: svq3.c:206
#define src
Definition: vp8dsp.c:254
static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb, unsigned int width, int *runs, const int *runend, const int *ref)
Definition: faxcompr.c:245
Definition: tiff.h:121
static const uint8_t ccitt_group3_2d_bits[11]
Definition: faxcompr.c:89
av_cold void ff_ccitt_unpack_init(void)
initialize unpacker code
Definition: faxcompr.c:99
uint8_t
#define av_cold
Definition: attributes.h:82
#define height
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
bitstream reader API header.
ptrdiff_t size
Definition: opengl_enc.c:100
#define av_log(a,...)
static const uint16_t table[]
Definition: prosumer.c:206
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:260
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
static const uint16_t ccitt_syms[CCITT_SYMS]
Definition: faxcompr.c:34
static const uint8_t ccitt_codes_bits[2][CCITT_SYMS]
Definition: faxcompr.c:45
int ff_ccitt_unpack(AVCodecContext *avctx, const uint8_t *src, int srcsize, uint8_t *dst, int height, int stride, enum TiffCompr compr, int opts)
unpack data compressed with CCITT Group 3 1/2-D or Group 4 method
Definition: faxcompr.c:381
#define fail()
Definition: checkasm.h:120
Definition: vlc.h:26
AVDictionary * opts
Definition: movenc.c:50
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:2690
#define width
int width
picture width / height.
Definition: avcodec.h:1738
static int initialized
static int decode_uncompressed(AVCodecContext *avctx, GetBitContext *gb, unsigned int *pix_left, int **runs, const int *runend, int *mode)
Definition: faxcompr.c:125
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: avcodec.h:2701
static VLC ccitt_group3_2d_vlc
Definition: faxcompr.c:97
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
int table_allocated
Definition: vlc.h:29
TiffCompr
list of TIFF, TIFF/EP and DNG compression types
Definition: tiff.h:117
Libavcodec external API header.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
main external API structure.
Definition: avcodec.h:1565
Definition: tiff.h:120
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static const uint8_t ccitt_group3_2d_lens[11]
Definition: faxcompr.c:93
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
GLint GLenum GLboolean GLsizei stride
Definition: opengl_enc.c:104
static VLC ccitt_vlc[2]
Definition: faxcompr.c:97
static const uint8_t ccitt_codes_lens[2][CCITT_SYMS]
Definition: faxcompr.c:69
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:101
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
#define INIT_VLC_USE_NEW_STATIC
Definition: vlc.h:55
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:48
#define av_free(p)
VLC_TYPE(* table)[2]
code, bits
Definition: vlc.h:28
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:693
#define VLC_TYPE
Definition: vlc.h:24
#define av_malloc_array(a, b)
#define FFSWAP(type, a, b)
Definition: common.h:99
#define stride
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
mode
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83
CCITT Fax Group 3 and 4 decompression.
static struct @308 state
bitstream writer API