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
32
33 #define AIC_HDR_SIZE 24
34 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
35
42 };
43
45
47
49 8, 16, 19, 22, 22, 26, 26, 27,
50 16, 16, 22, 22, 26, 27, 27, 29,
51 19, 22, 26, 26, 27, 29, 29, 35,
52 22, 24, 27, 27, 29, 32, 34, 38,
53 26, 27, 29, 29, 32, 35, 38, 46,
54 27, 29, 34, 34, 35, 40, 46, 56,
55 29, 34, 34, 37, 40, 48, 56, 69,
56 34, 37, 38, 40, 48, 58, 69, 83,
57 };
58
60 0, 4, 1, 2, 5, 8, 12, 9,
61 6, 3, 7, 10, 13, 14, 11, 15,
62 47, 43, 46, 45, 42, 39, 35, 38,
63 41, 44, 40, 37, 34, 33, 36, 32,
64 16, 20, 17, 18, 21, 24, 28, 25,
65 22, 19, 23, 26, 29, 30, 27, 31,
66 63, 59, 62, 61, 58, 55, 51, 54,
67 57, 60, 56, 53, 50, 49, 52, 48,
68 };
69
71 64, 72, 65, 66, 73, 80, 88, 81,
72 74, 67, 75, 82, 89, 90, 83, 91,
73 0, 4, 1, 2, 5, 8, 12, 9,
74 6, 3, 7, 10, 13, 14, 11, 15,
75 16, 20, 17, 18, 21, 24, 28, 25,
76 22, 19, 23, 26, 29, 30, 27, 31,
77 155, 147, 154, 153, 146, 139, 131, 138,
78 145, 152, 144, 137, 130, 129, 136, 128,
79 47, 43, 46, 45, 42, 39, 35, 38,
80 41, 44, 40, 37, 34, 33, 36, 32,
81 63, 59, 62, 61, 58, 55, 51, 54,
82 57, 60, 56, 53, 50, 49, 52, 48,
83 96, 104, 97, 98, 105, 112, 120, 113,
84 106, 99, 107, 114, 121, 122, 115, 123,
85 68, 76, 69, 70, 77, 84, 92, 85,
86 78, 71, 79, 86, 93, 94, 87, 95,
87 100, 108, 101, 102, 109, 116, 124, 117,
88 110, 103, 111, 118, 125, 126, 119, 127,
89 187, 179, 186, 185, 178, 171, 163, 170,
90 177, 184, 176, 169, 162, 161, 168, 160,
91 159, 151, 158, 157, 150, 143, 135, 142,
92 149, 156, 148, 141, 134, 133, 140, 132,
93 191, 183, 190, 189, 182, 175, 167, 174,
94 181, 188, 180, 173, 166, 165, 172, 164,
95 };
96
98 0, 4, 1, 2, 5, 8, 12, 9,
99 6, 3, 7, 10, 13, 14, 11, 15,
100 31, 27, 30, 29, 26, 23, 19, 22,
101 25, 28, 24, 21, 18, 17, 20, 16,
102 32, 36, 33, 34, 37, 40, 44, 41,
103 38, 35, 39, 42, 45, 46, 43, 47,
104 63, 59, 62, 61, 58, 55, 51, 54,
105 57, 60, 56, 53, 50, 49, 52, 48,
106 };
107
109 16, 24, 17, 18, 25, 32, 40, 33,
110 26, 19, 27, 34, 41, 42, 35, 43,
111 0, 4, 1, 2, 5, 8, 12, 9,
112 6, 3, 7, 10, 13, 14, 11, 15,
113 20, 28, 21, 22, 29, 36, 44, 37,
114 30, 23, 31, 38, 45, 46, 39, 47,
115 95, 87, 94, 93, 86, 79, 71, 78,
116 85, 92, 84, 77, 70, 69, 76, 68,
117 63, 59, 62, 61, 58, 55, 51, 54,
118 57, 60, 56, 53, 50, 49, 52, 48,
119 91, 83, 90, 89, 82, 75, 67, 74,
120 81, 88, 80, 73, 66, 65, 72, 64,
121 112, 120, 113, 114, 121, 128, 136, 129,
122 122, 115, 123, 130, 137, 138, 131, 139,
123 96, 100, 97, 98, 101, 104, 108, 105,
124 102, 99, 103, 106, 109, 110, 107, 111,
125 116, 124, 117, 118, 125, 132, 140, 133,
126 126, 119, 127, 134, 141, 142, 135, 143,
127 191, 183, 190, 189, 182, 175, 167, 174,
128 181, 188, 180, 173, 166, 165, 172, 164,
129 159, 155, 158, 157, 154, 151, 147, 150,
130 153, 156, 152, 149, 146, 145, 148, 144,
131 187, 179, 186, 185, 178, 171, 163, 170,
132 177, 184, 176, 169, 162, 161, 168, 160,
133 };
134
137 };
138
144
150
153
157
159 {
162
163 if (src[0] != 1) {
166 }
170 }
174 if (frame_size > size) {
176 frame_size, size);
178 }
181 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
184 }
185 ctx->
quant = src[15];
187
188 return 0;
189 }
190
191 #define GET_CODE(val, type, add_bits) \
192 do { \
193 if (type) \
194 val = get_ue_golomb(gb); \
195 else \
196 val = get_unary(gb, 1, 31); \
197 if (add_bits) \
198 val = (val << add_bits) + get_bits(gb, add_bits); \
199 } while (0)
200
202 int band,
int slice_width,
int force_chroma)
203 {
204 int has_skips, coeff_type, coeff_bits, skip_type,
skip_bits;
209
213
214 if (has_skips) {
217
218 for (mb = 0; mb < slice_width; mb++) {
219 idx = -1;
220 do {
221 GET_CODE(val, skip_type, skip_bits);
222 if (val >= 0x10000)
224 idx += val + 1;
225 if (idx >= num_coeffs)
226 break;
227 GET_CODE(val, coeff_type, coeff_bits);
228 val++;
229 if (val >= 0x10000)
231 dst[scan[idx]] =
val;
232 } while (idx < num_coeffs - 1);
233 dst += num_coeffs;
234 }
235 } else {
236 for (mb = 0; mb < slice_width; mb++) {
237 for (idx = 0; idx < num_coeffs; idx++) {
238 GET_CODE(val, coeff_type, coeff_bits);
239 if (val >= 0x10000)
241 dst[scan[idx]] =
val;
242 }
243 dst += num_coeffs;
244 }
245 }
246 return 0;
247 }
248
250 int16_t **base, int16_t **ext)
251 {
252 int i, j;
253
254 for (i = 0; i < 4; i++) {
255 for (j = 0; j < 4; j++)
256 dst[scan[i * 8 + j]] = (*base)[j];
257 for (j = 0; j < 4; j++)
258 dst[scan[i * 8 + j + 4]] = (*ext)[j];
259 *base += 4;
260 *ext += 4;
261 }
262 for (; i < 8; i++) {
263 for (j = 0; j < 8; j++)
264 dst[scan[i * 8 + j]] = (*ext)[j];
265 *ext += 8;
266 }
267 }
268
270 int16_t **base, int16_t **ext,
271 int block_no)
272 {
273 int i, j;
274
275 if (block_no < 2) {
276 for (i = 0; i < 8; i++) {
277 for (j = 0; j < 4; j++)
278 dst[scan[i * 8 + j]] = (*base)[j];
279 for (j = 0; j < 4; j++)
280 dst[scan[i * 8 + j + 4]] = (*ext)[j];
281 *base += 4;
282 *ext += 4;
283 }
284 } else {
285 for (i = 0; i < 64; i++)
286 dst[scan[i]] = (*ext)[i];
287 *ext += 64;
288 }
289 }
290
292 {
293 int i;
294
295 for (i = 0; i < 64; i++) {
296 int val = (uint16_t)block[i];
297 int sign = val & 1;
298
299 block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
300 + sign;
301 }
302 }
303
306 {
317
318 Y = ctx->
frame->
data[0] + mb_x * 16 + mb_y * 16 * ystride;
319 for (i = 0; i < 2; i++)
320 C[i] = ctx->
frame->
data[i + 1] + mb_x * 8
323
328 i, slice_width,
330 return ret;
331
332 for (mb = 0; mb < slice_width; mb++) {
333 for (blk = 0; blk < 4; blk++) {
336 &base_y, &ext_y);
337 else
339 &base_y, &ext_y, blk);
342
344 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
346 } else {
347 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
349 ystride * 2);
350 }
351 }
352 Y += 16;
353
354 for (blk = 0; blk < 2; blk++) {
356 &base_c, &ext_c);
362 }
363 }
364
365 return 0;
366 }
367
370 {
373 int buf_size = avpkt->
size;
375 uint32_t off;
376 int x, y, ret;
377 int slice_size;
378
382
384
385 if (buf_size < off) {
388 }
389
391 if (ret < 0) {
393 return ret;
394 }
395
397 return ret;
398
401
404 slice_size = bytestream2_get_le16(&gb) * 4;
405 if (slice_size + off > buf_size || !slice_size) {
407 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
409 }
410
412 if (ret < 0) {
414 "Error decoding slice at %d.%d\n", x, y);
415 return ret;
416 }
417
418 off += slice_size;
419 }
420 }
421
422 *got_frame = 1;
423
425 }
426
428 {
430 int i;
432
434
436
438
439 for (i = 0; i < 64; i++)
440 scan[i] = i;
442 for (i = 0; i < 64; i++)
444
447
450 for (i = 1; i < 32; i++) {
454 break;
455 }
456 }
457
462
464 }
465
469
470 return 0;
471 }
472
474 {
476
478
479 return 0;
480 }
481
492 };
static const int aic_num_band_coeffs[NUM_BANDS]
void(* put_signed_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size)
int16_t * data_ptr[NUM_BANDS]
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static av_cold int init(AVCodecContext *avctx)
#define DECLARE_ALIGNED(n, t, v)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
static const uint8_t aic_c_scan[64]
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
bitstream reader API header.
static av_cold int aic_decode_init(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
static const uint8_t aic_y_scan[64]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_cold int aic_decode_close(AVCodecContext *avctx)
const char * name
Name of the codec implementation.
static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst, int band, int slice_width, int force_chroma)
static const uint8_t aic_c_ext_scan[192]
static const uint8_t *const aic_scan[NUM_BANDS]
enum AVPictureType pict_type
Picture type of the frame.
int width
picture width / height.
static const uint8_t aic_quant_matrix[64]
uint8_t idct_permutation[64]
IDCT input permutation.
static const int aic_band_off[NUM_BANDS]
static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, const uint8_t *src, int src_size)
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static unsigned int get_bits1(GetBitContext *s)
BYTE int const BYTE int int int height
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
static void recombine_block(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
static void recombine_block_il(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext, int block_no)
#define GET_CODE(val, type, add_bits)
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
int key_frame
1 -> keyframe, 0-> not
#define av_malloc_array(a, b)
static const uint8_t aic_y_ext_scan[192]
This structure stores compressed data.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
void(* idct)(int16_t *block)