lagarith.c
Go to the documentation of this file.
1 /*
2  * Lagarith lossless decoder
3  * Copyright (c) 2009 Nathan Caldwell <saintdev (at) gmail.com>
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  * Lagarith lossless decoder
25  * @author Nathan Caldwell
26  */
27 
28 #include "avcodec.h"
29 #include "get_bits.h"
30 #include "mathops.h"
31 #include "dsputil.h"
32 #include "lagarithrac.h"
33 #include "thread.h"
34 
36  FRAME_RAW = 1, /**< uncompressed */
37  FRAME_U_RGB24 = 2, /**< unaligned RGB24 */
38  FRAME_ARITH_YUY2 = 3, /**< arithmetic coded YUY2 */
39  FRAME_ARITH_RGB24 = 4, /**< arithmetic coded RGB24 */
40  FRAME_SOLID_GRAY = 5, /**< solid grayscale color frame */
41  FRAME_SOLID_COLOR = 6, /**< solid non-grayscale color frame */
42  FRAME_OLD_ARITH_RGB = 7, /**< obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0) */
43  FRAME_ARITH_RGBA = 8, /**< arithmetic coded RGBA */
44  FRAME_SOLID_RGBA = 9, /**< solid RGBA color frame */
45  FRAME_ARITH_YV12 = 10, /**< arithmetic coded YV12 */
46  FRAME_REDUCED_RES = 11, /**< reduced resolution YV12 frame */
47 };
48 
49 typedef struct LagarithContext {
52  int zeros; /**< number of consecutive zero bytes encountered */
53  int zeros_rem; /**< number of zero bytes remaining to output */
57 
58 /**
59  * Compute the 52bit mantissa of 1/(double)denom.
60  * This crazy format uses floats in an entropy coder and we have to match x86
61  * rounding exactly, thus ordinary floats aren't portable enough.
62  * @param denom denominator
63  * @return 52bit mantissa
64  * @see softfloat_mul
65  */
66 static uint64_t softfloat_reciprocal(uint32_t denom)
67 {
68  int shift = av_log2(denom - 1) + 1;
69  uint64_t ret = (1ULL << 52) / denom;
70  uint64_t err = (1ULL << 52) - ret * denom;
71  ret <<= shift;
72  err <<= shift;
73  err += denom / 2;
74  return ret + err / denom;
75 }
76 
77 /**
78  * (uint32_t)(x*f), where f has the given mantissa, and exponent 0
79  * Used in combination with softfloat_reciprocal computes x/(double)denom.
80  * @param x 32bit integer factor
81  * @param mantissa mantissa of f with exponent 0
82  * @return 32bit integer value (x*f)
83  * @see softfloat_reciprocal
84  */
85 static uint32_t softfloat_mul(uint32_t x, uint64_t mantissa)
86 {
87  uint64_t l = x * (mantissa & 0xffffffff);
88  uint64_t h = x * (mantissa >> 32);
89  h += l >> 32;
90  l &= 0xffffffff;
91  l += 1 << av_log2(h >> 21);
92  h += l >> 32;
93  return h >> 20;
94 }
95 
96 static uint8_t lag_calc_zero_run(int8_t x)
97 {
98  return (x << 1) ^ (x >> 7);
99 }
100 
101 static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
102 {
103  static const uint8_t series[] = { 1, 2, 3, 5, 8, 13, 21 };
104  int i;
105  int bit = 0;
106  int bits = 0;
107  int prevbit = 0;
108  unsigned val;
109 
110  for (i = 0; i < 7; i++) {
111  if (prevbit && bit)
112  break;
113  prevbit = bit;
114  bit = get_bits1(gb);
115  if (bit && !prevbit)
116  bits += series[i];
117  }
118  bits--;
119  if (bits < 0 || bits > 31) {
120  *value = 0;
121  return -1;
122  } else if (bits == 0) {
123  *value = 0;
124  return 0;
125  }
126 
127  val = get_bits_long(gb, bits);
128  val |= 1 << bits;
129 
130  *value = val - 1;
131 
132  return 0;
133 }
134 
136 {
137  int i, j, scale_factor;
138  unsigned prob, cumulative_target;
139  unsigned cumul_prob = 0;
140  unsigned scaled_cumul_prob = 0;
141 
142  rac->prob[0] = 0;
143  rac->prob[257] = UINT_MAX;
144  /* Read probabilities from bitstream */
145  for (i = 1; i < 257; i++) {
146  if (lag_decode_prob(gb, &rac->prob[i]) < 0) {
147  av_log(rac->avctx, AV_LOG_ERROR, "Invalid probability encountered.\n");
148  return -1;
149  }
150  if ((uint64_t)cumul_prob + rac->prob[i] > UINT_MAX) {
151  av_log(rac->avctx, AV_LOG_ERROR, "Integer overflow encountered in cumulative probability calculation.\n");
152  return -1;
153  }
154  cumul_prob += rac->prob[i];
155  if (!rac->prob[i]) {
156  if (lag_decode_prob(gb, &prob)) {
157  av_log(rac->avctx, AV_LOG_ERROR, "Invalid probability run encountered.\n");
158  return -1;
159  }
160  if (prob > 256 - i)
161  prob = 256 - i;
162  for (j = 0; j < prob; j++)
163  rac->prob[++i] = 0;
164  }
165  }
166 
167  if (!cumul_prob) {
168  av_log(rac->avctx, AV_LOG_ERROR, "All probabilities are 0!\n");
169  return -1;
170  }
171 
172  /* Scale probabilities so cumulative probability is an even power of 2. */
173  scale_factor = av_log2(cumul_prob);
174 
175  if (cumul_prob & (cumul_prob - 1)) {
176  uint64_t mul = softfloat_reciprocal(cumul_prob);
177  for (i = 1; i < 257; i++) {
178  rac->prob[i] = softfloat_mul(rac->prob[i], mul);
179  scaled_cumul_prob += rac->prob[i];
180  }
181 
182  scale_factor++;
183  cumulative_target = 1 << scale_factor;
184 
185  if (scaled_cumul_prob > cumulative_target) {
186  av_log(rac->avctx, AV_LOG_ERROR,
187  "Scaled probabilities are larger than target!\n");
188  return -1;
189  }
190 
191  scaled_cumul_prob = cumulative_target - scaled_cumul_prob;
192 
193  for (i = 1; scaled_cumul_prob; i = (i & 0x7f) + 1) {
194  if (rac->prob[i]) {
195  rac->prob[i]++;
196  scaled_cumul_prob--;
197  }
198  /* Comment from reference source:
199  * if (b & 0x80 == 0) { // order of operations is 'wrong'; it has been left this way
200  * // since the compression change is negligible and fixing it
201  * // breaks backwards compatibility
202  * b =- (signed int)b;
203  * b &= 0xFF;
204  * } else {
205  * b++;
206  * b &= 0x7f;
207  * }
208  */
209  }
210  }
211 
212  rac->scale = scale_factor;
213 
214  /* Fill probability array with cumulative probability for each symbol. */
215  for (i = 1; i < 257; i++)
216  rac->prob[i] += rac->prob[i - 1];
217 
218  return 0;
219 }
220 
222  uint8_t *diff, int w, int *left,
223  int *left_top)
224 {
225  /* This is almost identical to add_hfyu_median_prediction in dsputil.h.
226  * However the &0xFF on the gradient predictor yealds incorrect output
227  * for lagarith.
228  */
229  int i;
230  uint8_t l, lt;
231 
232  l = *left;
233  lt = *left_top;
234 
235  for (i = 0; i < w; i++) {
236  l = mid_pred(l, src1[i], l + src1[i] - lt) + diff[i];
237  lt = src1[i];
238  dst[i] = l;
239  }
240 
241  *left = l;
242  *left_top = lt;
243 }
244 
246  int width, int stride, int line)
247 {
248  int L, TL;
249 
250  if (!line) {
251  /* Left prediction only for first line */
252  L = l->dsp.add_hfyu_left_prediction(buf, buf,
253  width, 0);
254  } else {
255  /* Left pixel is actually prev_row[width] */
256  L = buf[width - stride - 1];
257 
258  if (line == 1) {
259  /* Second line, left predict first pixel, the rest of the line is median predicted
260  * NOTE: In the case of RGB this pixel is top predicted */
261  TL = l->avctx->pix_fmt == AV_PIX_FMT_YUV420P ? buf[-stride] : L;
262  } else {
263  /* Top left is 2 rows back, last pixel */
264  TL = buf[width - (2 * stride) - 1];
265  }
266 
267  add_lag_median_prediction(buf, buf - stride, buf,
268  width, &L, &TL);
269  }
270 }
271 
273  int width, int stride, int line,
274  int is_luma)
275 {
276  int L, TL;
277 
278  if (!line) {
279  L= buf[0];
280  if (is_luma)
281  buf[0] = 0;
282  l->dsp.add_hfyu_left_prediction(buf, buf, width, 0);
283  if (is_luma)
284  buf[0] = L;
285  return;
286  }
287  if (line == 1) {
288  const int HEAD = is_luma ? 4 : 2;
289  int i;
290 
291  L = buf[width - stride - 1];
292  TL = buf[HEAD - stride - 1];
293  for (i = 0; i < HEAD; i++) {
294  L += buf[i];
295  buf[i] = L;
296  }
297  for (; i<width; i++) {
298  L = mid_pred(L&0xFF, buf[i-stride], (L + buf[i-stride] - TL)&0xFF) + buf[i];
299  TL = buf[i-stride];
300  buf[i]= L;
301  }
302  } else {
303  TL = buf[width - (2 * stride) - 1];
304  L = buf[width - stride - 1];
305  l->dsp.add_hfyu_median_prediction(buf, buf - stride, buf, width,
306  &L, &TL);
307  }
308 }
309 
311  uint8_t *dst, int width, int stride,
312  int esc_count)
313 {
314  int i = 0;
315  int ret = 0;
316 
317  if (!esc_count)
318  esc_count = -1;
319 
320  /* Output any zeros remaining from the previous run */
321 handle_zeros:
322  if (l->zeros_rem) {
323  int count = FFMIN(l->zeros_rem, width - i);
324  memset(dst + i, 0, count);
325  i += count;
326  l->zeros_rem -= count;
327  }
328 
329  while (i < width) {
330  dst[i] = lag_get_rac(rac);
331  ret++;
332 
333  if (dst[i])
334  l->zeros = 0;
335  else
336  l->zeros++;
337 
338  i++;
339  if (l->zeros == esc_count) {
340  int index = lag_get_rac(rac);
341  ret++;
342 
343  l->zeros = 0;
344 
345  l->zeros_rem = lag_calc_zero_run(index);
346  goto handle_zeros;
347  }
348  }
349  return ret;
350 }
351 
353  const uint8_t *src, const uint8_t *src_end,
354  int width, int esc_count)
355 {
356  int i = 0;
357  int count;
358  uint8_t zero_run = 0;
359  const uint8_t *src_start = src;
360  uint8_t mask1 = -(esc_count < 2);
361  uint8_t mask2 = -(esc_count < 3);
362  uint8_t *end = dst + (width - 2);
363 
364 output_zeros:
365  if (l->zeros_rem) {
366  count = FFMIN(l->zeros_rem, width - i);
367  if (end - dst < count) {
368  av_log(l->avctx, AV_LOG_ERROR, "Too many zeros remaining.\n");
369  return AVERROR_INVALIDDATA;
370  }
371 
372  memset(dst, 0, count);
373  l->zeros_rem -= count;
374  dst += count;
375  }
376 
377  while (dst < end) {
378  i = 0;
379  while (!zero_run && dst + i < end) {
380  i++;
381  if (i+2 >= src_end - src)
382  return AVERROR_INVALIDDATA;
383  zero_run =
384  !(src[i] | (src[i + 1] & mask1) | (src[i + 2] & mask2));
385  }
386  if (zero_run) {
387  zero_run = 0;
388  i += esc_count;
389  memcpy(dst, src, i);
390  dst += i;
391  l->zeros_rem = lag_calc_zero_run(src[i]);
392 
393  src += i + 1;
394  goto output_zeros;
395  } else {
396  memcpy(dst, src, i);
397  src += i;
398  dst += i;
399  }
400  }
401  return src - src_start;
402 }
403 
404 
405 
407  int width, int height, int stride,
408  const uint8_t *src, int src_size)
409 {
410  int i = 0;
411  int read = 0;
412  uint32_t length;
413  uint32_t offset = 1;
414  int esc_count;
415  GetBitContext gb;
416  lag_rac rac;
417  const uint8_t *src_end = src + src_size;
418 
419  rac.avctx = l->avctx;
420  l->zeros = 0;
421 
422  if(src_size < 2)
423  return AVERROR_INVALIDDATA;
424 
425  esc_count = src[0];
426  if (esc_count < 4) {
427  length = width * height;
428  if(src_size < 5)
429  return AVERROR_INVALIDDATA;
430  if (esc_count && AV_RL32(src + 1) < length) {
431  length = AV_RL32(src + 1);
432  offset += 4;
433  }
434 
435  init_get_bits(&gb, src + offset, src_size * 8);
436 
437  if (lag_read_prob_header(&rac, &gb) < 0)
438  return -1;
439 
440  ff_lag_rac_init(&rac, &gb, length - stride);
441 
442  for (i = 0; i < height; i++)
443  read += lag_decode_line(l, &rac, dst + (i * stride), width,
444  stride, esc_count);
445 
446  if (read > length)
448  "Output more bytes than length (%d of %d)\n", read,
449  length);
450  } else if (esc_count < 8) {
451  esc_count -= 4;
452  if (esc_count > 0) {
453  /* Zero run coding only, no range coding. */
454  for (i = 0; i < height; i++) {
455  int res = lag_decode_zero_run_line(l, dst + (i * stride), src,
456  src_end, width, esc_count);
457  if (res < 0)
458  return res;
459  src += res;
460  }
461  } else {
462  if (src_size < width * height)
463  return AVERROR_INVALIDDATA; // buffer not big enough
464  /* Plane is stored uncompressed */
465  for (i = 0; i < height; i++) {
466  memcpy(dst + (i * stride), src, width);
467  src += width;
468  }
469  }
470  } else if (esc_count == 0xff) {
471  /* Plane is a solid run of given value */
472  for (i = 0; i < height; i++)
473  memset(dst + i * stride, src[1], width);
474  /* Do not apply prediction.
475  Note: memset to 0 above, setting first value to src[1]
476  and applying prediction gives the same result. */
477  return 0;
478  } else {
480  "Invalid zero run escape code! (%#x)\n", esc_count);
481  return -1;
482  }
483 
484  if (l->avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
485  for (i = 0; i < height; i++) {
486  lag_pred_line(l, dst, width, stride, i);
487  dst += stride;
488  }
489  } else {
490  for (i = 0; i < height; i++) {
491  lag_pred_line_yuy2(l, dst, width, stride, i,
492  width == l->avctx->width);
493  dst += stride;
494  }
495  }
496 
497  return 0;
498 }
499 
500 /**
501  * Decode a frame.
502  * @param avctx codec context
503  * @param data output AVFrame
504  * @param data_size size of output data or 0 if no picture is returned
505  * @param avpkt input packet
506  * @return number of consumed bytes on success or negative if decode fails
507  */
509  void *data, int *got_frame, AVPacket *avpkt)
510 {
511  const uint8_t *buf = avpkt->data;
512  unsigned int buf_size = avpkt->size;
513  LagarithContext *l = avctx->priv_data;
514  ThreadFrame frame = { .f = data };
515  AVFrame *const p = data;
516  uint8_t frametype = 0;
517  uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9;
518  uint32_t offs[4];
519  uint8_t *srcs[4], *dst;
520  int i, j, planes = 3;
521  int ret;
522 
523  p->key_frame = 1;
524 
525  frametype = buf[0];
526 
527  offset_gu = AV_RL32(buf + 1);
528  offset_bv = AV_RL32(buf + 5);
529 
530  switch (frametype) {
531  case FRAME_SOLID_RGBA:
532  avctx->pix_fmt = AV_PIX_FMT_RGB32;
533  case FRAME_SOLID_GRAY:
534  if (frametype == FRAME_SOLID_GRAY)
535  if (avctx->bits_per_coded_sample == 24) {
536  avctx->pix_fmt = AV_PIX_FMT_RGB24;
537  } else {
538  avctx->pix_fmt = AV_PIX_FMT_0RGB32;
539  planes = 4;
540  }
541 
542  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
543  return ret;
544 
545  dst = p->data[0];
546  if (frametype == FRAME_SOLID_RGBA) {
547  for (j = 0; j < avctx->height; j++) {
548  for (i = 0; i < avctx->width; i++)
549  AV_WN32(dst + i * 4, offset_gu);
550  dst += p->linesize[0];
551  }
552  } else {
553  for (j = 0; j < avctx->height; j++) {
554  memset(dst, buf[1], avctx->width * planes);
555  dst += p->linesize[0];
556  }
557  }
558  break;
559  case FRAME_ARITH_RGBA:
560  avctx->pix_fmt = AV_PIX_FMT_RGB32;
561  planes = 4;
562  offset_ry += 4;
563  offs[3] = AV_RL32(buf + 9);
564  case FRAME_ARITH_RGB24:
565  case FRAME_U_RGB24:
566  if (frametype == FRAME_ARITH_RGB24 || frametype == FRAME_U_RGB24)
567  avctx->pix_fmt = AV_PIX_FMT_RGB24;
568 
569  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
570  return ret;
571 
572  offs[0] = offset_bv;
573  offs[1] = offset_gu;
574  offs[2] = offset_ry;
575 
576  if (!l->rgb_planes) {
577  l->rgb_stride = FFALIGN(avctx->width, 16);
578  l->rgb_planes = av_malloc(l->rgb_stride * avctx->height * 4 + 16);
579  if (!l->rgb_planes) {
580  av_log(avctx, AV_LOG_ERROR, "cannot allocate temporary buffer\n");
581  return AVERROR(ENOMEM);
582  }
583  }
584  for (i = 0; i < planes; i++)
585  srcs[i] = l->rgb_planes + (i + 1) * l->rgb_stride * avctx->height - l->rgb_stride;
586  for (i = 0; i < planes; i++)
587  if (buf_size <= offs[i]) {
588  av_log(avctx, AV_LOG_ERROR,
589  "Invalid frame offsets\n");
590  return AVERROR_INVALIDDATA;
591  }
592 
593  for (i = 0; i < planes; i++)
594  lag_decode_arith_plane(l, srcs[i],
595  avctx->width, avctx->height,
596  -l->rgb_stride, buf + offs[i],
597  buf_size - offs[i]);
598  dst = p->data[0];
599  for (i = 0; i < planes; i++)
600  srcs[i] = l->rgb_planes + i * l->rgb_stride * avctx->height;
601  for (j = 0; j < avctx->height; j++) {
602  for (i = 0; i < avctx->width; i++) {
603  uint8_t r, g, b, a;
604  r = srcs[0][i];
605  g = srcs[1][i];
606  b = srcs[2][i];
607  r += g;
608  b += g;
609  if (frametype == FRAME_ARITH_RGBA) {
610  a = srcs[3][i];
611  AV_WN32(dst + i * 4, MKBETAG(a, r, g, b));
612  } else {
613  dst[i * 3 + 0] = r;
614  dst[i * 3 + 1] = g;
615  dst[i * 3 + 2] = b;
616  }
617  }
618  dst += p->linesize[0];
619  for (i = 0; i < planes; i++)
620  srcs[i] += l->rgb_stride;
621  }
622  break;
623  case FRAME_ARITH_YUY2:
624  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
625 
626  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
627  return ret;
628 
629  if (offset_ry >= buf_size ||
630  offset_gu >= buf_size ||
631  offset_bv >= buf_size) {
632  av_log(avctx, AV_LOG_ERROR,
633  "Invalid frame offsets\n");
634  return AVERROR_INVALIDDATA;
635  }
636 
637  lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
638  p->linesize[0], buf + offset_ry,
639  buf_size - offset_ry);
640  lag_decode_arith_plane(l, p->data[1], avctx->width / 2,
641  avctx->height, p->linesize[1],
642  buf + offset_gu, buf_size - offset_gu);
643  lag_decode_arith_plane(l, p->data[2], avctx->width / 2,
644  avctx->height, p->linesize[2],
645  buf + offset_bv, buf_size - offset_bv);
646  break;
647  case FRAME_ARITH_YV12:
648  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
649 
650  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
651  return ret;
652  if (buf_size <= offset_ry || buf_size <= offset_gu || buf_size <= offset_bv) {
653  return AVERROR_INVALIDDATA;
654  }
655 
656  if (offset_ry >= buf_size ||
657  offset_gu >= buf_size ||
658  offset_bv >= buf_size) {
659  av_log(avctx, AV_LOG_ERROR,
660  "Invalid frame offsets\n");
661  return AVERROR_INVALIDDATA;
662  }
663 
664  lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
665  p->linesize[0], buf + offset_ry,
666  buf_size - offset_ry);
667  lag_decode_arith_plane(l, p->data[2], avctx->width / 2,
668  avctx->height / 2, p->linesize[2],
669  buf + offset_gu, buf_size - offset_gu);
670  lag_decode_arith_plane(l, p->data[1], avctx->width / 2,
671  avctx->height / 2, p->linesize[1],
672  buf + offset_bv, buf_size - offset_bv);
673  break;
674  default:
675  av_log(avctx, AV_LOG_ERROR,
676  "Unsupported Lagarith frame type: %#x\n", frametype);
677  return AVERROR_PATCHWELCOME;
678  }
679 
680  *got_frame = 1;
681 
682  return buf_size;
683 }
684 
686 {
687  LagarithContext *l = avctx->priv_data;
688  l->avctx = avctx;
689 
690  ff_dsputil_init(&l->dsp, avctx);
691 
692  return 0;
693 }
694 
696 {
697  LagarithContext *l = avctx->priv_data;
698 
699  av_freep(&l->rgb_planes);
700 
701  return 0;
702 }
703 
705  .name = "lagarith",
706  .type = AVMEDIA_TYPE_VIDEO,
707  .id = AV_CODEC_ID_LAGARITH,
708  .priv_data_size = sizeof(LagarithContext),
712  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
713  .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"),
714 };
AVCodecContext * avctx
Definition: lagarithrac.h:40
static uint8_t lag_get_rac(lag_rac *l)
Decode a single byte from the compressed plane described by *l.
Definition: lagarithrac.h:73
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static int shift(int a, int b)
Definition: sonic.c:86
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
void ff_lag_rac_init(lag_rac *l, GetBitContext *gb, int length)
Definition: lagarithrac.c:33
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:70
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int stride
Definition: mace.c:144
static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, int width, int height, int stride, const uint8_t *src, int src_size)
Definition: lagarith.c:406
DSPContext dsp
Definition: lagarith.c:51
output residual component w
int zeros
number of consecutive zero bytes encountered
Definition: lagarith.c:52
#define FFALIGN(x, a)
Definition: common.h:63
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
AVCodec ff_lagarith_decoder
Definition: lagarith.c:704
static int lag_decode_zero_run_line(LagarithContext *l, uint8_t *dst, const uint8_t *src, const uint8_t *src_end, int width, int esc_count)
Definition: lagarith.c:352
Lagarith range decoder.
uint8_t bits
Definition: crc.c:216
uint8_t
#define av_cold
Definition: attributes.h:78
solid grayscale color frame
Definition: lagarith.c:40
static void lag_pred_line(LagarithContext *l, uint8_t *buf, int width, int stride, int line)
Definition: lagarith.c:245
#define b
Definition: input.c:42
end end
int zeros_rem
number of zero bytes remaining to output
Definition: lagarith.c:53
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
unsigned scale
Number of bits of precision in range.
Definition: lagarithrac.h:43
uint8_t * data
bitstream reader API header.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
frame
Definition: stft.m:14
Discrete Time axis x
struct LagarithContext LagarithContext
uncompressed
Definition: lagarith.c:36
LagarithFrameType
Definition: lagarith.c:35
arithmetic coded RGB24
Definition: lagarith.c:39
void(* add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top)
Definition: dsputil.h:204
Multithreading support functions.
static void add_lag_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top)
Definition: lagarith.c:221
#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
AVCodecContext * avctx
Definition: lagarith.c:50
Definition: graph2dot.c:48
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
external API header
static av_cold int lag_decode_init(AVCodecContext *avctx)
Definition: lagarith.c:685
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
arithmetic coded YV12
Definition: lagarith.c:45
FFT buffer for g
Definition: stft_peak.m:17
static uint64_t softfloat_reciprocal(uint32_t denom)
Compute the 52bit mantissa of 1/(double)denom.
Definition: lagarith.c:66
obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0) ...
Definition: lagarith.c:42
#define FFMIN(a, b)
Definition: common.h:58
ret
Definition: avfilter.c:821
int width
picture width / height.
arithmetic coded YUY2
Definition: lagarith.c:38
static int lag_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Decode a frame.
Definition: lagarith.c:508
#define AV_RL32
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
Definition: lagarith.c:101
#define L(x)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
static int width
Definition: tests/utils.c:158
static int lag_decode_line(LagarithContext *l, lag_rac *rac, uint8_t *dst, int width, int stride, int esc_count)
Definition: lagarith.c:310
AVS_Value src
Definition: avisynth_c.h:523
uint32_t prob[258]
Table of cumulative probability for each symbol.
Definition: lagarithrac.h:50
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
static uint32_t softfloat_mul(uint32_t x, uint64_t mantissa)
(uint32_t)(x*f), where f has the given mantissa, and exponent 0 Used in combination with softfloat_re...
Definition: lagarith.c:85
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
double value
Definition: eval.c:82
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
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
#define mid_pred
Definition: mathops.h:94
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread.c:1066
static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
Definition: lagarith.c:135
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:306
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
uint8_t * rgb_planes
Definition: lagarith.c:54
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
static av_cold int lag_decode_end(AVCodecContext *avctx)
Definition: lagarith.c:695
#define CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define AV_WN32(p, v)
Definition: intreadwrite.h:368
int(* add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left)
Definition: dsputil.h:205
solid non-grayscale color frame
Definition: lagarith.c:41
DSP utils.
#define MKBETAG(a, b, c, d)
Definition: common.h:283
static uint8_t lag_calc_zero_run(int8_t x)
Definition: lagarith.c:96
static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, int width, int stride, int line, int is_luma)
Definition: lagarith.c:272
#define av_log2
Definition: intmath.h:89
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
solid RGBA color frame
Definition: lagarith.c:44
arithmetic coded RGBA
Definition: lagarith.c:43
reduced resolution YV12 frame
Definition: lagarith.c:46
unaligned RGB24
Definition: lagarith.c:37
void INT64 INT64 count
Definition: avisynth_c.h:594
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
const char int length
Definition: avisynth_c.h:668
This structure stores compressed data.
for(j=16;j >0;--j)
DSPContext.
Definition: dsputil.h:127
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:263