33 #define AIC_HDR_SIZE 24
34 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
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,
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,
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,
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,
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,
174 if (frame_size > size) {
181 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
185 ctx->
quant = src[15];
191 #define GET_CODE(val, type, add_bits) \
194 val = get_ue_golomb(gb); \
196 val = get_unary(gb, 1, 31); \
198 val = (val << add_bits) + get_bits(gb, add_bits); \
202 int band,
int slice_width,
int force_chroma)
204 int has_skips, coeff_type, coeff_bits, skip_type,
skip_bits;
221 for (mb = 0; mb < slice_width; mb++) {
224 GET_CODE(val, skip_type, skip_bits);
228 if (idx >= num_coeffs)
230 GET_CODE(val, coeff_type, coeff_bits);
234 dst[scan[idx]] =
val;
235 }
while (idx < num_coeffs - 1);
239 for (mb = 0; mb < slice_width; mb++) {
240 for (idx = 0; idx < num_coeffs; idx++) {
241 GET_CODE(val, coeff_type, coeff_bits);
244 dst[scan[idx]] =
val;
253 int16_t **base, int16_t **ext)
257 for (i = 0; i < 4; i++) {
258 for (j = 0; j < 4; j++)
259 dst[scan[i * 8 + j]] = (*base)[j];
260 for (j = 0; j < 4; j++)
261 dst[scan[i * 8 + j + 4]] = (*ext)[j];
266 for (j = 0; j < 8; j++)
267 dst[scan[i * 8 + j]] = (*ext)[j];
273 int16_t **base, int16_t **ext,
279 for (i = 0; i < 8; i++) {
280 for (j = 0; j < 4; j++)
281 dst[scan[i * 8 + j]] = (*base)[j];
282 for (j = 0; j < 4; j++)
283 dst[scan[i * 8 + j + 4]] = (*ext)[j];
288 for (i = 0; i < 64; i++)
289 dst[scan[i]] = (*ext)[i];
298 for (i = 0; i < 64; i++) {
299 int val = (uint16_t)block[i];
302 block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
321 Y = ctx->
frame->
data[0] + mb_x * 16 + mb_y * 16 * ystride;
322 for (i = 0; i < 2; i++)
323 C[i] = ctx->
frame->
data[i + 1] + mb_x * 8
335 for (mb = 0; mb < slice_width; mb++) {
336 for (blk = 0; blk < 4; blk++) {
342 &base_y, &ext_y, blk);
347 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
350 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
357 for (blk = 0; blk < 2; blk++) {
376 int buf_size = avpkt->
size;
388 if (buf_size < off) {
407 slice_size = bytestream2_get_le16(&gb) * 4;
408 if (slice_size + off > buf_size || !slice_size) {
410 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
417 "Error decoding slice at %d.%d\n", x, y);
442 for (i = 0; i < 64; i++)
445 for (i = 0; i < 64; i++)
453 for (i = 1; i < 32; i++) {
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)
static const uint8_t aic_c_scan[64]
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
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)
Libavcodec external API header.
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)
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)