Coverage Report

Created: 2025-08-28 07:12

/src/ffmpeg/libavcodec/aic.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Apple Intermediate Codec decoder
3
 *
4
 * Copyright (c) 2013 Konstantin Shishkov
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 <inttypes.h>
24
25
#include "libavutil/mem.h"
26
#include "libavutil/mem_internal.h"
27
28
#include "avcodec.h"
29
#include "bytestream.h"
30
#include "codec_internal.h"
31
#include "get_bits.h"
32
#include "golomb.h"
33
#include "idctdsp.h"
34
#include "thread.h"
35
#include "unary.h"
36
37
244k
#define AIC_HDR_SIZE    24
38
117k
#define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
39
40
enum AICBands {
41
    COEFF_LUMA = 0,
42
    COEFF_CHROMA,
43
    COEFF_LUMA_EXT,
44
    COEFF_CHROMA_EXT,
45
    NUM_BANDS
46
};
47
48
static const uint8_t aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
49
50
static const uint16_t aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
51
52
static const uint8_t aic_quant_matrix[64] = {
53
     8, 16, 19, 22, 22, 26, 26, 27,
54
    16, 16, 22, 22, 26, 27, 27, 29,
55
    19, 22, 26, 26, 27, 29, 29, 35,
56
    22, 24, 27, 27, 29, 32, 34, 38,
57
    26, 27, 29, 29, 32, 35, 38, 46,
58
    27, 29, 34, 34, 35, 40, 46, 56,
59
    29, 34, 34, 37, 40, 48, 56, 69,
60
    34, 37, 38, 40, 48, 58, 69, 83,
61
};
62
63
static const uint8_t aic_y_scan[64] = {
64
     0,  4,  1,  2,  5,  8, 12,  9,
65
     6,  3,  7, 10, 13, 14, 11, 15,
66
    47, 43, 46, 45, 42, 39, 35, 38,
67
    41, 44, 40, 37, 34, 33, 36, 32,
68
    16, 20, 17, 18, 21, 24, 28, 25,
69
    22, 19, 23, 26, 29, 30, 27, 31,
70
    63, 59, 62, 61, 58, 55, 51, 54,
71
    57, 60, 56, 53, 50, 49, 52, 48,
72
};
73
74
static const uint8_t aic_y_ext_scan[192] = {
75
     64,  72,  65,  66,  73,  80,  88,  81,
76
     74,  67,  75,  82,  89,  90,  83,  91,
77
      0,   4,   1,   2,   5,   8,  12,   9,
78
      6,   3,   7,  10,  13,  14,  11,  15,
79
     16,  20,  17,  18,  21,  24,  28,  25,
80
     22,  19,  23,  26,  29,  30,  27,  31,
81
    155, 147, 154, 153, 146, 139, 131, 138,
82
    145, 152, 144, 137, 130, 129, 136, 128,
83
     47,  43,  46,  45,  42,  39,  35,  38,
84
     41,  44,  40,  37,  34,  33,  36,  32,
85
     63,  59,  62,  61,  58,  55,  51,  54,
86
     57,  60,  56,  53,  50,  49,  52,  48,
87
     96, 104,  97,  98, 105, 112, 120, 113,
88
    106,  99, 107, 114, 121, 122, 115, 123,
89
     68,  76,  69,  70,  77,  84,  92,  85,
90
     78,  71,  79,  86,  93,  94,  87,  95,
91
    100, 108, 101, 102, 109, 116, 124, 117,
92
    110, 103, 111, 118, 125, 126, 119, 127,
93
    187, 179, 186, 185, 178, 171, 163, 170,
94
    177, 184, 176, 169, 162, 161, 168, 160,
95
    159, 151, 158, 157, 150, 143, 135, 142,
96
    149, 156, 148, 141, 134, 133, 140, 132,
97
    191, 183, 190, 189, 182, 175, 167, 174,
98
    181, 188, 180, 173, 166, 165, 172, 164,
99
};
100
101
static const uint8_t aic_c_scan[64] = {
102
     0,  4,  1,  2,  5,  8, 12,  9,
103
     6,  3,  7, 10, 13, 14, 11, 15,
104
    31, 27, 30, 29, 26, 23, 19, 22,
105
    25, 28, 24, 21, 18, 17, 20, 16,
106
    32, 36, 33, 34, 37, 40, 44, 41,
107
    38, 35, 39, 42, 45, 46, 43, 47,
108
    63, 59, 62, 61, 58, 55, 51, 54,
109
    57, 60, 56, 53, 50, 49, 52, 48,
110
};
111
112
static const uint8_t aic_c_ext_scan[192] = {
113
     16,  24,  17,  18,  25,  32,  40,  33,
114
     26,  19,  27,  34,  41,  42,  35,  43,
115
      0,   4,   1,   2,   5,   8,  12,   9,
116
      6,   3,   7,  10,  13,  14,  11,  15,
117
     20,  28,  21,  22,  29,  36,  44,  37,
118
     30,  23,  31,  38,  45,  46,  39,  47,
119
     95,  87,  94,  93,  86,  79,  71,  78,
120
     85,  92,  84,  77,  70,  69,  76,  68,
121
     63,  59,  62,  61,  58,  55,  51,  54,
122
     57,  60,  56,  53,  50,  49,  52,  48,
123
     91,  83,  90,  89,  82,  75,  67,  74,
124
     81,  88,  80,  73,  66,  65,  72,  64,
125
    112, 120, 113, 114, 121, 128, 136, 129,
126
    122, 115, 123, 130, 137, 138, 131, 139,
127
     96, 100,  97,  98, 101, 104, 108, 105,
128
    102,  99, 103, 106, 109, 110, 107, 111,
129
    116, 124, 117, 118, 125, 132, 140, 133,
130
    126, 119, 127, 134, 141, 142, 135, 143,
131
    191, 183, 190, 189, 182, 175, 167, 174,
132
    181, 188, 180, 173, 166, 165, 172, 164,
133
    159, 155, 158, 157, 154, 151, 147, 150,
134
    153, 156, 152, 149, 146, 145, 148, 144,
135
    187, 179, 186, 185, 178, 171, 163, 170,
136
    177, 184, 176, 169, 162, 161, 168, 160,
137
};
138
139
static const uint8_t * const aic_scan[NUM_BANDS] = {
140
    aic_y_scan, aic_c_scan, aic_y_ext_scan, aic_c_ext_scan
141
};
142
143
typedef struct AICContext {
144
    AVCodecContext *avctx;
145
    AVFrame        *frame;
146
    IDCTDSPContext idsp;
147
148
    int            num_x_slices;
149
    int            slice_width;
150
    int            mb_width, mb_height;
151
    int            quant;
152
    int            interlaced;
153
154
    int16_t        *slice_data;
155
    int16_t        *data_ptr[NUM_BANDS];
156
157
    DECLARE_ALIGNED(16, int16_t, block)[64];
158
    DECLARE_ALIGNED(16, uint8_t, quant_matrix)[64];
159
} AICContext;
160
161
static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
162
127k
{
163
127k
    uint32_t frame_size;
164
127k
    int width, height;
165
166
127k
    if (src[0] != 1) {
167
1.33k
        av_log(ctx->avctx, AV_LOG_ERROR, "Invalid version %d\n", src[0]);
168
1.33k
        return AVERROR_INVALIDDATA;
169
1.33k
    }
170
125k
    if (src[1] != AIC_HDR_SIZE - 2) {
171
321
        av_log(ctx->avctx, AV_LOG_ERROR, "Invalid header size %d\n", src[1]);
172
321
        return AVERROR_INVALIDDATA;
173
321
    }
174
125k
    frame_size = AV_RB32(src + 2);
175
125k
    width      = AV_RB16(src + 6);
176
125k
    height     = AV_RB16(src + 8);
177
125k
    if (frame_size > size) {
178
390
        av_log(ctx->avctx, AV_LOG_ERROR, "Frame size should be %"PRIu32" got %d\n",
179
390
               frame_size, size);
180
390
        return AVERROR_INVALIDDATA;
181
390
    }
182
125k
    if (width != ctx->avctx->width || height != ctx->avctx->height) {
183
5.59k
        av_log(ctx->avctx, AV_LOG_ERROR,
184
5.59k
               "Picture dimension changed: old: %d x %d, new: %d x %d\n",
185
5.59k
               ctx->avctx->width, ctx->avctx->height, width, height);
186
5.59k
        return AVERROR_INVALIDDATA;
187
5.59k
    }
188
119k
    ctx->quant      = src[15];
189
119k
    ctx->interlaced = ((src[16] >> 4) == 3);
190
191
119k
    return 0;
192
125k
}
193
194
#define GET_CODE(val, type, add_bits)                         \
195
6.03M
    do {                                                      \
196
6.03M
        if (type)                                             \
197
6.03M
            val = get_ue_golomb(gb);                          \
198
6.03M
        else                                                  \
199
6.03M
            val = get_unary(gb, 1, 31);                       \
200
6.03M
        if (add_bits)                                         \
201
6.03M
            val = (val << add_bits) + get_bits(gb, add_bits); \
202
6.03M
    } while (0)
