FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
aic.c
Go to the documentation of this file.
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 "avcodec.h"
26 #include "bytestream.h"
27 #include "internal.h"
28 #include "get_bits.h"
29 #include "golomb.h"
30 #include "idctdsp.h"
31 #include "unary.h"
32 
33 #define AIC_HDR_SIZE 24
34 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
35 
36 enum AICBands {
42 };
43 
44 static const int aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
45 
46 static const int aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
47 
48 static const uint8_t aic_quant_matrix[64] = {
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 
59 static const uint8_t aic_y_scan[64] = {
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 
70 static const uint8_t aic_y_ext_scan[192] = {
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 
97 static const uint8_t aic_c_scan[64] = {
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 
108 static const uint8_t aic_c_ext_scan[192] = {
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 
135 static const uint8_t * const aic_scan[NUM_BANDS] = {
137 };
138 
139 typedef struct AICContext {
144 
148  int quant;
150 
151  int16_t *slice_data;
152  int16_t *data_ptr[NUM_BANDS];
153 
154  DECLARE_ALIGNED(16, int16_t, block)[64];
156 } AICContext;
157 
158 static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
159 {
160  uint32_t frame_size;
161  int width, height;
162 
163  if (src[0] != 1) {
164  av_log(ctx->avctx, AV_LOG_ERROR, "Invalid version %d\n", src[0]);
165  return AVERROR_INVALIDDATA;
166  }
167  if (src[1] != AIC_HDR_SIZE - 2) {
168  av_log(ctx->avctx, AV_LOG_ERROR, "Invalid header size %d\n", src[1]);
169  return AVERROR_INVALIDDATA;
170  }
171  frame_size = AV_RB32(src + 2);
172  width = AV_RB16(src + 6);
173  height = AV_RB16(src + 8);
174  if (frame_size > size) {
175  av_log(ctx->avctx, AV_LOG_ERROR, "Frame size should be %"PRIu32" got %d\n",
176  frame_size, size);
177  return AVERROR_INVALIDDATA;
178  }
179  if (width != ctx->avctx->width || height != ctx->avctx->height) {
180  av_log(ctx->avctx, AV_LOG_ERROR,
181  "Picture dimension changed: old: %d x %d, new: %d x %d\n",
182  ctx->avctx->width, ctx->avctx->height, width, height);
183  return AVERROR_INVALIDDATA;
184  }
185  ctx->quant = src[15];
186  ctx->interlaced = ((src[16] >> 4) == 3);
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 
201 static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
202  int band, int slice_width, int force_chroma)
203 {
204  int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
205  const int num_coeffs = aic_num_band_coeffs[band];
206  const uint8_t *scan = aic_scan[band | force_chroma];
207  int mb, idx;
208  unsigned val;
209 
210  has_skips = get_bits1(gb);
211  coeff_type = get_bits1(gb);
212  coeff_bits = get_bits(gb, 3);
213 
214  if (has_skips) {
215  skip_type = get_bits1(gb);
216  skip_bits = get_bits(gb, 3);
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)
223  return AVERROR_INVALIDDATA;
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)
230  return AVERROR_INVALIDDATA;
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)
240  return AVERROR_INVALIDDATA;
241  dst[scan[idx]] = val;
242  }
243  dst += num_coeffs;
244  }
245  }
246  return 0;
247 }
248 
249 static void recombine_block(int16_t *dst, const uint8_t *scan,
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 
269 static void recombine_block_il(int16_t *dst, const uint8_t *scan,
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 
291 static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
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 
304 static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
305  const uint8_t *src, int src_size)
306 {
307  GetBitContext gb;
308  int ret, i, mb, blk;
309  int slice_width = FFMIN(ctx->slice_width, ctx->mb_width - mb_x);
310  uint8_t *Y, *C[2];
311  uint8_t *dst;
312  int16_t *base_y = ctx->data_ptr[COEFF_LUMA];
313  int16_t *base_c = ctx->data_ptr[COEFF_CHROMA];
314  int16_t *ext_y = ctx->data_ptr[COEFF_LUMA_EXT];
315  int16_t *ext_c = ctx->data_ptr[COEFF_CHROMA_EXT];
316  const int ystride = ctx->frame->linesize[0];
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
321  + mb_y * 8 * ctx->frame->linesize[i + 1];
322  init_get_bits(&gb, src, src_size * 8);
323 
324  memset(ctx->slice_data, 0,
325  sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
326  for (i = 0; i < NUM_BANDS; i++)
327  if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
328  i, slice_width,
329  !ctx->interlaced)) < 0)
330  return ret;
331 
332  for (mb = 0; mb < slice_width; mb++) {
333  for (blk = 0; blk < 4; blk++) {
334  if (!ctx->interlaced)
336  &base_y, &ext_y);
337  else
339  &base_y, &ext_y, blk);
340  unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
341  ctx->idsp.idct(ctx->block);
342 
343  if (!ctx->interlaced) {
344  dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
345  ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
346  } else {
347  dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
348  ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
349  ystride * 2);
350  }
351  }
352  Y += 16;
353 
354  for (blk = 0; blk < 2; blk++) {
356  &base_c, &ext_c);
357  unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
358  ctx->idsp.idct(ctx->block);
359  ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
360  ctx->frame->linesize[blk + 1]);
361  C[blk] += 8;
362  }
363  }
364 
365  return 0;
366 }
367 
368 static int aic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
369  AVPacket *avpkt)
370 {
371  AICContext *ctx = avctx->priv_data;
372  const uint8_t *buf = avpkt->data;
373  int buf_size = avpkt->size;
374  GetByteContext gb;
375  uint32_t off;
376  int x, y, ret;
377  int slice_size;
378 
379  ctx->frame = data;
381  ctx->frame->key_frame = 1;
382 
383  off = FFALIGN(AIC_HDR_SIZE + ctx->num_x_slices * ctx->mb_height * 2, 4);
384 
385  if (buf_size < off) {
386  av_log(avctx, AV_LOG_ERROR, "Too small frame\n");
387  return AVERROR_INVALIDDATA;
388  }
389 
390  if ((ret = aic_decode_header(ctx, buf, buf_size)) < 0)
391  return ret;
392 
393  if ((ret = ff_get_buffer(avctx, ctx->frame, 0)) < 0)
394  return ret;
395 
396  bytestream2_init(&gb, buf + AIC_HDR_SIZE,
397  ctx->num_x_slices * ctx->mb_height * 2);
398 
399  for (y = 0; y < ctx->mb_height; y++) {
400  for (x = 0; x < ctx->mb_width; x += ctx->slice_width) {
401  slice_size = bytestream2_get_le16(&gb) * 4;
402  if (slice_size + off > buf_size || !slice_size) {
403  av_log(avctx, AV_LOG_ERROR, "Incorrect slice size\n");
404  return AVERROR_INVALIDDATA;
405  }
406 
407  if ((ret = aic_decode_slice(ctx, x, y,
408  buf + off, slice_size)) < 0)
409  return ret;
410 
411  off += slice_size;
412  }
413  }
414 
415  *got_frame = 1;
416 
417  return avpkt->size;
418 }
419 
421 {
422  AICContext *ctx = avctx->priv_data;
423  int i;
424  uint8_t scan[64];
425 
426  ctx->avctx = avctx;
427 
428  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
429 
430  ff_idctdsp_init(&ctx->idsp, avctx);
431 
432  for (i = 0; i < 64; i++)
433  scan[i] = i;
435  for (i = 0; i < 64; i++)
437 
438  ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
439  ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
440 
441  ctx->num_x_slices = 16;
442  ctx->slice_width = ctx->mb_width / 16;
443  for (i = 1; i < 32; i++) {
444  if (!(ctx->mb_width % i) && (ctx->mb_width / i < 32)) {
445  ctx->slice_width = ctx->mb_width / i;
446  ctx->num_x_slices = i;
447  break;
448  }
449  }
450 
452  * sizeof(*ctx->slice_data));
453  if (!ctx->slice_data) {
454  av_log(avctx, AV_LOG_ERROR, "Error allocating slice buffer\n");
455 
456  return AVERROR(ENOMEM);
457  }
458 
459  for (i = 0; i < NUM_BANDS; i++)
460  ctx->data_ptr[i] = ctx->slice_data + ctx->slice_width
461  * aic_band_off[i];
462 
463  return 0;
464 }
465 
467 {
468  AICContext *ctx = avctx->priv_data;
469 
470  av_freep(&ctx->slice_data);
471 
472  return 0;
473 }
474 
476  .name = "aic",
477  .long_name = NULL_IF_CONFIG_SMALL("Apple Intermediate Codec"),
478  .type = AVMEDIA_TYPE_VIDEO,
479  .id = AV_CODEC_ID_AIC,
480  .priv_data_size = sizeof(AICContext),
484  .capabilities = CODEC_CAP_DR1,
485 };