Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/aic.c
Line
Count
Source
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
126k
{
163
126k
    uint32_t frame_size;
164
126k
    int width, height;
165
166
126k
    if (src[0] != 1) {
167
1.15k
        av_log(ctx->avctx, AV_LOG_ERROR, "Invalid version %d\n", src[0]);
168
1.15k
        return AVERROR_INVALIDDATA;
169
1.15k
    }
170
125k
    if (src[1] != AIC_HDR_SIZE - 2) {
171
346
        av_log(ctx->avctx, AV_LOG_ERROR, "Invalid header size %d\n", src[1]);
172
346
        return AVERROR_INVALIDDATA;
173
346
    }
174
124k
    frame_size = AV_RB32(src + 2);
175
124k
    width      = AV_RB16(src + 6);
176
124k
    height     = AV_RB16(src + 8);
177
124k
    if (frame_size > size) {
178
395
        av_log(ctx->avctx, AV_LOG_ERROR, "Frame size should be %"PRIu32" got %d\n",
179
395
               frame_size, size);
180
395
        return AVERROR_INVALIDDATA;
181
395
    }
182
124k
    if (width != ctx->avctx->width || height != ctx->avctx->height) {
183
5.20k
        av_log(ctx->avctx, AV_LOG_ERROR,
184
5.20k
               "Picture dimension changed: old: %d x %d, new: %d x %d\n",
185
5.20k
               ctx->avctx->width, ctx->avctx->height, width, height);
186
5.20k
        return AVERROR_INVALIDDATA;
187
5.20k
    }
188
119k
    ctx->quant      = src[15];
189
119k
    ctx->interlaced = ((src[16] >> 4) == 3);
190
191
119k
    return 0;
192
124k
}
193
194
#define GET_CODE(val, type, add_bits)                         \
195
6.04M
    do {                                                      \
196
6.04M
        if (type)                                             \
197
6.04M
            val = get_ue_golomb(gb);                          \
198
6.04M
        else                                                  \
199
6.04M
            val = get_unary(gb, 1, 31);                       \
200
6.04M
        if (add_bits)                                         \
201
6.04M
            val = (val << add_bits) + get_bits(gb, add_bits); \
202
6.04M
    } while (0)
203
204
static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
205
                             int band, int slice_width, int force_chroma)
206
459k
{
207
459k
    int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
208
459k
    const int num_coeffs = aic_num_band_coeffs[band];
209
459k
    const uint8_t *scan = aic_scan[band | force_chroma];
210
459k
    int mb, idx;
211
459k
    unsigned val;
212
213
459k
    if (get_bits_left(gb) < 5)
214
457
        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
917k
        for (mb = 0; mb < slice_width; mb++) {
225
485k
            idx = -1;
226
1.28M
            do {
227
1.28M
                GET_CODE(val, skip_type, skip_bits);
228
1.28M
                if (val >= 0x10000)
229
402
                    return AVERROR_INVALIDDATA;
230
1.28M
                idx += val + 1;
231
1.28M
                if (idx >= num_coeffs)
232
480k
                    break;
233
803k
                GET_CODE(val, coeff_type, coeff_bits);
234
803k
                val++;
235
803k
                if (val >= 0x10000)
236
462
                    return AVERROR_INVALIDDATA;
237
803k
                dst[scan[idx]] = val;
238
803k
            } while (idx < num_coeffs - 1);
239
484k
            dst += num_coeffs;
240
484k
        }
241
432k
    } else {
242
69.5k
        for (mb = 0; mb < slice_width; mb++) {
243
3.99M
            for (idx = 0; idx < num_coeffs; idx++) {
244
3.95M
                GET_CODE(val, coeff_type, coeff_bits);
245
3.95M
                if (val >= 0x10000)
246
289
                    return AVERROR_INVALIDDATA;
247
3.95M
                dst[scan[idx]] = val;
248
3.95M
            }
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
756k
{
258
756k
    int i, j;
259
260
3.78M
    for (i = 0; i < 4; i++) {
261
15.1M
        for (j = 0; j < 4; j++)
262
12.0M
            dst[scan[i * 8 + j]]     = (*base)[j];
263
15.1M
        for (j = 0; j < 4; j++)
264
12.0M
            dst[scan[i * 8 + j + 4]] = (*ext)[j];
265
3.02M
        *base += 4;
266
3.02M
        *ext  += 4;
267
3.02M
    }
268
3.78M
    for (; i < 8; i++) {
269
27.2M
        for (j = 0; j < 8; j++)
270
24.1M
            dst[scan[i * 8 + j]] = (*ext)[j];
271
3.02M
        *ext  += 8;
272
3.02M
    }
273
756k
}
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
20.8k
{
279
20.8k
    int i, j;
280
281
20.8k
    if (block_no < 2) {
282
93.7k
        for (i = 0; i < 8; i++) {
283
416k
            for (j = 0; j < 4; j++)
284
333k
                dst[scan[i * 8 + j]]     = (*base)[j];
285
416k
            for (j = 0; j < 4; j++)
286
333k
                dst[scan[i * 8 + j + 4]] = (*ext)[j];
287
83.3k
            *base += 4;
288
83.3k
            *ext  += 4;
289
83.3k
        }
290
10.4k
    } else {
291
676k
        for (i = 0; i < 64; i++)
292
666k
            dst[scan[i]] = (*ext)[i];
293
10.4k
        *ext += 64;
294
10.4k
    }
295
20.8k
}
296
297
static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
298
776k
{
299
776k
    int i;
300
301
50.4M
    for (i = 0; i < 64; i++) {
302
49.7M
        int val  = (uint16_t)block[i];
303
49.7M
        int sign = val & 1;
304
305
49.7M
        block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
306
49.7M
                   + sign;
307
49.7M
    }
308
776k
}
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
306
        y_pos = (ctx->avctx->height - 16);
328
306
        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
459k
        if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
344
459k
                                     i, slice_width,
345
459k
                                     !ctx->interlaced)) < 0)