203
204
static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
205
                             int band, int slice_width, int force_chroma)
206
460k
{
207
460k
    int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
208
460k
    const int num_coeffs = aic_num_band_coeffs[band];
209
460k
    const uint8_t *scan = aic_scan[band | force_chroma];
210
460k
    int mb, idx;
211
460k
    unsigned val;
212
213
460k
    if (get_bits_left(gb) < 5)
214
444
        return AVERROR_INVALIDDATA;
215
216
459k
    has_skips  = get_bits1(gb);
217
459k
    coeff_type = get_bits1(gb);
218
459k
    coeff_bits = get_bits(gb, 3);
219
220
459k
    if (has_skips) {
221
432k
        skip_type = get_bits1(gb);
222
432k
        skip_bits = get_bits(gb, 3);
223
224
921k
        for (mb = 0; mb < slice_width; mb++) {
225
488k
            idx = -1;
226
1.30M
            do {
227
1.30M
                GET_CODE(val, skip_type, skip_bits);
228
1.30M
                if (val >= 0x10000)
229
404
                    return AVERROR_INVALIDDATA;
230
1.29M
                idx += val + 1;
231
1.29M
                if (idx >= num_coeffs)
232
483k
                    break;
233
815k
                GET_CODE(val, coeff_type, coeff_bits);
234
815k
                val++;
235
815k
                if (val >= 0x10000)
236
439
                    return AVERROR_INVALIDDATA;
237
815k
                dst[scan[idx]] = val;
238
815k
            } while (idx < num_coeffs - 1);
239
488k
            dst += num_coeffs;
240
488k
        }
241
432k
    } else {
242
69.6k
        for (mb = 0; mb < slice_width; mb++) {
243
3.95M
            for (idx = 0; idx < num_coeffs; idx++) {
244
3.91M
                GET_CODE(val, coeff_type, coeff_bits);
245
3.91M
                if (val >= 0x10000)
246
297
                    return AVERROR_INVALIDDATA;
247
3.91M
                dst[scan[idx]] = val;
248
3.91M
            }
249
42.9k
            dst += num_coeffs;
250
42.9k
        }
251
26.6k
    }
252
458k
    return 0;
253
459k
}
254
255
static void recombine_block(int16_t *dst, const uint8_t *scan,
256
                            int16_t **base, int16_t **ext)
