34 #define AIC_HDR_SIZE 24
35 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
50 8, 16, 19, 22, 22, 26, 26, 27,
51 16, 16, 22, 22, 26, 27, 27, 29,
52 19, 22, 26, 26, 27, 29, 29, 35,
53 22, 24, 27, 27, 29, 32, 34, 38,
54 26, 27, 29, 29, 32, 35, 38, 46,
55 27, 29, 34, 34, 35, 40, 46, 56,
56 29, 34, 34, 37, 40, 48, 56, 69,
57 34, 37, 38, 40, 48, 58, 69, 83,
61 0, 4, 1, 2, 5, 8, 12, 9,
62 6, 3, 7, 10, 13, 14, 11, 15,
63 47, 43, 46, 45, 42, 39, 35, 38,
64 41, 44, 40, 37, 34, 33, 36, 32,
65 16, 20, 17, 18, 21, 24, 28, 25,
66 22, 19, 23, 26, 29, 30, 27, 31,
67 63, 59, 62, 61, 58, 55, 51, 54,
68 57, 60, 56, 53, 50, 49, 52, 48,
72 64, 72, 65, 66, 73, 80, 88, 81,
73 74, 67, 75, 82, 89, 90, 83, 91,
74 0, 4, 1, 2, 5, 8, 12, 9,
75 6, 3, 7, 10, 13, 14, 11, 15,
76 16, 20, 17, 18, 21, 24, 28, 25,
77 22, 19, 23, 26, 29, 30, 27, 31,
78 155, 147, 154, 153, 146, 139, 131, 138,
79 145, 152, 144, 137, 130, 129, 136, 128,
80 47, 43, 46, 45, 42, 39, 35, 38,
81 41, 44, 40, 37, 34, 33, 36, 32,
82 63, 59, 62, 61, 58, 55, 51, 54,
83 57, 60, 56, 53, 50, 49, 52, 48,
84 96, 104, 97, 98, 105, 112, 120, 113,
85 106, 99, 107, 114, 121, 122, 115, 123,
86 68, 76, 69, 70, 77, 84, 92, 85,
87 78, 71, 79, 86, 93, 94, 87, 95,
88 100, 108, 101, 102, 109, 116, 124, 117,
89 110, 103, 111, 118, 125, 126, 119, 127,
90 187, 179, 186, 185, 178, 171, 163, 170,
91 177, 184, 176, 169, 162, 161, 168, 160,
92 159, 151, 158, 157, 150, 143, 135, 142,
93 149, 156, 148, 141, 134, 133, 140, 132,
94 191, 183, 190, 189, 182, 175, 167, 174,
95 181, 188, 180, 173, 166, 165, 172, 164,
99 0, 4, 1, 2, 5, 8, 12, 9,
100 6, 3, 7, 10, 13, 14, 11, 15,
101 31, 27, 30, 29, 26, 23, 19, 22,
102 25, 28, 24, 21, 18, 17, 20, 16,
103 32, 36, 33, 34, 37, 40, 44, 41,
104 38, 35, 39, 42, 45, 46, 43, 47,
105 63, 59, 62, 61, 58, 55, 51, 54,
106 57, 60, 56, 53, 50, 49, 52, 48,
110 16, 24, 17, 18, 25, 32, 40, 33,
111 26, 19, 27, 34, 41, 42, 35, 43,
112 0, 4, 1, 2, 5, 8, 12, 9,
113 6, 3, 7, 10, 13, 14, 11, 15,
114 20, 28, 21, 22, 29, 36, 44, 37,
115 30, 23, 31, 38, 45, 46, 39, 47,
116 95, 87, 94, 93, 86, 79, 71, 78,
117 85, 92, 84, 77, 70, 69, 76, 68,
118 63, 59, 62, 61, 58, 55, 51, 54,
119 57, 60, 56, 53, 50, 49, 52, 48,
120 91, 83, 90, 89, 82, 75, 67, 74,
121 81, 88, 80, 73, 66, 65, 72, 64,
122 112, 120, 113, 114, 121, 128, 136, 129,
123 122, 115, 123, 130, 137, 138, 131, 139,
124 96, 100, 97, 98, 101, 104, 108, 105,
125 102, 99, 103, 106, 109, 110, 107, 111,
126 116, 124, 117, 118, 125, 132, 140, 133,
127 126, 119, 127, 134, 141, 142, 135, 143,
128 191, 183, 190, 189, 182, 175, 167, 174,
129 181, 188, 180, 173, 166, 165, 172, 164,
130 159, 155, 158, 157, 154, 151, 147, 150,
131 153, 156, 152, 149, 146, 145, 148, 144,
132 187, 179, 186, 185, 178, 171, 163, 170,
133 177, 184, 176, 169, 162, 161, 168, 160,
175 if (frame_size > size) {
182 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
186 ctx->
quant = src[15];
192 #define GET_CODE(val, type, add_bits) \
195 val = get_ue_golomb(gb); \
197 val = get_unary(gb, 1, 31); \
199 val = (val << add_bits) + get_bits(gb, add_bits); \
203 int band,
int slice_width,
int force_chroma)
205 int has_skips, coeff_type, coeff_bits, skip_type,
skip_bits;
219 for (mb = 0; mb < slice_width; mb++) {
222 GET_CODE(val, skip_type, skip_bits);
226 if (idx >= num_coeffs)
228 GET_CODE(val, coeff_type, coeff_bits);
232 dst[scan[idx]] =
val;
233 }
while (idx < num_coeffs - 1);
237 for (mb = 0; mb < slice_width; mb++) {
238 for (idx = 0; idx < num_coeffs; idx++) {
239 GET_CODE(val, coeff_type, coeff_bits);
242 dst[scan[idx]] =
val;
251 int16_t **base, int16_t **ext)
255 for (i = 0; i < 4; i++) {
256 for (j = 0; j < 4; j++)
257 dst[scan[i * 8 + j]] = (*base)[j];
258 for (j = 0; j < 4; j++)
259 dst[scan[i * 8 + j + 4]] = (*ext)[j];
264 for (j = 0; j < 8; j++)
265 dst[scan[i * 8 + j]] = (*ext)[j];
271 int16_t **base, int16_t **ext,
277 for (i = 0; i < 8; i++) {
278 for (j = 0; j < 4; j++)
279 dst[scan[i * 8 + j]] = (*base)[j];
280 for (j = 0; j < 4; j++)
281 dst[scan[i * 8 + j + 4]] = (*ext)[j];
286 for (i = 0; i < 64; i++)
287 dst[scan[i]] = (*ext)[i];
296 for (i = 0; i < 64; i++) {
297 int val = (uint16_t)block[i];
300 block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
319 Y = ctx->
frame->
data[0] + mb_x * 16 + mb_y * 16 * ystride;
320 for (i = 0; i < 2; i++)
321 C[i] = ctx->
frame->
data[i + 1] + mb_x * 8
333 for (mb = 0; mb < slice_width; mb++) {
334 for (blk = 0; blk < 4; blk++) {
340 &base_y, &ext_y, blk);
345 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
348 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
355 for (blk = 0; blk < 2; blk++) {
374 int buf_size = avpkt->
size;
387 if (buf_size < off) {
406 slice_size = bytestream2_get_le16(&gb) * 4;
407 if (slice_size + off > buf_size || !slice_size) {
409 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
416 "Error decoding slice at %d.%d\n", x, y);
441 for (i = 0; i < 64; i++)
444 for (i = 0; i < 64; i++)
452 for (i = 1; i < ctx->
mb_width; i++) {
static const int aic_num_band_coeffs[NUM_BANDS]
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 int init_thread_copy(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
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
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
static const uint8_t aic_c_scan[64]
Multithreading support functions.
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
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
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)
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
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.
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
main external API structure.
static unsigned int get_bits1(GetBitContext *s)
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.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
void(* put_signed_pixels_clamped)(const int16_t *block, uint8_t *av_restrict pixels, ptrdiff_t line_size)
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
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
#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)