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
34
42 FRAME_OLD_ARITH_RGB = 7,
/**< obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0) */
47 };
48
53 int zeros;
/**< number of consecutive zero bytes encountered */
54 int zeros_rem;
/**< number of zero bytes remaining to output */
58
59 /**
60 * Compute the 52bit mantissa of 1/(double)denom.
61 * This crazy format uses floats in an entropy coder and we have to match x86
62 * rounding exactly, thus ordinary floats aren't portable enough.
63 * @param denom denominator
64 * @return 52bit mantissa
65 * @see softfloat_mul
66 */
68 {
70 uint64_t ret = (1ULL << 52) / denom;
71 uint64_t err = (1ULL << 52) - ret * denom;
74 err += denom / 2;
75 return ret + err / denom;
76 }
77
78 /**
79 * (uint32_t)(x*f), where f has the given mantissa, and exponent 0
80 * Used in combination with softfloat_reciprocal computes x/(double)denom.
81 * @param x 32bit integer factor
82 * @param mantissa mantissa of f with exponent 0
83 * @return 32bit integer value (x*f)
84 * @see softfloat_reciprocal
85 */
87 {
88 uint64_t l = x * (mantissa & 0xffffffff);
89 uint64_t h = x * (mantissa >> 32);
90 h += l >> 32;
91 l &= 0xffffffff;
93 h += l >> 32;
94 return h >> 20;
95 }
96
98 {
99 return (x << 1) ^ (x >> 7);
100 }
101
103 {
104 static const uint8_t series[] = { 1, 2, 3, 5, 8, 13, 21 };
105 int i;
106 int bit = 0;
108 int prevbit = 0;
109 unsigned val;
110
111 for (i = 0; i < 7; i++) {
112 if (prevbit && bit)
113 break;
114 prevbit = bit;
116 if (bit && !prevbit)
117 bits += series[i];
118 }
119 bits--;
120 if (bits < 0 || bits > 31) {
121 *value = 0;
122 return -1;
123 } else if (bits == 0) {
124 *value = 0;
125 return 0;
126 }
127
130
131 *value = val - 1;
132
133 return 0;
134 }
135
137 {
138 int i, j, scale_factor;
139 unsigned prob, cumulative_target;
140 unsigned cumul_prob = 0;
141 unsigned scaled_cumul_prob = 0;
142
144 rac->
prob[257] = UINT_MAX;
145 /* Read probabilities from bitstream */
146 for (i = 1; i < 257; i++) {
149 return -1;
150 }
151 if ((uint64_t)cumul_prob + rac->
prob[i] > UINT_MAX) {
153 return -1;
154 }
155 cumul_prob += rac->
prob[i];
159 return -1;
160 }
161 if (prob > 256 - i)
162 prob = 256 - i;
163 for (j = 0; j < prob; j++)
165 }
166 }
167
168 if (!cumul_prob) {
170 return -1;
171 }
172
173 /* Scale probabilities so cumulative probability is an even power of 2. */
174 scale_factor =
av_log2(cumul_prob);
175
176 if (cumul_prob & (cumul_prob - 1)) {
178 for (i = 1; i < 257; i++) {
180 scaled_cumul_prob += rac->
prob[i];
181 }
182
183 scale_factor++;
184 cumulative_target = 1 << scale_factor;
185
186 if (scaled_cumul_prob > cumulative_target) {
188 "Scaled probabilities are larger than target!\n");
189 return -1;
190 }
191
192 scaled_cumul_prob = cumulative_target - scaled_cumul_prob;
193
194 for (i = 1; scaled_cumul_prob; i = (i & 0x7f) + 1) {
197 scaled_cumul_prob--;
198 }
199 /* Comment from reference source:
200 * if (b & 0x80 == 0) { // order of operations is 'wrong'; it has been left this way
201 * // since the compression change is negligible and fixing it
202 * // breaks backwards compatibility
203 * b =- (signed int)b;
204 * b &= 0xFF;
205 * } else {
206 * b++;
207 * b &= 0x7f;
208 * }
209 */
210 }
211 }
212
213 rac->
scale = scale_factor;
214
215 /* Fill probability array with cumulative probability for each symbol. */
216 for (i = 1; i < 257; i++)
218
219 return 0;
220 }
221
224 int *left_top)
225 {
226 /* This is almost identical to add_hfyu_median_prediction in dsputil.h.
227 * However the &0xFF on the gradient predictor yealds incorrect output
228 * for lagarith.
229 */
230 int i;
232
233 l = *left;
234 lt = *left_top;
235
236 for (i = 0; i < w; i++) {
237 l =
mid_pred(l, src1[i], l + src1[i] - lt) + diff[i];
238 lt = src1[i];
239 dst[i] = l;
240 }
241
242 *left = l;
243 *left_top = lt;
244 }
245
248 {
250
251 if (!line) {
252 /* Left prediction only for first line */
254 width, 0);
255 } else {
256 /* Left pixel is actually prev_row[width] */
257 L = buf[width - stride - 1];
258
259 if (line == 1) {
260 /* Second line, left predict first pixel, the rest of the line is median predicted
261 * NOTE: In the case of RGB this pixel is top predicted */
263 } else {
264 /* Top left is 2 rows back, last pixel */
265 TL = buf[width - (2 *
stride) - 1];
266 }
267
269 width, &L, &TL);
270 }
271 }
272
275 int is_luma)
276 {
278
279 if (!line) {
280 L= buf[0];
281 if (is_luma)
282 buf[0] = 0;
284 if (is_luma)
286 return;
287 }
288 if (line == 1) {
289 const int HEAD = is_luma ? 4 : 2;
290 int i;
291
292 L = buf[width - stride - 1];
293 TL = buf[HEAD - stride - 1];
294 for (i = 0; i < HEAD; i++) {
295 L += buf[i];
297 }
298 for (; i<
width; i++) {
299 L =
mid_pred(L&0xFF, buf[i-stride], (L + buf[i-stride] - TL)&0xFF) + buf[i];
302 }
303 } else {
304 TL = buf[width - (2 *
stride) - 1];
305 L = buf[width - stride - 1];
307 &L, &TL);
308 }
309 }
310
313 int esc_count)
314 {
315 int i = 0;
316 int ret = 0;
317
318 if (!esc_count)
319 esc_count = -1;
320
321 /* Output any zeros remaining from the previous run */
322 handle_zeros:
325 memset(dst + i, 0, count);
326 i += count;
328 }
329
330 while (i < width) {
332 ret++;
333
334 if (dst[i])
336 else
338
339 i++;
340 if (l->
zeros == esc_count) {
342 ret++;
343
345
347 goto handle_zeros;
348 }
349 }
350 return ret;
351 }
352
355 int width,
int esc_count)
356 {
357 int i = 0;
358 int count;
360 const uint8_t *src_start = src;
361 uint8_t mask1 = -(esc_count < 2);
362 uint8_t mask2 = -(esc_count < 3);
364
365 output_zeros:
368 if (end - dst < count) {
371 }
372
373 memset(dst, 0, count);
375 dst += count;
376 }
377
378 while (dst < end) {
379 i = 0;
380 while (!zero_run && dst + i < end) {
381 i++;
382 if (i+2 >= src_end - src)
384 zero_run =
385 !(src[i] | (src[i + 1] & mask1) | (src[i + 2] & mask2));
386 }
387 if (zero_run) {
388 zero_run = 0;
389 i += esc_count;
390 memcpy(dst, src, i);
391 dst += i;
393
394 src += i + 1;
395 goto output_zeros;
396 } else {
397 memcpy(dst, src, i);
398 src += i;
399 dst += i;
400 }
401 }
402 return src - src_start;
403 }
404
405
406
409 const uint8_t *src,
int src_size)
410 {
411 int i = 0;
412 int read = 0;
413 uint32_t length;
415 int esc_count;
418 const uint8_t *src_end = src + src_size;
419
422
423 if(src_size < 2)
425
426 esc_count = src[0];
427 if (esc_count < 4) {
429 if(src_size < 5)
431 if (esc_count &&
AV_RL32(src + 1) < length) {
433 offset += 4;
434 }
435
437
439 return -1;
440
442
443 for (i = 0; i <
height; i++)
445 stride, esc_count);
446
447 if (read > length)
449 "Output more bytes than length (%d of %d)\n", read,
450 length);
451 } else if (esc_count < 8) {
452 esc_count -= 4;
453 if (esc_count > 0) {
454 /* Zero run coding only, no range coding. */
455 for (i = 0; i <
height; i++) {
457 src_end, width, esc_count);
458 if (res < 0)
459 return res;
460 src += res;
461 }
462 } else {
463 if (src_size < width * height)
465 /* Plane is stored uncompressed */
466 for (i = 0; i <
height; i++) {
467 memcpy(dst + (i * stride), src, width);
469 }
470 }
471 } else if (esc_count == 0xff) {
472 /* Plane is a solid run of given value */
473 for (i = 0; i <
height; i++)
474 memset(dst + i * stride, src[1], width);
475 /* Do not apply prediction.
476 Note: memset to 0 above, setting first value to src[1]
477 and applying prediction gives the same result. */
478 return 0;
479 } else {
481 "Invalid zero run escape code! (%#x)\n", esc_count);
482 return -1;
483 }
484
486 for (i = 0; i <
height; i++) {
489 }
490 } else {
491 for (i = 0; i <
height; i++) {
495 }
496 }
497
498 return 0;
499 }
500
501 /**
502 * Decode a frame.
503 * @param avctx codec context
504 * @param data output AVFrame
505 * @param data_size size of output data or 0 if no picture is returned
506 * @param avpkt input packet
507 * @return number of consumed bytes on success or negative if decode fails
508 */
511 {
513 unsigned int buf_size = avpkt->
size;
517 uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9;
518 uint32_t offs[4];
520 int i, j, planes = 3;
521
523
526
529
530 frametype = buf[0];
531
534
535 switch (frametype) {
538
541 return -1;
542 }
543
545 for (j = 0; j < avctx->
height; j++) {
546 for (i = 0; i < avctx->
width; i++)
547 AV_WN32(dst + i * 4, offset_gu);
549 }
550 break;
553 planes = 4;
554 offset_ry += 4;
560
563 return -1;
564 }
565
566 offs[0] = offset_bv;
567 offs[1] = offset_gu;
568 offs[2] = offset_ry;
569
576 }
577 }
578 for (i = 0; i < planes; i++)
580 for (i = 0; i < planes; i++)
581 if (buf_size <= offs[i]) {
583 "Invalid frame offsets\n");
585 }
586
587 for (i = 0; i < planes; i++)
591 buf_size - offs[i]);
593 for (i = 0; i < planes; i++)
596 for (i = 0; i < avctx->
width; i++) {
598 r = srcs[0][i];
599 g = srcs[1][i];
600 b = srcs[2][i];
604 a = srcs[3][i];
606 } else {
610 }
611 }
613 for (i = 0; i < planes; i++)
615 }
616 break;
619
622 return -1;
623 }
624
625 if (offset_ry >= buf_size ||
626 offset_gu >= buf_size ||
627 offset_bv >= buf_size) {
629 "Invalid frame offsets\n");
631 }
632
635 buf_size - offset_ry);
638 buf + offset_gu, buf_size - offset_gu);
641 buf + offset_bv, buf_size - offset_bv);
642 break;
645
648 return -1;
649 }
650 if (buf_size <= offset_ry || buf_size <= offset_gu || buf_size <= offset_bv) {
652 }
653
654 if (offset_ry >= buf_size ||
655 offset_gu >= buf_size ||
656 offset_bv >= buf_size) {
658 "Invalid frame offsets\n");
660 }
661
664 buf_size - offset_ry);
667 buf + offset_gu, buf_size - offset_gu);
670 buf + offset_bv, buf_size - offset_bv);
671 break;
672 default:
674 "Unsupported Lagarith frame type: %#x\n", frametype);
675 return -1;
676 }
677
678 *picture = *p;
679 *got_frame = 1;
680
681 return buf_size;
682 }
683
685 {
688
690
691 return 0;
692 }
693
695 {
697
701
702 return 0;
703 }
704
715 };