257
760k
{
258
760k
    int i, j;
259
260
3.80M
    for (i = 0; i < 4; i++) {
261
15.2M
        for (j = 0; j < 4; j++)
262
12.1M
            dst[scan[i * 8 + j]]     = (*base)[j];
263
15.2M
        for (j = 0; j < 4; j++)
264
12.1M
            dst[scan[i * 8 + j + 4]] = (*ext)[j];
265
3.04M
        *base += 4;
266
3.04M
        *ext  += 4;
267
3.04M
    }
268
3.80M
    for (; i < 8; i++) {
269
27.3M
        for (j = 0; j < 8; j++)
270
24.3M
            dst[scan[i * 8 + j]] = (*ext)[j];
271
3.04M
        *ext  += 8;
272
3.04M
    }
273
760k
}
274
275
static void recombine_block_il(int16_t *dst, const uint8_t *scan,
276
                               int16_t **base, int16_t **ext,
277
                               int block_no)
278
21.4k
{
279
21.4k
    int i, j;
280
281
21.4k
    if (block_no < 2) {
282
96.3k
        for (i = 0; i < 8; i++) {
283
428k
            for (j = 0; j < 4; j++)
284
342k
                dst[scan[i * 8 + j]]     = (*base)[j];
285
428k
            for (j = 0; j < 4; j++)
286
342k
                dst[scan[i * 8 + j + 4]] = (*ext)[j];
287
85.6k
            *base += 4;
288
85.6k
            *ext  += 4;
289
85.6k
        }
290
10.7k
    } else {
291
695k
        for (i = 0; i < 64; i++)
292
685k
            dst[scan[i]] = (*ext)[i];
293
10.7k
        *ext += 64;
294
10.7k
    }
295
21.4k
}
296
297
static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
298
782k
{
299
782k
    int i;
300
301
50.8M
    for (i = 0; i < 64; i++) {
302
50.0M
        int val  = (uint16_t)block[i];
303
50.0M
        int sign = val & 1;
304
305
50.0M
        block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
306
50.0M
                   + sign;
307
50.0M
    }
308
782k
}
309
310
static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
311
                            const uint8_t *src, int src_size)