346
1.61k
            return ret;
347
348
243k
    for (mb = 0; mb < slice_width; mb++) {
349
647k
        for (blk = 0; blk < 4; blk++) {
350
517k
            if (!ctx->interlaced)
351
497k
                recombine_block(ctx->block, ctx->idsp.idct_permutation,
352
497k
                                &base_y, &ext_y);
353
20.8k
            else
354
20.8k
                recombine_block_il(ctx->block, ctx->idsp.idct_permutation,
355
20.8k
                                   &base_y, &ext_y, blk);
356
517k
            unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
357
517k
            ctx->idsp.idct(ctx->block);
358
359
517k
            if (!ctx->interlaced) {
360
497k
                dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
361
497k
                ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
362
497k
            } else {
363
20.8k
                dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
364
20.8k
                ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
365
20.8k
                                                    ystride * 2);
366
20.8k
            }
367
517k
        }
368
129k
        Y += 16;
369
370
388k
        for (blk = 0; blk < 2; blk++) {
371
258k
            recombine_block(ctx->block, ctx->idsp.idct_permutation,
372
258k
                            &base_c, &ext_c);
373
258k
            unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
374
258k
            ctx->idsp.idct(ctx->block);
375
258k
            ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
376
258k
                                                ctx->frame->linesize[blk + 1]);
377
258k
            C[blk] += 8;
378
258k
        }
379
129k
    }
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
507k
{
387
507k
    AICContext *ctx    = avctx->priv_data;
388
507k
    const uint8_t *buf = avpkt->data;
389
507k
    int buf_size       = avpkt->size;
390
507k
    GetByteContext gb;
391
507k
    uint32_t off;
392
507k
    int x, y, ret;
393
507k
    int slice_size;
394
395
507k
    ctx->frame            = frame;
396
397
507k
    off = FFALIGN(AIC_HDR_SIZE + ctx->num_x_slices * ctx->mb_height * 2, 4);
398
399
507k
    if (buf_size < off) {
400
381k
        av_log(avctx, AV_LOG_ERROR, "Too small frame\n");
401
381k
        return AVERROR_INVALIDDATA;
402
381k
    }
403
404
126k
    ret = aic_decode_header(ctx, buf, buf_size);
405
126k
    if (ret < 0) {
406
7.10k
        av_log(avctx, AV_LOG_ERROR, "Invalid header\n");
407
7.10k
        return ret;
408
7.10k
    }
409
410
119k
    if ((ret = ff_thread_get_buffer(avctx, ctx->frame, 0)) < 0)
411
485
        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.07k
                av_log(avctx, AV_LOG_ERROR,
421
4.07k
                       "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
422
4.07k
                return AVERROR_INVALIDDATA;
423
4.07k
            }
424
425
115k
            ret = aic_decode_slice(ctx, x, y, buf + off, slice_size);
426
115k
            if (ret < 0) {
427
1.61k
                av_log(avctx, AV_LOG_ERROR,
428
1.61k
                       "Error decoding slice at %d.%d\n", x, y);
429
1.61k
                return ret;
430
1.61k
            }
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.20k
{
443
1.20k
    AICContext *ctx = avctx->priv_data;
444
1.20k
    int i;
445
446
1.20k
    ctx->avctx = avctx;
447
448
1.20k
    avctx->pix_fmt = AV_PIX_FMT_YUV420P;
449
450
1.20k
    ff_idctdsp_init(&ctx->idsp, avctx);
451
452
78.0k
    for (i = 0; i < 64; i++)
453
76.8k
        ctx->quant_matrix[ctx->idsp.idct_permutation[i]] = aic_quant_matrix[i];
454
455
1.20k
    ctx->mb_width  = FFALIGN(avctx->width,  16) >> 4;
456
1.20k
    ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
457
458
1.20k
    ctx->num_x_slices = (ctx->mb_width + 15) >> 4;
459
1.20k
    ctx->slice_width  = 16;
460
654k
    for (i = 1; i < ctx->mb_width; i++) {
461
653k
        if (!(ctx->mb_width % i) && (ctx->mb_width / i <= 32)) {
462
474
            ctx->slice_width  = ctx->mb_width / i;
463
474
            ctx->num_x_slices = i;
464
474
            break;
465
474
        }
466
653k
    }
467
468
1.20k
    ctx->slice_data = av_calloc(ctx->slice_width, AIC_BAND_COEFFS * sizeof(*ctx->slice_data));
469
1.20k
    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.00k
    for (i = 0; i < NUM_BANDS; i++)
476
4.80k
        ctx->data_ptr[i] = ctx->slice_data + ctx->slice_width
477
4.80k
                                             * aic_band_off[i];
478
479
1.20k
    return 0;
480
1.20k
}
481
482
static av_cold int aic_decode_close(AVCodecContext *avctx)
483
1.20k
{
484
1.20k
    AICContext *ctx = avctx->priv_data;
485
486
1.20k
    av_freep(&ctx->slice_data);
487
488
1.20k
    return 0;
489
1.20k
}
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
};