36 #define AIC_HDR_SIZE 24
37 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
52 8, 16, 19, 22, 22, 26, 26, 27,
53 16, 16, 22, 22, 26, 27, 27, 29,
54 19, 22, 26, 26, 27, 29, 29, 35,
55 22, 24, 27, 27, 29, 32, 34, 38,
56 26, 27, 29, 29, 32, 35, 38, 46,
57 27, 29, 34, 34, 35, 40, 46, 56,
58 29, 34, 34, 37, 40, 48, 56, 69,
59 34, 37, 38, 40, 48, 58, 69, 83,
63 0, 4, 1, 2, 5, 8, 12, 9,
64 6, 3, 7, 10, 13, 14, 11, 15,
65 47, 43, 46, 45, 42, 39, 35, 38,
66 41, 44, 40, 37, 34, 33, 36, 32,
67 16, 20, 17, 18, 21, 24, 28, 25,
68 22, 19, 23, 26, 29, 30, 27, 31,
69 63, 59, 62, 61, 58, 55, 51, 54,
70 57, 60, 56, 53, 50, 49, 52, 48,
74 64, 72, 65, 66, 73, 80, 88, 81,
75 74, 67, 75, 82, 89, 90, 83, 91,
76 0, 4, 1, 2, 5, 8, 12, 9,
77 6, 3, 7, 10, 13, 14, 11, 15,
78 16, 20, 17, 18, 21, 24, 28, 25,
79 22, 19, 23, 26, 29, 30, 27, 31,
80 155, 147, 154, 153, 146, 139, 131, 138,
81 145, 152, 144, 137, 130, 129, 136, 128,
82 47, 43, 46, 45, 42, 39, 35, 38,
83 41, 44, 40, 37, 34, 33, 36, 32,
84 63, 59, 62, 61, 58, 55, 51, 54,
85 57, 60, 56, 53, 50, 49, 52, 48,
86 96, 104, 97, 98, 105, 112, 120, 113,
87 106, 99, 107, 114, 121, 122, 115, 123,
88 68, 76, 69, 70, 77, 84, 92, 85,
89 78, 71, 79, 86, 93, 94, 87, 95,
90 100, 108, 101, 102, 109, 116, 124, 117,
91 110, 103, 111, 118, 125, 126, 119, 127,
92 187, 179, 186, 185, 178, 171, 163, 170,
93 177, 184, 176, 169, 162, 161, 168, 160,
94 159, 151, 158, 157, 150, 143, 135, 142,
95 149, 156, 148, 141, 134, 133, 140, 132,
96 191, 183, 190, 189, 182, 175, 167, 174,
97 181, 188, 180, 173, 166, 165, 172, 164,
101 0, 4, 1, 2, 5, 8, 12, 9,
102 6, 3, 7, 10, 13, 14, 11, 15,
103 31, 27, 30, 29, 26, 23, 19, 22,
104 25, 28, 24, 21, 18, 17, 20, 16,
105 32, 36, 33, 34, 37, 40, 44, 41,
106 38, 35, 39, 42, 45, 46, 43, 47,
107 63, 59, 62, 61, 58, 55, 51, 54,
108 57, 60, 56, 53, 50, 49, 52, 48,
112 16, 24, 17, 18, 25, 32, 40, 33,
113 26, 19, 27, 34, 41, 42, 35, 43,
114 0, 4, 1, 2, 5, 8, 12, 9,
115 6, 3, 7, 10, 13, 14, 11, 15,
116 20, 28, 21, 22, 29, 36, 44, 37,
117 30, 23, 31, 38, 45, 46, 39, 47,
118 95, 87, 94, 93, 86, 79, 71, 78,
119 85, 92, 84, 77, 70, 69, 76, 68,
120 63, 59, 62, 61, 58, 55, 51, 54,
121 57, 60, 56, 53, 50, 49, 52, 48,
122 91, 83, 90, 89, 82, 75, 67, 74,
123 81, 88, 80, 73, 66, 65, 72, 64,
124 112, 120, 113, 114, 121, 128, 136, 129,
125 122, 115, 123, 130, 137, 138, 131, 139,
126 96, 100, 97, 98, 101, 104, 108, 105,
127 102, 99, 103, 106, 109, 110, 107, 111,
128 116, 124, 117, 118, 125, 132, 140, 133,
129 126, 119, 127, 134, 141, 142, 135, 143,
130 191, 183, 190, 189, 182, 175, 167, 174,
131 181, 188, 180, 173, 166, 165, 172, 164,
132 159, 155, 158, 157, 154, 151, 147, 150,
133 153, 156, 152, 149, 146, 145, 148, 144,
134 187, 179, 186, 185, 178, 171, 163, 170,
135 177, 184, 176, 169, 162, 161, 168, 160,
184 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
189 ctx->interlaced = ((
src[16] >> 4) == 3);
194 #define GET_CODE(val, type, add_bits) \
197 val = get_ue_golomb(gb); \
199 val = get_unary(gb, 1, 31); \
201 val = (val << add_bits) + get_bits(gb, add_bits); \
205 int band,
int slice_width,
int force_chroma)
207 int has_skips, coeff_type, coeff_bits, skip_type,
skip_bits;
224 for (
mb = 0;
mb < slice_width;
mb++) {
231 if (idx >= num_coeffs)
237 dst[scan[idx]] =
val;
238 }
while (idx < num_coeffs - 1);
242 for (
mb = 0;
mb < slice_width;
mb++) {
243 for (idx = 0; idx < num_coeffs; idx++) {
247 dst[scan[idx]] =
val;
256 int16_t **
base, int16_t **ext)
260 for (
i = 0;
i < 4;
i++) {
261 for (j = 0; j < 4; j++)
262 dst[scan[
i * 8 + j]] = (*
base)[j];
263 for (j = 0; j < 4; j++)
264 dst[scan[
i * 8 + j + 4]] = (*ext)[j];
269 for (j = 0; j < 8; j++)
270 dst[scan[
i * 8 + j]] = (*ext)[j];
276 int16_t **
base, int16_t **ext,
282 for (
i = 0;
i < 8;
i++) {
283 for (j = 0; j < 4; j++)
284 dst[scan[
i * 8 + j]] = (*
base)[j];
285 for (j = 0; j < 4; j++)
286 dst[scan[
i * 8 + j + 4]] = (*ext)[j];
291 for (
i = 0;
i < 64;
i++)
292 dst[scan[
i]] = (*ext)[
i];
301 for (
i = 0;
i < 64;
i++) {
305 block[
i] = (((
val >> 1) ^ -sign) * q * quant_matrix[
i] >> 4)
315 int slice_width =
FFMIN(
ctx->slice_width,
ctx->mb_width - mb_x);
316 int last_row = mb_y && mb_y ==
ctx->mb_height - 1;
324 const int ystride =
ctx->frame->linesize[0];
327 y_pos = (
ctx->avctx->height - 16);
328 c_pos = ((
ctx->avctx->height+1)/2 - 8);
334 Y =
ctx->frame->data[0] + mb_x * 16 + y_pos * ystride;
335 for (
i = 0;
i < 2;
i++)
336 C[
i] =
ctx->frame->data[
i + 1] + mb_x * 8
337 + c_pos *
ctx->frame->linesize[
i + 1];
340 memset(
ctx->slice_data, 0,
345 !
ctx->interlaced)) < 0)
348 for (
mb = 0;
mb < slice_width;
mb++) {
350 if (!
ctx->interlaced)
355 &base_y, &ext_y,
blk);
357 ctx->idsp.idct(
ctx->block);
359 if (!
ctx->interlaced) {
360 dst =
Y + (
blk >> 1) * 8 * ystride + (
blk & 1) * 8;
361 ctx->idsp.put_signed_pixels_clamped(
ctx->block, dst, ystride);
363 dst =
Y + (
blk & 1) * 8 + (
blk >> 1) * ystride;
364 ctx->idsp.put_signed_pixels_clamped(
ctx->block, dst,
374 ctx->idsp.idct(
ctx->block);
375 ctx->idsp.put_signed_pixels_clamped(
ctx->block,
C[
blk],
376 ctx->frame->linesize[
blk + 1]);
389 int buf_size = avpkt->
size;
398 ctx->frame->key_frame = 1;
402 if (buf_size < off) {
417 ctx->num_x_slices *
ctx->mb_height * 2);
419 for (y = 0; y <
ctx->mb_height; y++) {
420 for (x = 0; x <
ctx->mb_width; x +=
ctx->slice_width) {
421 slice_size = bytestream2_get_le16(&gb) * 4;
422 if (slice_size + off > buf_size || !slice_size) {
424 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
431 "Error decoding slice at %d.%d\n", x, y);
456 for (
i = 0;
i < 64;
i++)
459 for (
i = 0;
i < 64;
i++)
465 ctx->num_x_slices = (
ctx->mb_width + 15) >> 4;
466 ctx->slice_width = 16;
467 for (
i = 1;
i <
ctx->mb_width;
i++) {
468 if (!(
ctx->mb_width %
i) && (
ctx->mb_width /
i <= 32)) {
469 ctx->slice_width =
ctx->mb_width /
i;
470 ctx->num_x_slices =
i;
476 if (!
ctx->slice_data) {
483 ctx->data_ptr[
i] =
ctx->slice_data +
ctx->slice_width
static double val(void *priv, double ch)
static const uint8_t aic_y_scan[64]
static const uint8_t aic_c_ext_scan[192]
static void recombine_block_il(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext, int block_no)
static void recombine_block(int16_t *dst, const uint8_t *scan, int16_t **base, int16_t **ext)
static const uint8_t aic_quant_matrix[64]
#define GET_CODE(val, type, add_bits)
static av_cold int aic_decode_init(AVCodecContext *avctx)
static const uint8_t aic_num_band_coeffs[NUM_BANDS]
static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
static av_cold int aic_decode_close(AVCodecContext *avctx)
static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst, int band, int slice_width, int force_chroma)
static const uint8_t aic_c_scan[64]
static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, const uint8_t *src, int src_size)
static const uint16_t aic_band_off[NUM_BANDS]
static const uint8_t *const aic_scan[NUM_BANDS]
static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static const uint8_t aic_y_ext_scan[192]
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
@ AV_PICTURE_TYPE_I
Intra.
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
FF_ENABLE_DEPRECATION_WARNINGS int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
int16_t * data_ptr[NUM_BANDS]
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.