312
115k
{
313
115k
    GetBitContext gb;
314
115k
    int ret, i, mb, blk;
315
115k
    int slice_width = FFMIN(ctx->slice_width, ctx->mb_width - mb_x);
316
115k
    int last_row = mb_y && mb_y == ctx->mb_height - 1;
317
115k
    int y_pos, c_pos;
318
115k
    uint8_t *Y, *C[2];
319
115k
    uint8_t *dst;
320
115k
    int16_t *base_y = ctx->data_ptr[COEFF_LUMA];
321
115k
    int16_t *base_c = ctx->data_ptr[COEFF_CHROMA];
322
115k
    int16_t *ext_y  = ctx->data_ptr[COEFF_LUMA_EXT];
323
115k
    int16_t *ext_c  = ctx->data_ptr[COEFF_CHROMA_EXT];
324
115k
    const int ystride = ctx->frame->linesize[0];
325
326
115k
    if (last_row) {
327
297
        y_pos = (ctx->avctx->height - 16);
328
297
        c_pos = ((ctx->avctx->height+1)/2 - 8);
329
115k
    } else {
330
115k
        y_pos = mb_y * 16;
331
115k
        c_pos = mb_y * 8;
332
115k
    }
333
334
115k
    Y = ctx->frame->data[0] + mb_x * 16 + y_pos * ystride;
335
347k
    for (i = 0; i < 2; i++)
336
231k
        C[i] = ctx->frame->data[i + 1] + mb_x * 8
337
231k
               + c_pos * ctx->frame->linesize[i + 1];
338
115k
    init_get_bits(&gb, src, src_size * 8);
339
340
115k
    memset(ctx->slice_data, 0,
341
115k
           sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
342
574k
    for (i = 0; i < NUM_BANDS; i++)
343
460k
        if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
344
460k
                                     i, slice_width,
345
460k
                                     !ctx->interlaced)) < 0)
346
1.58k
            return ret;
347
348
244k
    for (mb = 0; mb < slice_width; mb++) {
349
651k
        for (blk = 0; blk < 4; blk++) {
350
521k
            if (!ctx->interlaced)
351
500k
                recombine_block(ctx->block, ctx->idsp.idct_permutation,
352
500k
                                &base_y, &ext_y);
353
21.4k
            else
354
21.4k
                recombine_block_il(ctx->block, ctx->idsp.idct_permutation,
355
21.4k
                                   &base_y, &ext_y, blk);
356
521k
            unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
357
521k
            ctx->idsp.idct(ctx->block);
358
359
521k
            if (!ctx->interlaced) {
360
500k
                dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
361
500k
                ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
362
500k
            } else {
363
21.4k
                dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
364
21.4k
                ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
365
21.4k
                                                    ystride * 2);
366
21.4k
            }
367
521k
        }
368
130k
        Y += 16;
369
370
391k
        for (blk = 0; blk < 2; blk++) {
371
260k
            recombine_block(ctx->block, ctx->idsp.idct_permutation,
372
260k
                            &base_c, &ext_c);
373
260k
            unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
374
260k
            ctx->idsp.idct(ctx->block);
375
260k
            ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
376
260k
                                                ctx->frame->linesize[blk + 1]);
377
260k
            C[blk] += 8;
378
260k
        }
379
130k
    }
380
381
114k
    return 0;
382
115k
}
383
384
static int aic_decode_frame(AVCodecContext *avctx, AVFrame *frame,
385
                            int *got_frame, AVPacket *avpkt)
