FFmpeg
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 <inttypes.h>
29 
30 #include "libavutil/attributes.h"
31 #include "libavutil/thread.h"
32 
33 #include "avcodec.h"
34 #include "codec_internal.h"
35 #include "get_bits.h"
36 #include "mathops.h"
37 #include "lagarithrac.h"
38 #include "lossless_videodsp.h"
39 #include "thread.h"
40 
41 #define VLC_BITS 7
42 
44  FRAME_RAW = 1, /**< uncompressed */
45  FRAME_U_RGB24 = 2, /**< unaligned RGB24 */
46  FRAME_ARITH_YUY2 = 3, /**< arithmetic coded YUY2 */
47  FRAME_ARITH_RGB24 = 4, /**< arithmetic coded RGB24 */
48  FRAME_SOLID_GRAY = 5, /**< solid grayscale color frame */
49  FRAME_SOLID_COLOR = 6, /**< solid non-grayscale color frame */
50  FRAME_OLD_ARITH_RGB = 7, /**< obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0) */
51  FRAME_ARITH_RGBA = 8, /**< arithmetic coded RGBA */
52  FRAME_SOLID_RGBA = 9, /**< solid RGBA color frame */
53  FRAME_ARITH_YV12 = 10, /**< arithmetic coded YV12 */
54  FRAME_REDUCED_RES = 11, /**< reduced resolution YV12 frame */
55 };
56 
57 typedef struct LagarithContext {
60  int zeros; /**< number of consecutive zero bytes encountered */
61  int zeros_rem; /**< number of zero bytes remaining to output */
63 
64 static VLCElem lag_tab[1 << VLC_BITS];
65 
66 static const uint8_t lag_bits[] = {
67  7, 7, 2, 7, 3, 4, 5, 6, 7, 7, 7, 7, 7, 6, 7, 4, 5, 7, 7, 7, 7,
68  5, 6, 7, 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7,
69  7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
70 };
71 
72 static const uint8_t lag_codes[] = {
73  0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05,
74  0x08, 0x09, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x10, 0x11, 0x12, 0x13,
75  0x13, 0x13, 0x14, 0x15, 0x20, 0x21, 0x22, 0x23, 0x23, 0x24, 0x25,
76  0x28, 0x29, 0x2A, 0x2B, 0x2B, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
77  0x48, 0x49, 0x4A, 0x4B, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
78 };
79 
80 static const uint8_t lag_symbols[] = {
81  20, 12, 0, 12, 1, 2, 4, 7, 7, 28, 4, 25, 17,
82  10, 17, 3, 6, 2, 23, 15, 15, 5, 9, 10, 31, 1, 22,
83  14, 14, 8, 9, 30, 6, 27, 19, 11, 19, 0, 21, 13, 13,
84  8, 29, 5, 26, 18, 18, 3, 24, 16, 16, 11, 32,
85 };
86 
87 static av_cold void lag_init_static_data(void)
88 {
90  lag_bits, 1, 1, lag_codes, 1, 1, lag_symbols, 1, 1, 0);
91 }
92 
93 /**
94  * Compute the 52-bit mantissa of 1/(double)denom.
95  * This crazy format uses floats in an entropy coder and we have to match x86
96  * rounding exactly, thus ordinary floats aren't portable enough.
97  * @param denom denominator
98  * @return 52-bit mantissa
99  * @see softfloat_mul
100  */
101 static uint64_t softfloat_reciprocal(uint32_t denom)
102 {
103  int shift = av_log2(denom - 1) + 1;
104  uint64_t ret = (1ULL << 52) / denom;
105  uint64_t err = (1ULL << 52) - ret * denom;
106  ret <<= shift;
107  err <<= shift;
108  err += denom / 2;
109  return ret + err / denom;
110 }
111 
112 /**
113  * (uint32_t)(x*f), where f has the given mantissa, and exponent 0
114  * Used in combination with softfloat_reciprocal computes x/(double)denom.
115  * @param x 32-bit integer factor
116  * @param mantissa mantissa of f with exponent 0
117  * @return 32-bit integer value (x*f)
118  * @see softfloat_reciprocal
119  */
120 static uint32_t softfloat_mul(uint32_t x, uint64_t mantissa)
121 {
122  uint64_t l = x * (mantissa & 0xffffffff);
123  uint64_t h = x * (mantissa >> 32);
124  h += l >> 32;
125  l &= 0xffffffff;
126  l += 1LL << av_log2(h >> 21);
127  h += l >> 32;
128  return h >> 20;
129 }
130 
131 static uint8_t lag_calc_zero_run(int8_t x)
132 {
133  return (x * 2) ^ (x >> 7);
134 }
135 
136 static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
137 {
138  unsigned val, bits;
139 
140  bits = get_vlc2(gb, lag_tab, VLC_BITS, 1);
141  if (bits > 31) {
142  *value = 0;
143  return AVERROR_INVALIDDATA;
144  } else if (bits == 0) {
145  *value = 0;
146  return 0;
147  }
148 
149  val = get_bits_long(gb, bits);
150  val |= 1U << bits;
151 
152  *value = val - 1;
153 
154  return 0;
155 }
156 
158 {
159  int i, j, scale_factor;
160  unsigned prob, cumulative_target;
161  unsigned cumul_prob = 0;
162  unsigned scaled_cumul_prob = 0;
163  int nnz = 0;
164 
165  rac->prob[0] = 0;
166  rac->prob[257] = UINT_MAX;
167  /* Read probabilities from bitstream */
168  for (i = 1; i < 257; i++) {
169  if (lag_decode_prob(gb, &rac->prob[i]) < 0) {
170  av_log(rac->logctx, AV_LOG_ERROR, "Invalid probability encountered.\n");
171  return AVERROR_INVALIDDATA;
172  }
173  if ((uint64_t)cumul_prob + rac->prob[i] > UINT_MAX) {
174  av_log(rac->logctx, AV_LOG_ERROR, "Integer overflow encountered in cumulative probability calculation.\n");
175  return AVERROR_INVALIDDATA;
176  }
177  cumul_prob += rac->prob[i];
178  if (!rac->prob[i]) {
179  if (lag_decode_prob(gb, &prob)) {
180  av_log(rac->logctx, AV_LOG_ERROR, "Invalid probability run encountered.\n");
181  return AVERROR_INVALIDDATA;
182  }
183  if (prob > 256 - i)
184  prob = 256 - i;
185  for (j = 0; j < prob; j++)
186  rac->prob[++i] = 0;
187  }else {
188  nnz++;
189  }
190  }
191 
192  if (!cumul_prob) {
193  av_log(rac->logctx, AV_LOG_ERROR, "All probabilities are 0!\n");
194  return AVERROR_INVALIDDATA;
195  }
196 
197  if (nnz == 1 && (show_bits_long(gb, 32) & 0xFFFFFF)) {
198  return AVERROR_INVALIDDATA;
199  }
200 
201  /* Scale probabilities so cumulative probability is an even power of 2. */
202  scale_factor = av_log2(cumul_prob);
203 
204  if (cumul_prob & (cumul_prob - 1)) {
205  uint64_t mul = softfloat_reciprocal(cumul_prob);
206  for (i = 1; i <= 128; i++) {
207  rac->prob[i] = softfloat_mul(rac->prob[i], mul);
208  scaled_cumul_prob += rac->prob[i];
209  }
210  if (scaled_cumul_prob <= 0) {
211  av_log(rac->logctx, AV_LOG_ERROR, "Scaled probabilities invalid\n");
212  return AVERROR_INVALIDDATA;
213  }
214  for (; i < 257; i++) {
215  rac->prob[i] = softfloat_mul(rac->prob[i], mul);
216  scaled_cumul_prob += rac->prob[i];
217  }
218 
219  scale_factor++;
220  if (scale_factor >= 32U)
221  return AVERROR_INVALIDDATA;
222  cumulative_target = 1U << scale_factor;
223 
224  if (scaled_cumul_prob > cumulative_target) {
225  av_log(rac->logctx, AV_LOG_ERROR,
226  "Scaled probabilities are larger than target!\n");
227  return AVERROR_INVALIDDATA;
228  }
229 
230  scaled_cumul_prob = cumulative_target - scaled_cumul_prob;
231 
232  for (i = 1; scaled_cumul_prob; i = (i & 0x7f) + 1) {
233  if (rac->prob[i]) {
234  rac->prob[i]++;
235  scaled_cumul_prob--;
236  }
237  /* Comment from reference source:
238  * if (b & 0x80 == 0) { // order of operations is 'wrong'; it has been left this way
239  * // since the compression change is negligible and fixing it
240  * // breaks backwards compatibility
241  * b =- (signed int)b;
242  * b &= 0xFF;
243  * } else {
244  * b++;
245  * b &= 0x7f;
246  * }
247  */
248  }
249  }
250 
251  if (scale_factor > 23)
252  return AVERROR_INVALIDDATA;
253 
254  rac->scale = scale_factor;
255 
256  /* Fill probability array with cumulative probability for each symbol. */
257  for (i = 1; i < 257; i++)
258  rac->prob[i] += rac->prob[i - 1];
259 
260  return 0;
261 }
262 
263 static void add_lag_median_prediction(uint8_t *dst, uint8_t *src1,
264  uint8_t *diff, int w, int *left,
265  int *left_top)
266 {
267  /* This is almost identical to add_hfyu_median_pred in huffyuvdsp.h.
268  * However the &0xFF on the gradient predictor yields incorrect output
269  * for lagarith.
270  */
271  int i;
272  uint8_t l, lt;
273 
274  l = *left;
275  lt = *left_top;
276 
277  for (i = 0; i < w; i++) {
278  l = mid_pred(l, src1[i], l + src1[i] - lt) + diff[i];
279  lt = src1[i];
280  dst[i] = l;
281  }
282 
283  *left = l;
284  *left_top = lt;
285 }
286 
287 static void lag_pred_line(LagarithContext *l, uint8_t *buf,
288  int width, int stride, int line)
289 {
290  int L, TL;
291 
292  if (!line) {
293  /* Left prediction only for first line */
294  L = l->llviddsp.add_left_pred(buf, buf, width, 0);
295  } else {
296  /* Left pixel is actually prev_row[width] */
297  L = buf[width - stride - 1];
298 
299  if (line == 1) {
300  /* Second line, left predict first pixel, the rest of the line is median predicted
301  * NOTE: In the case of RGB this pixel is top predicted */
302  TL = l->avctx->pix_fmt == AV_PIX_FMT_YUV420P ? buf[-stride] : L;
303  } else {
304  /* Top left is 2 rows back, last pixel */
305  TL = buf[width - (2 * stride) - 1];
306  }
307 
308  add_lag_median_prediction(buf, buf - stride, buf,
309  width, &L, &TL);
310  }
311 }
312 
313 static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf,
314  int width, int stride, int line,
315  int is_luma)
316 {
317  int L, TL;
318 
319  if (!line) {
320  L= buf[0];
321  if (is_luma)
322  buf[0] = 0;
323  l->llviddsp.add_left_pred(buf, buf, width, 0);
324  if (is_luma)
325  buf[0] = L;
326  return;
327  }
328  if (line == 1) {
329  const int HEAD = is_luma ? 4 : 2;
330  int i;
331 
332  L = buf[width - stride - 1];
333  TL = buf[HEAD - stride - 1];
334  for (i = 0; i < HEAD; i++) {
335  L += buf[i];
336  buf[i] = L;
337  }
338  for (; i < width; i++) {
339  L = mid_pred(L & 0xFF, buf[i - stride], (L + buf[i - stride] - TL) & 0xFF) + buf[i];
340  TL = buf[i - stride];
341  buf[i] = L;
342  }
343  } else {
344  TL = buf[width - (2 * stride) - 1];
345  L = buf[width - stride - 1];
346  l->llviddsp.add_median_pred(buf, buf - stride, buf, width, &L, &TL);
347  }
348 }
349 
351  uint8_t *dst, int width, int stride,
352  int esc_count)
353 {
354  int i = 0;
355  int ret = 0;
356 
357  if (!esc_count)
358  esc_count = -1;
359 
360  /* Output any zeros remaining from the previous run */
361 handle_zeros:
362  if (l->zeros_rem) {
363  int count = FFMIN(l->zeros_rem, width - i);
364  memset(dst + i, 0, count);
365  i += count;
366  l->zeros_rem -= count;
367  }
368 
369  while (i < width) {
370  dst[i] = lag_get_rac(rac);
371  ret++;
372 
373  if (dst[i])
374  l->zeros = 0;
375  else
376  l->zeros++;
377 
378  i++;
379  if (l->zeros == esc_count) {
380  int index = lag_get_rac(rac);
381  ret++;
382 
383  l->zeros = 0;
384 
386  goto handle_zeros;
387  }
388  }
389  return ret;
390 }
391 
393  const uint8_t *src, const uint8_t *src_end,
394  int width, int esc_count)
395 {
396  int i = 0;
397  int count;
398  uint8_t zero_run = 0;
399  const uint8_t *src_start = src;
400  uint8_t mask1 = -(esc_count < 2);
401  uint8_t mask2 = -(esc_count < 3);
402  uint8_t *end = dst + (width - 2);
403 
404  avpriv_request_sample(l->avctx, "zero_run_line");
405 
406  memset(dst, 0, width);
407 
408 output_zeros:
409  if (l->zeros_rem) {
410  count = FFMIN(l->zeros_rem, width - i);
411  if (end - dst < count) {
412  av_log(l->avctx, AV_LOG_ERROR, "Too many zeros remaining.\n");
413  return AVERROR_INVALIDDATA;
414  }
415 
416  memset(dst, 0, count);
417  l->zeros_rem -= count;
418  dst += count;
419  }
420 
421  while (dst < end) {
422  i = 0;
423  while (!zero_run && dst + i < end) {
424  i++;
425  if (i+2 >= src_end - src)
426  return AVERROR_INVALIDDATA;
427  zero_run =
428  !(src[i] | (src[i + 1] & mask1) | (src[i + 2] & mask2));
429  }
430  if (zero_run) {
431  zero_run = 0;
432  i += esc_count;
433  if (i > end - dst ||
434  i >= src_end - src)
435  return AVERROR_INVALIDDATA;
436  memcpy(dst, src, i);
437  dst += i;
439 
440  src += i + 1;
441  goto output_zeros;
442  } else {
443  memcpy(dst, src, i);
444  src += i;
445  dst += i;
446  }
447  }
448  return src - src_start;
449 }
450 
451 
452 
454  int width, int height, int stride,
455  const uint8_t *src, int src_size)
456 {
457  int i = 0;
458  int read = 0;
459  uint32_t length;
460  uint32_t offset = 1;
461  int esc_count;
462  GetBitContext gb;
463  lag_rac rac;
464  const uint8_t *src_end = src + src_size;
465  int ret;
466 
467  rac.logctx = l->avctx;
468  l->zeros = 0;
469 
470  if(src_size < 2)
471  return AVERROR_INVALIDDATA;
472 
473  esc_count = src[0];
474  if (esc_count < 4) {
475  length = width * height;
476  if(src_size < 5)
477  return AVERROR_INVALIDDATA;
478  if (esc_count && AV_RL32(src + 1) < length) {
479  length = AV_RL32(src + 1);
480  offset += 4;
481  }
482 
483  if ((ret = init_get_bits8(&gb, src + offset, src_size - offset)) < 0)
484  return ret;
485 
486  if ((ret = lag_read_prob_header(&rac, &gb)) < 0)
487  return ret;
488 
489  ff_lag_rac_init(&rac, &gb, length - stride);
490  for (i = 0; i < height; i++) {
491  if (rac.overread > MAX_OVERREAD)
492  return AVERROR_INVALIDDATA;
493  read += lag_decode_line(l, &rac, dst + (i * stride), width,
494  stride, esc_count);
495  }
496 
497  if (read > length)
499  "Output more bytes than length (%d of %"PRIu32")\n", read,
500  length);
501  } else if (esc_count < 8) {
502  esc_count -= 4;
503  src ++;
504  src_size --;
505  if (esc_count > 0) {
506  /* Zero run coding only, no range coding. */
507  for (i = 0; i < height; i++) {
508  int res = lag_decode_zero_run_line(l, dst + (i * stride), src,
509  src_end, width, esc_count);
510  if (res < 0)
511  return res;
512  src += res;
513  }
514  } else {
515  if (src_size < width * height)
516  return AVERROR_INVALIDDATA; // buffer not big enough
517  /* Plane is stored uncompressed */
518  for (i = 0; i < height; i++) {
519  memcpy(dst + (i * stride), src, width);
520  src += width;
521  }
522  }
523  } else if (esc_count == 0xff) {
524  /* Plane is a solid run of given value */
525  for (i = 0; i < height; i++)
526  memset(dst + i * stride, src[1], width);
527  /* Do not apply prediction.
528  Note: memset to 0 above, setting first value to src[1]
529  and applying prediction gives the same result. */
530  return 0;
531  } else {
533  "Invalid zero run escape code! (%#x)\n", esc_count);
534  return AVERROR_INVALIDDATA;
535  }
536 
537  if (l->avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
538  for (i = 0; i < height; i++) {
539  lag_pred_line(l, dst, width, stride, i);
540  dst += stride;
541  }
542  } else {
543  for (i = 0; i < height; i++) {
545  width == l->avctx->width);
546  dst += stride;
547  }
548  }
549 
550  return 0;
551 }
552 
553 /**
554  * Decode a frame.
555  * @param avctx codec context
556  * @param data output AVFrame
557  * @param data_size size of output data or 0 if no picture is returned
558  * @param avpkt input packet
559  * @return number of consumed bytes on success or negative if decode fails
560  */
562  int *got_frame, AVPacket *avpkt)
563 {
564  const uint8_t *buf = avpkt->data;
565  unsigned int buf_size = avpkt->size;
566  LagarithContext *l = avctx->priv_data;
567  uint8_t frametype;
568  uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9;
569  uint32_t offs[4];
570  uint8_t *srcs[4];
571  int i, j, planes = 3;
572  int ret = 0;
573 
574  frametype = buf[0];
575 
576  offset_gu = AV_RL32(buf + 1);
577  offset_bv = AV_RL32(buf + 5);
578 
579  switch (frametype) {
580  case FRAME_SOLID_RGBA:
581  avctx->pix_fmt = AV_PIX_FMT_GBRAP;
583  case FRAME_SOLID_GRAY:
584  if (frametype == FRAME_SOLID_GRAY)
585  if (avctx->bits_per_coded_sample == 24) {
586  avctx->pix_fmt = AV_PIX_FMT_GBRP;
587  } else {
588  avctx->pix_fmt = AV_PIX_FMT_GBRAP;
589  planes = 4;
590  }
591 
592  if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
593  return ret;
594 
595  if (frametype == FRAME_SOLID_RGBA) {
596  for (i = 0; i < avctx->height; i++) {
597  memset(p->data[0] + i * p->linesize[0], buf[2], avctx->width);
598  memset(p->data[1] + i * p->linesize[1], buf[1], avctx->width);
599  memset(p->data[2] + i * p->linesize[2], buf[3], avctx->width);
600  memset(p->data[3] + i * p->linesize[3], buf[4], avctx->width);
601  }
602  } else {
603  for (i = 0; i < avctx->height; i++) {
604  for (j = 0; j < planes; j++)
605  memset(p->data[j] + i * p->linesize[j], buf[1], avctx->width);
606  }
607  }
608  break;
609  case FRAME_SOLID_COLOR:
610  if (avctx->bits_per_coded_sample == 24) {
611  avctx->pix_fmt = AV_PIX_FMT_GBRP;
612  } else {
613  avctx->pix_fmt = AV_PIX_FMT_GBRAP;
614  }
615 
616  if ((ret = ff_thread_get_buffer(avctx, p,0)) < 0)
617  return ret;
618 
619  for (i = 0; i < avctx->height; i++) {
620  memset(p->data[0] + i * p->linesize[0], buf[2], avctx->width);
621  memset(p->data[1] + i * p->linesize[1], buf[1], avctx->width);
622  memset(p->data[2] + i * p->linesize[2], buf[3], avctx->width);
623  if (avctx->pix_fmt == AV_PIX_FMT_GBRAP)
624  memset(p->data[3] + i * p->linesize[3], 0xFFu, avctx->width);
625  }
626  break;
627  case FRAME_ARITH_RGBA:
628  avctx->pix_fmt = AV_PIX_FMT_GBRAP;
629  planes = 4;
630  offset_ry += 4;
631  offs[3] = AV_RL32(buf + 9);
633  case FRAME_ARITH_RGB24:
634  case FRAME_U_RGB24:
635  if (frametype == FRAME_ARITH_RGB24 || frametype == FRAME_U_RGB24)
636  avctx->pix_fmt = AV_PIX_FMT_GBRP;
637 
638  if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
639  return ret;
640 
641  offs[0] = offset_bv;
642  offs[1] = offset_gu;
643  offs[2] = offset_ry;
644 
645  for (i = 0; i < planes; i++)
646  srcs[i] = p->data[i] + (avctx->height - 1) * p->linesize[i];
647  for (i = 0; i < planes; i++)
648  if (buf_size <= offs[i]) {
649  av_log(avctx, AV_LOG_ERROR,
650  "Invalid frame offsets\n");
651  return AVERROR_INVALIDDATA;
652  }
653 
654  for (i = 0; i < planes; i++) {
655  ret = lag_decode_arith_plane(l, srcs[i],
656  avctx->width, avctx->height,
657  -p->linesize[i], buf + offs[i],
658  buf_size - offs[i]);
659  if (ret < 0)
660  return ret;
661  }
662  for (i = 0; i < avctx->height; i++) {
663  l->llviddsp.add_bytes(p->data[0] + i * p->linesize[0], p->data[1] + i * p->linesize[1], avctx->width);
664  l->llviddsp.add_bytes(p->data[2] + i * p->linesize[2], p->data[1] + i * p->linesize[1], avctx->width);
665  }
666  FFSWAP(uint8_t*, p->data[0], p->data[1]);
667  FFSWAP(int, p->linesize[0], p->linesize[1]);
668  FFSWAP(uint8_t*, p->data[2], p->data[1]);
669  FFSWAP(int, p->linesize[2], p->linesize[1]);
670  break;
671  case FRAME_ARITH_YUY2:
672  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
673 
674  if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
675  return ret;
676 
677  if (offset_ry >= buf_size ||
678  offset_gu >= buf_size ||
679  offset_bv >= buf_size) {
680  av_log(avctx, AV_LOG_ERROR,
681  "Invalid frame offsets\n");
682  return AVERROR_INVALIDDATA;
683  }
684 
685  ret = lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
686  p->linesize[0], buf + offset_ry,
687  buf_size - offset_ry);
688  if (ret < 0)
689  return ret;
690  ret = lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
691  avctx->height, p->linesize[1],
692  buf + offset_gu, buf_size - offset_gu);
693  if (ret < 0)
694  return ret;
695  ret = lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
696  avctx->height, p->linesize[2],
697  buf + offset_bv, buf_size - offset_bv);
698  break;
699  case FRAME_ARITH_YV12:
700  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
701 
702  if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
703  return ret;
704 
705  if (offset_ry >= buf_size ||
706  offset_gu >= buf_size ||
707  offset_bv >= buf_size) {
708  av_log(avctx, AV_LOG_ERROR,
709  "Invalid frame offsets\n");
710  return AVERROR_INVALIDDATA;
711  }
712 
713  ret = lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
714  p->linesize[0], buf + offset_ry,
715  buf_size - offset_ry);
716  if (ret < 0)
717  return ret;
718  ret = lag_decode_arith_plane(l, p->data[2], (avctx->width + 1) / 2,
719  (avctx->height + 1) / 2, p->linesize[2],
720  buf + offset_gu, buf_size - offset_gu);
721  if (ret < 0)
722  return ret;
723  ret = lag_decode_arith_plane(l, p->data[1], (avctx->width + 1) / 2,
724  (avctx->height + 1) / 2, p->linesize[1],
725  buf + offset_bv, buf_size - offset_bv);
726  break;
727  default:
728  av_log(avctx, AV_LOG_ERROR,
729  "Unsupported Lagarith frame type: %#"PRIx8"\n", frametype);
730  return AVERROR_PATCHWELCOME;
731  }
732 
733  if (ret < 0)
734  return ret;
735 
736  *got_frame = 1;
737 
738  return buf_size;
739 }
740 
742 {
743  static AVOnce init_static_once = AV_ONCE_INIT;
744  LagarithContext *l = avctx->priv_data;
745  l->avctx = avctx;
746 
748  ff_thread_once(&init_static_once, lag_init_static_data);
749 
750  return 0;
751 }
752 
754  .p.name = "lagarith",
755  CODEC_LONG_NAME("Lagarith lossless"),
756  .p.type = AVMEDIA_TYPE_VIDEO,
757  .p.id = AV_CODEC_ID_LAGARITH,
758  .priv_data_size = sizeof(LagarithContext),
761  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
762 };
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_CODEC_ID_LAGARITH
@ AV_CODEC_ID_LAGARITH
Definition: codec_id.h:199
FRAME_ARITH_YUY2
@ FRAME_ARITH_YUY2
arithmetic coded YUY2
Definition: lagarith.c:46
show_bits_long
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
Definition: get_bits.h:498
LagarithContext::avctx
AVCodecContext * avctx
Definition: lagarith.c:58
thread.h
MAX_OVERREAD
#define MAX_OVERREAD
Definition: lagarithrac.h:49
src1
const pixel * src1
Definition: h264pred_template.c:420
lagarithrac.h
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:424
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
lag_rac::scale
unsigned scale
Number of bits of precision in range.
Definition: lagarithrac.h:41
AVPacket::data
uint8_t * data
Definition: packet.h:595
lag_rac::overread
int overread
Definition: lagarithrac.h:48
lag_get_rac
static uint8_t lag_get_rac(lag_rac *l)
Decode a single byte from the compressed plane described by *l.
Definition: lagarithrac.h:76
FFCodec
Definition: codec_internal.h:127
lag_decode_zero_run_line
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:392
lag_rac::prob
uint32_t prob[258]
Table of cumulative probability for each symbol.
Definition: lagarithrac.h:51
lag_decode_init
static av_cold int lag_decode_init(AVCodecContext *avctx)
Definition: lagarith.c:741
thread.h
add_lag_median_prediction
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:263
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
lag_tab
static VLCElem lag_tab[1<< VLC_BITS]
Definition: lagarith.c:64
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
lag_pred_line_yuy2
static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, int width, int stride, int line, int is_luma)
Definition: lagarith.c:313
VLC_BITS
#define VLC_BITS
Definition: lagarith.c:41
ff_llviddsp_init
av_cold void ff_llviddsp_init(LLVidDSPContext *c)
Definition: lossless_videodsp.c:114
LagarithContext::llviddsp
LLVidDSPContext llviddsp
Definition: lagarith.c:59
GetBitContext
Definition: get_bits.h:109
lag_decode_frame
static int lag_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
Decode a frame.
Definition: lagarith.c:561
FRAME_ARITH_RGBA
@ FRAME_ARITH_RGBA
arithmetic coded RGBA
Definition: lagarith.c:51
val
static double val(void *priv, double ch)
Definition: aeval.c:77
LLVidDSPContext
Definition: lossless_videodsp.h:28
LLVidDSPContext::add_bytes
void(* add_bytes)(uint8_t *dst, uint8_t *src, ptrdiff_t w)
Definition: lossless_videodsp.h:29
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
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:119
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:347
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
bits
uint8_t bits
Definition: vp3data.h:128
lag_init_static_data
static av_cold void lag_init_static_data(void)
Definition: lagarith.c:87
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
FRAME_OLD_ARITH_RGB
@ FRAME_OLD_ARITH_RGB
obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0)
Definition: lagarith.c:50
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
lag_decode_prob
static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
Definition: lagarith.c:136
lag_rac
Definition: lagarithrac.h:37
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
FRAME_RAW
@ FRAME_RAW
uncompressed
Definition: lagarith.c:44
lag_bits
static const uint8_t lag_bits[]
Definition: lagarith.c:66
mathops.h
lag_calc_zero_run
static uint8_t lag_calc_zero_run(int8_t x)
Definition: lagarith.c:131
lag_decode_line
static int lag_decode_line(LagarithContext *l, lag_rac *rac, uint8_t *dst, int width, int stride, int esc_count)
Definition: lagarith.c:350
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:645
ff_lagarith_decoder
const FFCodec ff_lagarith_decoder
Definition: lagarith.c:753
AVOnce
#define AVOnce
Definition: thread.h:202
index
int index
Definition: gxfenc.c:90
lag_codes
static const uint8_t lag_codes[]
Definition: lagarith.c:72
FRAME_ARITH_RGB24
@ FRAME_ARITH_RGB24
arithmetic coded RGB24
Definition: lagarith.c:47
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
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:596
height
#define height
Definition: dsp.h:89
codec_internal.h
FRAME_REDUCED_RES
@ FRAME_REDUCED_RES
reduced resolution YV12 frame
Definition: lagarith.c:54
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
ff_lag_rac_init
void ff_lag_rac_init(lag_rac *l, GetBitContext *gb, int length)
Definition: lagarithrac.c:33
VLCElem
Definition: vlc.h:32
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
planes
static const struct @585 planes[]
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
line
Definition: graph2dot.c:48
attributes.h
FRAME_ARITH_YV12
@ FRAME_ARITH_YV12
arithmetic coded YV12
Definition: lagarith.c:53
FRAME_U_RGB24
@ FRAME_U_RGB24
unaligned RGB24
Definition: lagarith.c:45
LLVidDSPContext::add_median_pred
void(* add_median_pred)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, ptrdiff_t w, int *left, int *left_top)
Definition: lossless_videodsp.h:31
LLVidDSPContext::add_left_pred
int(* add_left_pred)(uint8_t *dst, const uint8_t *src, ptrdiff_t w, int left)
Definition: lossless_videodsp.h:34
AVCodecContext::bits_per_coded_sample
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:1558
FRAME_SOLID_GRAY
@ FRAME_SOLID_GRAY
solid grayscale color frame
Definition: lagarith.c:48
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
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
AVCodecContext::height
int height
Definition: avcodec.h:600
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:639
VLC_INIT_STATIC_SPARSE_TABLE
#define VLC_INIT_STATIC_SPARSE_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, symbols, symbols_wrap, symbols_size, flags)
Definition: vlc.h:266
avcodec.h
mid_pred
#define mid_pred
Definition: mathops.h:115
softfloat_reciprocal
static uint64_t softfloat_reciprocal(uint32_t denom)
Compute the 52-bit mantissa of 1/(double)denom.
Definition: lagarith.c:101
ret
ret
Definition: filter_design.txt:187
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
prob
#define prob(name, subs,...)
Definition: cbs_vp9.c:325
FRAME_SOLID_COLOR
@ FRAME_SOLID_COLOR
solid non-grayscale color frame
Definition: lagarith.c:49
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
AVCodecContext
main external API structure.
Definition: avcodec.h:439
LagarithContext
Definition: lagarith.c:57
LagarithContext::zeros
int zeros
number of consecutive zero bytes encountered
Definition: lagarith.c:60
L
#define L(x)
Definition: vpx_arith.h:36
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
lag_symbols
static const uint8_t lag_symbols[]
Definition: lagarith.c:80
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
lossless_videodsp.h
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
w
uint8_t w
Definition: llvidencdsp.c:39
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
AVPacket
This structure stores compressed data.
Definition: packet.h:572
LagarithContext::zeros_rem
int zeros_rem
number of zero bytes remaining to output
Definition: lagarith.c:61
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
softfloat_mul
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:120
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
h
h
Definition: vp9dsp_template.c:2070
lag_pred_line
static void lag_pred_line(LagarithContext *l, uint8_t *buf, int width, int stride, int line)
Definition: lagarith.c:287
stride
#define stride
Definition: h264pred_template.c:536
LagarithFrameType
LagarithFrameType
Definition: lagarith.c:43
width
#define width
Definition: dsp.h:89
lag_rac::logctx
void * logctx
Definition: lagarithrac.h:38
lag_decode_arith_plane
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:453
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
FRAME_SOLID_RGBA
@ FRAME_SOLID_RGBA
solid RGBA color frame
Definition: lagarith.c:52
lag_read_prob_header
static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
Definition: lagarith.c:157
src
#define src
Definition: vp8dsp.c:248
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:239