]> git.sesse.net Git - ffmpeg/blob - libavcodec/scpr.c
Merge commit '8629149816930a43bf5a66b11c6224446cabd044'
[ffmpeg] / libavcodec / scpr.c
1 /*
2  * ScreenPressor decoder
3  *
4  * Copyright (c) 2017 Paul B Mahol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 #include "avcodec.h"
28 #include "bytestream.h"
29 #include "internal.h"
30 #include "scpr.h"
31 #include "scpr3.h"
32
33 #define TOP  0x01000000
34 #define BOT    0x010000
35
36 #include "scpr3.c"
37
38 static void init_rangecoder(RangeCoder *rc, GetByteContext *gb)
39 {
40     rc->code1 = 0;
41     rc->range = 0xFFFFFFFFU;
42     rc->code  = bytestream2_get_be32(gb);
43 }
44
45 static void reinit_tables(SCPRContext *s)
46 {
47     int comp, i, j;
48
49     for (comp = 0; comp < 3; comp++) {
50         for (j = 0; j < 4096; j++) {
51             if (s->pixel_model[comp][j].total_freq != 256) {
52                 for (i = 0; i < 256; i++)
53                     s->pixel_model[comp][j].freq[i] = 1;
54                 for (i = 0; i < 16; i++)
55                     s->pixel_model[comp][j].lookup[i] = 16;
56                 s->pixel_model[comp][j].total_freq = 256;
57             }
58         }
59     }
60
61     for (j = 0; j < 6; j++) {
62         uint32_t *p = s->run_model[j];
63         for (i = 0; i < 256; i++)
64             p[i] = 1;
65         p[256] = 256;
66     }
67
68     for (j = 0; j < 6; j++) {
69         uint32_t *op = s->op_model[j];
70         for (i = 0; i < 6; i++)
71             op[i] = 1;
72         op[6] = 6;
73     }
74
75     for (i = 0; i < 256; i++) {
76         s->range_model[i] = 1;
77         s->count_model[i] = 1;
78     }
79     s->range_model[256] = 256;
80     s->count_model[256] = 256;
81
82     for (i = 0; i < 5; i++) {
83         s->fill_model[i] = 1;
84     }
85     s->fill_model[5] = 5;
86
87     for (j = 0; j < 4; j++) {
88         for (i = 0; i < 16; i++) {
89             s->sxy_model[j][i] = 1;
90         }
91         s->sxy_model[j][16] = 16;
92     }
93
94     for (i = 0; i < 512; i++) {
95         s->mv_model[0][i] = 1;
96         s->mv_model[1][i] = 1;
97     }
98     s->mv_model[0][512] = 512;
99     s->mv_model[1][512] = 512;
100 }
101
102 static int decode(GetByteContext *gb, RangeCoder *rc, uint32_t cumFreq, uint32_t freq, uint32_t total_freq)
103 {
104     rc->code -= cumFreq * rc->range;
105     rc->range *= freq;
106
107     while (rc->range < TOP && bytestream2_get_bytes_left(gb) > 0) {
108         uint32_t byte = bytestream2_get_byteu(gb);
109         rc->code = (rc->code << 8) | byte;
110         rc->range <<= 8;
111     }
112
113     return 0;
114 }
115
116 static int get_freq(RangeCoder *rc, uint32_t total_freq, uint32_t *freq)
117 {
118     if (total_freq == 0)
119         return AVERROR_INVALIDDATA;
120
121     rc->range = rc->range / total_freq;
122
123     if (rc->range == 0)
124         return AVERROR_INVALIDDATA;
125
126     *freq = rc->code / rc->range;
127
128     return 0;
129 }
130
131 static int decode0(GetByteContext *gb, RangeCoder *rc, uint32_t cumFreq, uint32_t freq, uint32_t total_freq)
132 {
133     uint32_t t;
134
135     if (total_freq == 0)
136         return AVERROR_INVALIDDATA;
137
138     t = rc->range * (uint64_t)cumFreq / total_freq;
139
140     rc->code1 += t + 1;
141     rc->range = rc->range * (uint64_t)(freq + cumFreq) / total_freq - (t + 1);
142
143     while (rc->range < TOP && bytestream2_get_bytes_left(gb) > 0) {
144         uint32_t byte = bytestream2_get_byteu(gb);
145         rc->code = (rc->code << 8) | byte;
146         rc->code1 <<= 8;
147         rc->range <<= 8;
148     }
149
150     return 0;
151 }
152
153 static int get_freq0(RangeCoder *rc, uint32_t total_freq, uint32_t *freq)
154 {
155     if (rc->range == 0)
156         return AVERROR_INVALIDDATA;
157
158     *freq = total_freq * (uint64_t)(rc->code - rc->code1) / rc->range;
159
160     return 0;
161 }
162
163 static int decode_value(SCPRContext *s, uint32_t *cnt, uint32_t maxc, uint32_t step, uint32_t *rval)
164 {
165     GetByteContext *gb = &s->gb;
166     RangeCoder *rc = &s->rc;
167     uint32_t totfr = cnt[maxc];
168     uint32_t value;
169     uint32_t c = 0, cumfr = 0, cnt_c = 0;
170     int i, ret;
171
172     if ((ret = s->get_freq(rc, totfr, &value)) < 0)
173         return ret;
174
175     while (c < maxc) {
176         cnt_c = cnt[c];
177         if (value >= cumfr + cnt_c)
178             cumfr += cnt_c;
179         else
180             break;
181         c++;
182     }
183
184     if (c >= maxc)
185         return AVERROR_INVALIDDATA;
186
187     if ((ret = s->decode(gb, rc, cumfr, cnt_c, totfr)) < 0)
188         return ret;
189
190     cnt[c] = cnt_c + step;
191     totfr += step;
192     if (totfr > BOT) {
193         totfr = 0;
194         for (i = 0; i < maxc; i++) {
195             uint32_t nc = (cnt[i] >> 1) + 1;
196             cnt[i] = nc;
197             totfr += nc;
198         }
199     }
200
201     cnt[maxc] = totfr;
202     *rval = c;
203
204     return 0;
205 }
206
207 static int decode_unit(SCPRContext *s, PixelModel *pixel, uint32_t step, uint32_t *rval)
208 {
209     GetByteContext *gb = &s->gb;
210     RangeCoder *rc = &s->rc;
211     uint32_t totfr = pixel->total_freq;
212     uint32_t value, x = 0, cumfr = 0, cnt_x = 0;
213     int i, j, ret, c, cnt_c;
214
215     if ((ret = s->get_freq(rc, totfr, &value)) < 0)
216         return ret;
217
218     while (x < 16) {
219         cnt_x = pixel->lookup[x];
220         if (value >= cumfr + cnt_x)
221             cumfr += cnt_x;
222         else
223             break;
224         x++;
225     }
226
227     c = x * 16;
228     cnt_c = 0;
229     while (c < 256) {
230         cnt_c = pixel->freq[c];
231         if (value >= cumfr + cnt_c)
232             cumfr += cnt_c;
233         else
234             break;
235         c++;
236     }
237     if (x >= 16 || c >= 256) {
238         return AVERROR_INVALIDDATA;
239     }
240
241     if ((ret = s->decode(gb, rc, cumfr, cnt_c, totfr)) < 0)
242         return ret;
243
244     pixel->freq[c] = cnt_c + step;
245     pixel->lookup[x] = cnt_x + step;
246     totfr += step;
247     if (totfr > BOT) {
248         totfr = 0;
249         for (i = 0; i < 256; i++) {
250             uint32_t nc = (pixel->freq[i] >> 1) + 1;
251             pixel->freq[i] = nc;
252             totfr += nc;
253         }
254         for (i = 0; i < 16; i++) {
255             uint32_t sum = 0;
256             uint32_t i16_17 = i << 4;
257             for (j = 0; j < 16; j++)
258                 sum += pixel->freq[i16_17 + j];
259             pixel->lookup[i] = sum;
260         }
261     }
262     pixel->total_freq = totfr;
263
264     *rval = c & s->cbits;
265
266     return 0;
267 }
268
269 static int decode_units(SCPRContext *s, uint32_t *r, uint32_t *g, uint32_t *b,
270                         int *cx, int *cx1)
271 {
272     const int cxshift = s->cxshift;
273     int ret;
274
275     ret = decode_unit(s, &s->pixel_model[0][*cx + *cx1], 400, r);
276     if (ret < 0)
277         return ret;
278
279     *cx1 = (*cx << 6) & 0xFC0;
280     *cx = *r >> cxshift;
281     ret = decode_unit(s, &s->pixel_model[1][*cx + *cx1], 400, g);
282     if (ret < 0)
283         return ret;
284
285     *cx1 = (*cx << 6) & 0xFC0;
286     *cx = *g >> cxshift;
287     ret = decode_unit(s, &s->pixel_model[2][*cx + *cx1], 400, b);
288     if (ret < 0)
289         return ret;
290
291     *cx1 = (*cx << 6) & 0xFC0;
292     *cx = *b >> cxshift;
293
294     return 0;
295 }
296
297 static int decompress_i(AVCodecContext *avctx, uint32_t *dst, int linesize)
298 {
299     SCPRContext *s = avctx->priv_data;
300     GetByteContext *gb = &s->gb;
301     int cx = 0, cx1 = 0, k = 0;
302     int run, off, y = 0, x = 0, ret;
303     uint32_t clr = 0, r, g, b, backstep = linesize - avctx->width;
304     uint32_t lx, ly, ptype;
305
306     reinit_tables(s);
307     bytestream2_skip(gb, 2);
308     init_rangecoder(&s->rc, gb);
309
310     while (k < avctx->width + 1) {
311         ret = decode_units(s, &r, &g, &b, &cx, &cx1);
312         if (ret < 0)
313             return ret;
314
315         ret = decode_value(s, s->run_model[0], 256, 400, &run);
316         if (ret < 0)
317             return ret;
318         if (run <= 0)
319             return AVERROR_INVALIDDATA;
320
321         clr = (b << 16) + (g << 8) + r;
322         k += run;
323         while (run-- > 0) {
324             if (y >= avctx->height)
325                 return AVERROR_INVALIDDATA;
326
327             dst[y * linesize + x] = clr;
328             lx = x;
329             ly = y;
330             x++;
331             if (x >= avctx->width) {
332                 x = 0;
333                 y++;
334             }
335         }
336     }
337     off = -linesize - 1;
338     ptype = 0;
339
340     while (x < avctx->width && y < avctx->height) {
341         ret = decode_value(s, s->op_model[ptype], 6, 1000, &ptype);
342         if (ret < 0)
343             return ret;
344         if (ptype == 0) {
345             ret = decode_units(s, &r, &g, &b, &cx, &cx1);
346             if (ret < 0)
347                 return ret;
348
349             clr = (b << 16) + (g << 8) + r;
350         }
351         if (ptype > 5)
352             return AVERROR_INVALIDDATA;
353         ret = decode_value(s, s->run_model[ptype], 256, 400, &run);
354         if (ret < 0)
355             return ret;
356         if (run <= 0)
357             return AVERROR_INVALIDDATA;
358
359         ret = decode_run_i(avctx, ptype, run, &x, &y, clr,
360                            dst, linesize, &lx, &ly,
361                            backstep, off, &cx, &cx1);
362         if (run < 0)
363             return ret;
364     }
365
366     return 0;
367 }
368
369 static int decompress_p(AVCodecContext *avctx,
370                         uint32_t *dst, int linesize,
371                         uint32_t *prev, int plinesize)
372 {
373     SCPRContext *s = avctx->priv_data;
374     GetByteContext *gb = &s->gb;
375     int ret, temp = 0, min, max, x, y, cx = 0, cx1 = 0;
376     int backstep = linesize - avctx->width;
377
378     if (bytestream2_get_byte(gb) == 0)
379         return 1;
380     bytestream2_skip(gb, 1);
381     init_rangecoder(&s->rc, gb);
382
383     ret  = decode_value(s, s->range_model, 256, 1, &min);
384     ret |= decode_value(s, s->range_model, 256, 1, &temp);
385     min += temp << 8;
386     ret |= decode_value(s, s->range_model, 256, 1, &max);
387     ret |= decode_value(s, s->range_model, 256, 1, &temp);
388     if (ret < 0)
389         return ret;
390
391     max += temp << 8;
392     if (min > max || min >= s->nbcount)
393         return AVERROR_INVALIDDATA;
394
395     memset(s->blocks, 0, sizeof(*s->blocks) * s->nbcount);
396
397     while (min <= max) {
398         int fill, count;
399
400         ret  = decode_value(s, s->fill_model,  5,   10, &fill);
401         ret |= decode_value(s, s->count_model, 256, 20, &count);
402         if (ret < 0)
403             return ret;
404         if (count <= 0)
405             return AVERROR_INVALIDDATA;
406
407         while (min < s->nbcount && count-- > 0) {
408             s->blocks[min++] = fill;
409         }
410     }
411
412     for (y = 0; y < s->nby; y++) {
413         for (x = 0; x < s->nbx; x++) {
414             int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
415
416             if (s->blocks[y * s->nbx + x] == 0)
417                 continue;
418
419             if (((s->blocks[y * s->nbx + x] - 1) & 1) > 0) {
420                 ret  = decode_value(s, s->sxy_model[0], 16, 100, &sx1);
421                 ret |= decode_value(s, s->sxy_model[1], 16, 100, &sy1);
422                 ret |= decode_value(s, s->sxy_model[2], 16, 100, &sx2);
423                 ret |= decode_value(s, s->sxy_model[3], 16, 100, &sy2);
424                 if (ret < 0)
425                     return ret;
426
427                 sx2++;
428                 sy2++;
429             }
430             if (((s->blocks[y * s->nbx + x] - 1) & 2) > 0) {
431                 int i, j, by = y * 16, bx = x * 16;
432                 int mvx, mvy;
433
434                 ret  = decode_value(s, s->mv_model[0], 512, 100, &mvx);
435                 ret |= decode_value(s, s->mv_model[1], 512, 100, &mvy);
436                 if (ret < 0)
437                     return ret;
438
439                 mvx -= 256;
440                 mvy -= 256;
441
442                 if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 ||
443                     by + mvy + sy1 >= avctx->height || bx + mvx + sx1 >= avctx->width)
444                     return AVERROR_INVALIDDATA;
445
446                 for (i = 0; i < sy2 - sy1 && (by + sy1 + i) < avctx->height && (by + mvy + sy1 + i) < avctx->height; i++) {
447                     for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->width && (bx + mvx + sx1 + j) < avctx->width; j++) {
448                         dst[(by + i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 + i) * plinesize + bx + sx1 + mvx + j];
449                     }
450                 }
451             } else {
452                 int run, bx = x * 16 + sx1, by = y * 16 + sy1;
453                 uint32_t r, g, b, clr, ptype = 0;
454
455                 for (; by < y * 16 + sy2 && by < avctx->height;) {
456                     ret = decode_value(s, s->op_model[ptype], 6, 1000, &ptype);
457                     if (ret < 0)
458                         return ret;
459                     if (ptype == 0) {
460                         ret = decode_units(s, &r, &g, &b, &cx, &cx1);
461                         if (ret < 0)
462                             return ret;
463
464                         clr = (b << 16) + (g << 8) + r;
465                     }
466                     if (ptype > 5)
467                         return AVERROR_INVALIDDATA;
468                     ret = decode_value(s, s->run_model[ptype], 256, 400, &run);
469                     if (ret < 0)
470                         return ret;
471                     if (run <= 0)
472                         return AVERROR_INVALIDDATA;
473
474                     ret = decode_run_p(avctx, ptype, run, x, y, clr,
475                                        dst, prev, linesize, plinesize, &bx, &by,
476                                        backstep, sx1, sx2, &cx, &cx1);
477                     if (ret < 0)
478                         return ret;
479                 }
480             }
481         }
482     }
483
484     return 0;
485 }
486
487 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
488                         AVPacket *avpkt)
489 {
490     SCPRContext *s = avctx->priv_data;
491     GetByteContext *gb = &s->gb;
492     AVFrame *frame = data;
493     int ret, type;
494
495     if (avctx->bits_per_coded_sample == 16) {
496         if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
497             return ret;
498     }
499
500     if ((ret = ff_reget_buffer(avctx, s->current_frame)) < 0)
501         return ret;
502
503     bytestream2_init(gb, avpkt->data, avpkt->size);
504
505     type = bytestream2_peek_byte(gb);
506
507     if (type == 2) {
508         s->version = 1;
509         s->get_freq = get_freq0;
510         s->decode = decode0;
511         frame->key_frame = 1;
512         ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0],
513                            s->current_frame->linesize[0] / 4);
514     } else if (type == 18) {
515         s->version = 2;
516         s->get_freq = get_freq;
517         s->decode = decode;
518         frame->key_frame = 1;
519         ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0],
520                            s->current_frame->linesize[0] / 4);
521     } else if (type == 34) {
522         frame->key_frame = 1;
523         s->version = 3;
524         ret = decompress_i3(avctx, (uint32_t *)s->current_frame->data[0],
525                             s->current_frame->linesize[0] / 4);
526     } else if (type == 17 || type == 33) {
527         uint32_t clr, *dst = (uint32_t *)s->current_frame->data[0];
528         int x, y;
529
530         frame->key_frame = 1;
531         bytestream2_skip(gb, 1);
532         if (avctx->bits_per_coded_sample == 16) {
533             uint16_t value = bytestream2_get_le16(gb);
534             int r, g, b;
535
536             r = (value      ) & 31;
537             g = (value >>  5) & 31;
538             b = (value >> 10) & 31;
539             clr = (r << 16) + (g << 8) + b;
540         } else {
541             clr = bytestream2_get_le24(gb);
542         }
543         for (y = 0; y < avctx->height; y++) {
544             for (x = 0; x < avctx->width; x++) {
545                 dst[x] = clr;
546             }
547             dst += s->current_frame->linesize[0] / 4;
548         }
549     } else if (type == 0 || type == 1) {
550         frame->key_frame = 0;
551
552         ret = av_frame_copy(s->current_frame, s->last_frame);
553         if (ret < 0)
554             return ret;
555
556         if (s->version == 1 || s->version == 2)
557             ret = decompress_p(avctx, (uint32_t *)s->current_frame->data[0],
558                                s->current_frame->linesize[0] / 4,
559                                (uint32_t *)s->last_frame->data[0],
560                                s->last_frame->linesize[0] / 4);
561         else
562             ret = decompress_p3(avctx, (uint32_t *)s->current_frame->data[0],
563                                 s->current_frame->linesize[0] / 4,
564                                 (uint32_t *)s->last_frame->data[0],
565                                 s->last_frame->linesize[0] / 4);
566         if (ret == 1)
567             return avpkt->size;
568     } else {
569         return AVERROR_PATCHWELCOME;
570     }
571
572     if (ret < 0)
573         return ret;
574
575     if (avctx->bits_per_coded_sample != 16) {
576         ret = av_frame_ref(data, s->current_frame);
577         if (ret < 0)
578             return ret;
579     } else {
580         uint8_t *dst = frame->data[0];
581         int x, y;
582
583         ret = av_frame_copy(frame, s->current_frame);
584         if (ret < 0)
585             return ret;
586
587         // scale up each sample by 8
588         for (y = 0; y < avctx->height; y++) {
589             // If the image is sufficiently aligned, compute 8 samples at once
590             if (!(((uintptr_t)dst) & 7)) {
591                 uint64_t *dst64 = (uint64_t *)dst;
592                 int w = avctx->width>>1;
593                 for (x = 0; x < w; x++) {
594                     dst64[x] = (dst64[x] << 3) & 0xFCFCFCFCFCFCFCFCULL;
595                 }
596                 x *= 8;
597             } else
598                 x = 0;
599             for (; x < avctx->width * 4; x++) {
600                 dst[x] = dst[x] << 3;
601             }
602             dst += frame->linesize[0];
603         }
604     }
605
606     frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
607
608     FFSWAP(AVFrame *, s->current_frame, s->last_frame);
609
610     frame->data[0]     += frame->linesize[0] * (avctx->height - 1);
611     frame->linesize[0] *= -1;
612
613     *got_frame = 1;
614
615     return avpkt->size;
616 }
617
618 static av_cold int decode_init(AVCodecContext *avctx)
619 {
620     SCPRContext *s = avctx->priv_data;
621
622     switch (avctx->bits_per_coded_sample) {
623     case 16: avctx->pix_fmt = AV_PIX_FMT_RGB0; break;
624     case 24:
625     case 32: avctx->pix_fmt = AV_PIX_FMT_BGR0; break;
626     default:
627         av_log(avctx, AV_LOG_ERROR, "Unsupported bitdepth %i\n", avctx->bits_per_coded_sample);
628         return AVERROR_INVALIDDATA;
629     }
630
631     s->get_freq = get_freq0;
632     s->decode = decode0;
633
634     s->cxshift = avctx->bits_per_coded_sample == 16 ? 0 : 2;
635     s->cbits = avctx->bits_per_coded_sample == 16 ? 0x1F : 0xFF;
636     s->nbx = (avctx->width + 15) / 16;
637     s->nby = (avctx->height + 15) / 16;
638     s->nbcount = s->nbx * s->nby;
639     s->blocks = av_malloc_array(s->nbcount, sizeof(*s->blocks));
640     if (!s->blocks)
641         return AVERROR(ENOMEM);
642
643     s->last_frame = av_frame_alloc();
644     s->current_frame = av_frame_alloc();
645     if (!s->last_frame || !s->current_frame)
646         return AVERROR(ENOMEM);
647
648     return 0;
649 }
650
651 static av_cold int decode_close(AVCodecContext *avctx)
652 {
653     SCPRContext *s = avctx->priv_data;
654
655     av_freep(&s->blocks);
656     av_frame_free(&s->last_frame);
657     av_frame_free(&s->current_frame);
658
659     return 0;
660 }
661
662 AVCodec ff_scpr_decoder = {
663     .name             = "scpr",
664     .long_name        = NULL_IF_CONFIG_SMALL("ScreenPressor"),
665     .type             = AVMEDIA_TYPE_VIDEO,
666     .id               = AV_CODEC_ID_SCPR,
667     .priv_data_size   = sizeof(SCPRContext),
668     .init             = decode_init,
669     .close            = decode_close,
670     .decode           = decode_frame,
671     .capabilities     = AV_CODEC_CAP_DR1,
672     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
673                         FF_CODEC_CAP_INIT_CLEANUP,
674 };