386
582k
{
387
582k
    AICContext *ctx    = avctx->priv_data;
388
582k
    const uint8_t *buf = avpkt->data;
389
582k
    int buf_size       = avpkt->size;
390
582k
    GetByteContext gb;
391
582k
    uint32_t off;
392
582k
    int x, y, ret;
393
582k
    int slice_size;
394
395
582k
    ctx->frame            = frame;
396
397
582k
    off = FFALIGN(AIC_HDR_SIZE + ctx->num_x_slices * ctx->mb_height * 2, 4);
398
399
582k
    if (buf_size < off) {
400
454k
        av_log(avctx, AV_LOG_ERROR, "Too small frame\n");
401
454k
        return AVERROR_INVALIDDATA;
402
454k
    }
403
404
127k
    ret = aic_decode_header(ctx, buf, buf_size);
405
127k
    if (ret < 0) {
406
7.64k
        av_log(avctx, AV_LOG_ERROR, "Invalid header\n");
407
7.64k
        return ret;
408
7.64k
    }
409
410
119k
    if ((ret = ff_thread_get_buffer(avctx, ctx->frame, 0)) < 0)
411
490
        return ret;
412
413
118k
    bytestream2_init(&gb, buf + AIC_HDR_SIZE,
414
118k
                     ctx->num_x_slices * ctx->mb_height * 2);
415
416
232k
    for (y = 0; y < ctx->mb_height; y++) {
417
234k
        for (x = 0; x < ctx->mb_width; x += ctx->slice_width) {
418
120k
            slice_size = bytestream2_get_le16(&gb) * 4;
419
120k
            if (slice_size + off > buf_size || !slice_size) {
420
4.12k
                av_log(avctx, AV_LOG_ERROR,
421
4.12k
                       "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
422
4.12k
                return AVERROR_INVALIDDATA;
423
4.12k
            }
424
425
115k
            ret = aic_decode_slice(ctx, x, y, buf + off, slice_size);
426
115k
            if (ret < 0) {
427
1.58k
                av_log(avctx, AV_LOG_ERROR,
428
1.58k
                       "Error decoding slice at %d.%d\n", x, y);
429
1.58k
                return ret;
430
1.58k
            }
431
432
114k
            off += slice_size;
433
114k
        }
434
119k
    }
435
436
113k
    *got_frame = 1;
437
438
113k
    return avpkt->size;
439
118k
}
440
441
static av_cold int aic_decode_init(AVCodecContext *avctx)
442
1.26k
{
443
1.26k
    AICContext *ctx = avctx->priv_data;
444
1.26k
    int i;
445
446
1.26k
    ctx->avctx = avctx;
447
448
1.26k
    avctx->pix_fmt = AV_PIX_FMT_YUV420P;
449
450
1.26k
    ff_idctdsp_init(&ctx->idsp, avctx);
451
452
82.1k
    for (i = 0; i < 64; i++)
453
80.8k
        ctx->quant_matrix[ctx->idsp.idct_permutation[i]] = aic_quant_matrix[i];
454
455
1.26k
    ctx->mb_width  = FFALIGN(avctx->width,  16) >> 4;
456
1.26k
    ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
457
458
1.26k
    ctx->num_x_slices = (ctx->mb_width + 15) >> 4;
459
1.26k
    ctx->slice_width  = 16;
460
1.45M
    for (i = 1; i < ctx->mb_width; i++) {
461
1.45M
        if (!(ctx->mb_width % i) && (ctx->mb_width / i <= 32)) {
462
519
            ctx->slice_width  = ctx->mb_width / i;
463
519
            ctx->num_x_slices = i;
464
519
            break;
465
519
        }
466
1.45M
    }
467
468
1.26k
    ctx->slice_data = av_calloc(ctx->slice_width, AIC_BAND_COEFFS * sizeof(*ctx->slice_data));
469
1.26k
    if (!ctx->slice_data) {
470
0
        av_log(avctx, AV_LOG_ERROR, "Error allocating slice buffer\n");
471
472
0
        return AVERROR(ENOMEM);
473
0
    }
474
475
6.32k
    for (i = 0; i < NUM_BANDS; i++)
476
5.05k
        ctx->data_ptr[i] = ctx->slice_data + ctx->slice_width
477
5.05k
                                             * aic_band_off[i];
478
479
1.26k
    return 0;
480
1.26k
}
481
482
static av_cold int aic_decode_close(AVCodecContext *avctx)
483
1.26k
{
484
1.26k
    AICContext *ctx = avctx->priv_data;
485
486
1.26k
    av_freep(&ctx->slice_data);
487
488
1.26k
    return 0;
489
1.26k
}
490
491
const FFCodec ff_aic_decoder = {
492
    .p.name         = "aic",
493
    CODEC_LONG_NAME("Apple Intermediate Codec"),
494
    .p.type         = AVMEDIA_TYPE_VIDEO,
495
    .p.id           = AV_CODEC_ID_AIC,
496
    .priv_data_size = sizeof(AICContext),
497
    .init           = aic_decode_init,
498
    .close          = aic_decode_close,
499
    FF_CODEC_DECODE_CB(aic_decode_frame),
500
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
501
};