proresdec2.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2011 Maxim Poliakovski
3  * Copyright (c) 2010-2011 Elvis Presley
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Known FOURCCs: 'apch' (HQ), 'apcn' (SD), 'apcs' (LT), 'acpo' (Proxy), 'ap4h' (4444)
25  */
26 
27 //#define DEBUG
28 
29 #define LONG_BITSTREAM_READER
30 
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "internal.h"
34 #include "simple_idct.h"
35 #include "proresdec.h"
36 
37 static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64])
38 {
39  int i;
40  for (i = 0; i < 64; i++)
41  dst[i] = permutation[src[i]];
42 }
43 
44 static const uint8_t progressive_scan[64] = {
45  0, 1, 8, 9, 2, 3, 10, 11,
46  16, 17, 24, 25, 18, 19, 26, 27,
47  4, 5, 12, 20, 13, 6, 7, 14,
48  21, 28, 29, 22, 15, 23, 30, 31,
49  32, 33, 40, 48, 41, 34, 35, 42,
50  49, 56, 57, 50, 43, 36, 37, 44,
51  51, 58, 59, 52, 45, 38, 39, 46,
52  53, 60, 61, 54, 47, 55, 62, 63
53 };
54 
55 static const uint8_t interlaced_scan[64] = {
56  0, 8, 1, 9, 16, 24, 17, 25,
57  2, 10, 3, 11, 18, 26, 19, 27,
58  32, 40, 33, 34, 41, 48, 56, 49,
59  42, 35, 43, 50, 57, 58, 51, 59,
60  4, 12, 5, 6, 13, 20, 28, 21,
61  14, 7, 15, 22, 29, 36, 44, 37,
62  30, 23, 31, 38, 45, 52, 60, 53,
63  46, 39, 47, 54, 61, 62, 55, 63,
64 };
65 
67 {
68  ProresContext *ctx = avctx->priv_data;
69  uint8_t idct_permutation[64];
70 
71  avctx->bits_per_raw_sample = 10;
72 
73  ff_dsputil_init(&ctx->dsp, avctx);
74  ff_proresdsp_init(&ctx->prodsp, avctx);
75 
76  ff_init_scantable_permutation(idct_permutation,
78 
79  permute(ctx->progressive_scan, progressive_scan, idct_permutation);
80  permute(ctx->interlaced_scan, interlaced_scan, idct_permutation);
81 
82  return 0;
83 }
84 
85 static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
86  const int data_size, AVCodecContext *avctx)
87 {
88  int hdr_size, width, height, flags;
89  int version;
90  const uint8_t *ptr;
91 
92  hdr_size = AV_RB16(buf);
93  av_dlog(avctx, "header size %d\n", hdr_size);
94  if (hdr_size > data_size) {
95  av_log(avctx, AV_LOG_ERROR, "error, wrong header size\n");
96  return -1;
97  }
98 
99  version = AV_RB16(buf + 2);
100  av_dlog(avctx, "%.4s version %d\n", buf+4, version);
101  if (version > 1) {
102  av_log(avctx, AV_LOG_ERROR, "unsupported version: %d\n", version);
103  return -1;
104  }
105 
106  width = AV_RB16(buf + 8);
107  height = AV_RB16(buf + 10);
108  if (width != avctx->width || height != avctx->height) {
109  av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n",
110  avctx->width, avctx->height, width, height);
111  return -1;
112  }
113 
114  ctx->frame_type = (buf[12] >> 2) & 3;
115 
116  av_dlog(avctx, "frame type %d\n", ctx->frame_type);
117 
118  if (ctx->frame_type == 0) {
119  ctx->scan = ctx->progressive_scan; // permuted
120  } else {
121  ctx->scan = ctx->interlaced_scan; // permuted
122  ctx->frame->interlaced_frame = 1;
123  ctx->frame->top_field_first = ctx->frame_type == 1;
124  }
125 
126  avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
127 
128  ptr = buf + 20;
129  flags = buf[19];
130  av_dlog(avctx, "flags %x\n", flags);
131 
132  if (flags & 2) {
133  if(buf + data_size - ptr < 64) {
134  av_log(avctx, AV_LOG_ERROR, "Header truncated\n");
135  return -1;
136  }
137  permute(ctx->qmat_luma, ctx->prodsp.idct_permutation, ptr);
138  ptr += 64;
139  } else {
140  memset(ctx->qmat_luma, 4, 64);
141  }
142 
143  if (flags & 1) {
144  if(buf + data_size - ptr < 64) {
145  av_log(avctx, AV_LOG_ERROR, "Header truncated\n");
146  return -1;
147  }
148  permute(ctx->qmat_chroma, ctx->prodsp.idct_permutation, ptr);
149  } else {
150  memset(ctx->qmat_chroma, 4, 64);
151  }
152 
153  return hdr_size;
154 }
155 
156 static int decode_picture_header(AVCodecContext *avctx, const uint8_t *buf, const int buf_size)
157 {
158  ProresContext *ctx = avctx->priv_data;
159  int i, hdr_size, slice_count;
160  unsigned pic_data_size;
161  int log2_slice_mb_width, log2_slice_mb_height;
162  int slice_mb_count, mb_x, mb_y;
163  const uint8_t *data_ptr, *index_ptr;
164 
165  hdr_size = buf[0] >> 3;
166  if (hdr_size < 8 || hdr_size > buf_size) {
167  av_log(avctx, AV_LOG_ERROR, "error, wrong picture header size\n");
168  return -1;
169  }
170 
171  pic_data_size = AV_RB32(buf + 1);
172  if (pic_data_size > buf_size) {
173  av_log(avctx, AV_LOG_ERROR, "error, wrong picture data size\n");
174  return -1;
175  }
176 
177  log2_slice_mb_width = buf[7] >> 4;
178  log2_slice_mb_height = buf[7] & 0xF;
179  if (log2_slice_mb_width > 3 || log2_slice_mb_height) {
180  av_log(avctx, AV_LOG_ERROR, "unsupported slice resolution: %dx%d\n",
181  1 << log2_slice_mb_width, 1 << log2_slice_mb_height);
182  return -1;
183  }
184 
185  ctx->mb_width = (avctx->width + 15) >> 4;
186  if (ctx->frame_type)
187  ctx->mb_height = (avctx->height + 31) >> 5;
188  else
189  ctx->mb_height = (avctx->height + 15) >> 4;
190 
191  slice_count = AV_RB16(buf + 5);
192 
193  if (ctx->slice_count != slice_count || !ctx->slices) {
194  av_freep(&ctx->slices);
195  ctx->slices = av_mallocz(slice_count * sizeof(*ctx->slices));
196  if (!ctx->slices)
197  return AVERROR(ENOMEM);
198  ctx->slice_count = slice_count;
199  }
200 
201  if (!slice_count)
202  return AVERROR(EINVAL);
203 
204  if (hdr_size + slice_count*2 > buf_size) {
205  av_log(avctx, AV_LOG_ERROR, "error, wrong slice count\n");
206  return -1;
207  }
208 
209  // parse slice information
210  index_ptr = buf + hdr_size;
211  data_ptr = index_ptr + slice_count*2;
212 
213  slice_mb_count = 1 << log2_slice_mb_width;
214  mb_x = 0;
215  mb_y = 0;
216 
217  for (i = 0; i < slice_count; i++) {
218  SliceContext *slice = &ctx->slices[i];
219 
220  slice->data = data_ptr;
221  data_ptr += AV_RB16(index_ptr + i*2);
222 
223  while (ctx->mb_width - mb_x < slice_mb_count)
224  slice_mb_count >>= 1;
225 
226  slice->mb_x = mb_x;
227  slice->mb_y = mb_y;
228  slice->mb_count = slice_mb_count;
229  slice->data_size = data_ptr - slice->data;
230 
231  if (slice->data_size < 6) {
232  av_log(avctx, AV_LOG_ERROR, "error, wrong slice data size\n");
233  return -1;
234  }
235 
236  mb_x += slice_mb_count;
237  if (mb_x == ctx->mb_width) {
238  slice_mb_count = 1 << log2_slice_mb_width;
239  mb_x = 0;
240  mb_y++;
241  }
242  if (data_ptr > buf + buf_size) {
243  av_log(avctx, AV_LOG_ERROR, "error, slice out of bounds\n");
244  return -1;
245  }
246  }
247 
248  if (mb_x || mb_y != ctx->mb_height) {
249  av_log(avctx, AV_LOG_ERROR, "error wrong mb count y %d h %d\n",
250  mb_y, ctx->mb_height);
251  return -1;
252  }
253 
254  return pic_data_size;
255 }
256 
257 #define DECODE_CODEWORD(val, codebook) \
258  do { \
259  unsigned int rice_order, exp_order, switch_bits; \
260  unsigned int q, buf, bits; \
261  \
262  UPDATE_CACHE(re, gb); \
263  buf = GET_CACHE(re, gb); \
264  \
265  /* number of bits to switch between rice and exp golomb */ \
266  switch_bits = codebook & 3; \
267  rice_order = codebook >> 5; \
268  exp_order = (codebook >> 2) & 7; \
269  \
270  q = 31 - av_log2(buf); \
271  \
272  if (q > switch_bits) { /* exp golomb */ \
273  bits = exp_order - switch_bits + (q<<1); \
274  val = SHOW_UBITS(re, gb, bits) - (1 << exp_order) + \
275  ((switch_bits + 1) << rice_order); \
276  SKIP_BITS(re, gb, bits); \
277  } else if (rice_order) { \
278  SKIP_BITS(re, gb, q+1); \
279  val = (q << rice_order) + SHOW_UBITS(re, gb, rice_order); \
280  SKIP_BITS(re, gb, rice_order); \
281  } else { \
282  val = q; \
283  SKIP_BITS(re, gb, q+1); \
284  } \
285  } while (0)
286 
287 #define TOSIGNED(x) (((x) >> 1) ^ (-((x) & 1)))
288 
289 #define FIRST_DC_CB 0xB8
290 
291 static const uint8_t dc_codebook[7] = { 0x04, 0x28, 0x28, 0x4D, 0x4D, 0x70, 0x70};
292 
294  int blocks_per_slice)
295 {
296  int16_t prev_dc;
297  int code, i, sign;
298 
299  OPEN_READER(re, gb);
300 
302  prev_dc = TOSIGNED(code);
303  out[0] = prev_dc;
304 
305  out += 64; // dc coeff for the next block
306 
307  code = 5;
308  sign = 0;
309  for (i = 1; i < blocks_per_slice; i++, out += 64) {
310  DECODE_CODEWORD(code, dc_codebook[FFMIN(code, 6U)]);
311  if(code) sign ^= -(code & 1);
312  else sign = 0;
313  prev_dc += (((code + 1) >> 1) ^ sign) - sign;
314  out[0] = prev_dc;
315  }
316  CLOSE_READER(re, gb);
317 }
318 
319 // adaptive codebook switching lut according to previous run/level values
320 static const uint8_t run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
321 static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C };
322 
324  int16_t *out, int blocks_per_slice)
325 {
326  ProresContext *ctx = avctx->priv_data;
327  int block_mask, sign;
328  unsigned pos, run, level;
329  int max_coeffs, i, bits_left;
330  int log2_block_count = av_log2(blocks_per_slice);
331 
332  OPEN_READER(re, gb);
333  UPDATE_CACHE(re, gb); \
334  run = 4;
335  level = 2;
336 
337  max_coeffs = 64 << log2_block_count;
338  block_mask = blocks_per_slice - 1;
339 
340  for (pos = block_mask;;) {
341  bits_left = gb->size_in_bits - re_index;
342  if (!bits_left || (bits_left < 32 && !SHOW_UBITS(re, gb, bits_left)))
343  break;
344 
345  DECODE_CODEWORD(run, run_to_cb[FFMIN(run, 15)]);
346  pos += run + 1;
347  if (pos >= max_coeffs) {
348  av_log(avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", pos, max_coeffs);
349  return;
350  }
351 
352  DECODE_CODEWORD(level, lev_to_cb[FFMIN(level, 9)]);
353  level += 1;
354 
355  i = pos >> log2_block_count;
356 
357  sign = SHOW_SBITS(re, gb, 1);
358  SKIP_BITS(re, gb, 1);
359  out[((pos & block_mask) << 6) + ctx->scan[i]] = ((level ^ sign) - sign);
360  }
361 
362  CLOSE_READER(re, gb);
363 }
364 
365 static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice,
366  uint16_t *dst, int dst_stride,
367  const uint8_t *buf, unsigned buf_size,
368  const int16_t *qmat)
369 {
370  ProresContext *ctx = avctx->priv_data;
371  LOCAL_ALIGNED_16(int16_t, blocks, [8*4*64]);
372  int16_t *block;
373  GetBitContext gb;
374  int i, blocks_per_slice = slice->mb_count<<2;
375 
376  for (i = 0; i < blocks_per_slice; i++)
377  ctx->dsp.clear_block(blocks+(i<<6));
378 
379  init_get_bits(&gb, buf, buf_size << 3);
380 
381  decode_dc_coeffs(&gb, blocks, blocks_per_slice);
382  decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice);
383 
384  block = blocks;
385  for (i = 0; i < slice->mb_count; i++) {
386  ctx->prodsp.idct_put(dst, dst_stride, block+(0<<6), qmat);
387  ctx->prodsp.idct_put(dst +8, dst_stride, block+(1<<6), qmat);
388  ctx->prodsp.idct_put(dst+4*dst_stride , dst_stride, block+(2<<6), qmat);
389  ctx->prodsp.idct_put(dst+4*dst_stride+8, dst_stride, block+(3<<6), qmat);
390  block += 4*64;
391  dst += 16;
392  }
393 }
394 
396  uint16_t *dst, int dst_stride,
397  const uint8_t *buf, unsigned buf_size,
398  const int16_t *qmat, int log2_blocks_per_mb)
399 {
400  ProresContext *ctx = avctx->priv_data;
401  LOCAL_ALIGNED_16(int16_t, blocks, [8*4*64]);
402  int16_t *block;
403  GetBitContext gb;
404  int i, j, blocks_per_slice = slice->mb_count << log2_blocks_per_mb;
405 
406  for (i = 0; i < blocks_per_slice; i++)
407  ctx->dsp.clear_block(blocks+(i<<6));
408 
409  init_get_bits(&gb, buf, buf_size << 3);
410 
411  decode_dc_coeffs(&gb, blocks, blocks_per_slice);
412  decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice);
413 
414  block = blocks;
415  for (i = 0; i < slice->mb_count; i++) {
416  for (j = 0; j < log2_blocks_per_mb; j++) {
417  ctx->prodsp.idct_put(dst, dst_stride, block+(0<<6), qmat);
418  ctx->prodsp.idct_put(dst+4*dst_stride, dst_stride, block+(1<<6), qmat);
419  block += 2*64;
420  dst += 8;
421  }
422  }
423 }
424 
425 static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
426 {
427  ProresContext *ctx = avctx->priv_data;
428  SliceContext *slice = &ctx->slices[jobnr];
429  const uint8_t *buf = slice->data;
430  AVFrame *pic = ctx->frame;
431  int i, hdr_size, qscale, log2_chroma_blocks_per_mb;
432  int luma_stride, chroma_stride;
433  int y_data_size, u_data_size, v_data_size;
434  uint8_t *dest_y, *dest_u, *dest_v;
435  int16_t qmat_luma_scaled[64];
436  int16_t qmat_chroma_scaled[64];
437  int mb_x_shift;
438 
439  slice->ret = -1;
440  //av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
441  // jobnr, slice->mb_count, slice->mb_x, slice->mb_y);
442 
443  // slice header
444  hdr_size = buf[0] >> 3;
445  qscale = av_clip(buf[1], 1, 224);
446  qscale = qscale > 128 ? qscale - 96 << 2: qscale;
447  y_data_size = AV_RB16(buf + 2);
448  u_data_size = AV_RB16(buf + 4);
449  v_data_size = slice->data_size - y_data_size - u_data_size - hdr_size;
450  if (hdr_size > 7) v_data_size = AV_RB16(buf + 6);
451 
452  if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0
453  || hdr_size+y_data_size+u_data_size+v_data_size > slice->data_size){
454  av_log(avctx, AV_LOG_ERROR, "invalid plane data size\n");
455  return -1;
456  }
457 
458  buf += hdr_size;
459 
460  for (i = 0; i < 64; i++) {
461  qmat_luma_scaled [i] = ctx->qmat_luma [i] * qscale;
462  qmat_chroma_scaled[i] = ctx->qmat_chroma[i] * qscale;
463  }
464 
465  if (ctx->frame_type == 0) {
466  luma_stride = pic->linesize[0];
467  chroma_stride = pic->linesize[1];
468  } else {
469  luma_stride = pic->linesize[0] << 1;
470  chroma_stride = pic->linesize[1] << 1;
471  }
472 
473  if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10) {
474  mb_x_shift = 5;
475  log2_chroma_blocks_per_mb = 2;
476  } else {
477  mb_x_shift = 4;
478  log2_chroma_blocks_per_mb = 1;
479  }
480 
481  dest_y = pic->data[0] + (slice->mb_y << 4) * luma_stride + (slice->mb_x << 5);
482  dest_u = pic->data[1] + (slice->mb_y << 4) * chroma_stride + (slice->mb_x << mb_x_shift);
483  dest_v = pic->data[2] + (slice->mb_y << 4) * chroma_stride + (slice->mb_x << mb_x_shift);
484 
485  if (ctx->frame_type && ctx->first_field ^ ctx->frame->top_field_first) {
486  dest_y += pic->linesize[0];
487  dest_u += pic->linesize[1];
488  dest_v += pic->linesize[2];
489  }
490 
491  decode_slice_luma(avctx, slice, (uint16_t*)dest_y, luma_stride,
492  buf, y_data_size, qmat_luma_scaled);
493 
494  if (!(avctx->flags & CODEC_FLAG_GRAY)) {
495  decode_slice_chroma(avctx, slice, (uint16_t*)dest_u, chroma_stride,
496  buf + y_data_size, u_data_size,
497  qmat_chroma_scaled, log2_chroma_blocks_per_mb);
498  decode_slice_chroma(avctx, slice, (uint16_t*)dest_v, chroma_stride,
499  buf + y_data_size + u_data_size, v_data_size,
500  qmat_chroma_scaled, log2_chroma_blocks_per_mb);
501  }
502 
503  slice->ret = 0;
504  return 0;
505 }
506 
507 static int decode_picture(AVCodecContext *avctx)
508 {
509  ProresContext *ctx = avctx->priv_data;
510  int i;
511 
512  avctx->execute2(avctx, decode_slice_thread, NULL, NULL, ctx->slice_count);
513 
514  for (i = 0; i < ctx->slice_count; i++)
515  if (ctx->slices[i].ret < 0)
516  return ctx->slices[i].ret;
517 
518  return 0;
519 }
520 
521 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
522  AVPacket *avpkt)
523 {
524  ProresContext *ctx = avctx->priv_data;
525  AVFrame *frame = data;
526  const uint8_t *buf = avpkt->data;
527  int buf_size = avpkt->size;
528  int frame_hdr_size, pic_size;
529 
530  if (buf_size < 28 || AV_RL32(buf + 4) != AV_RL32("icpf")) {
531  av_log(avctx, AV_LOG_ERROR, "invalid frame header\n");
532  return -1;
533  }
534 
535  ctx->frame = frame;
537  ctx->frame->key_frame = 1;
538  ctx->first_field = 1;
539 
540  buf += 8;
541  buf_size -= 8;
542 
543  frame_hdr_size = decode_frame_header(ctx, buf, buf_size, avctx);
544  if (frame_hdr_size < 0)
545  return -1;
546 
547  buf += frame_hdr_size;
548  buf_size -= frame_hdr_size;
549 
550  if (ff_get_buffer(avctx, frame, 0) < 0)
551  return -1;
552 
554  pic_size = decode_picture_header(avctx, buf, buf_size);
555  if (pic_size < 0) {
556  av_log(avctx, AV_LOG_ERROR, "error decoding picture header\n");
557  return -1;
558  }
559 
560  if (decode_picture(avctx)) {
561  av_log(avctx, AV_LOG_ERROR, "error decoding picture\n");
562  return -1;
563  }
564 
565  buf += pic_size;
566  buf_size -= pic_size;
567 
568  if (ctx->frame_type && buf_size > 0 && ctx->first_field) {
569  ctx->first_field = 0;
570  goto decode_picture;
571  }
572 
573  *got_frame = 1;
574 
575  return avpkt->size;
576 }
577 
579 {
580  ProresContext *ctx = avctx->priv_data;
581 
582  av_freep(&ctx->slices);
583 
584  return 0;
585 }
586 
588  .name = "prores",
589  .type = AVMEDIA_TYPE_VIDEO,
590  .id = AV_CODEC_ID_PRORES,
591  .priv_data_size = sizeof(ProresContext),
592  .init = decode_init,
593  .close = decode_close,
594  .decode = decode_frame,
595  .long_name = NULL_IF_CONFIG_SMALL("ProRes"),
596  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
597 };
static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb, int16_t *out, int blocks_per_slice)
Definition: proresdec2.c:323
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
#define DECODE_CODEWORD(val, codebook)
Definition: proresdec2.c:257
int first_field
Definition: proresdec.h:51
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
Definition: proresdec2.c:425
uint8_t qmat_chroma[64]
dequantization matrix for chroma
Definition: proresdec.h:43
const uint8_t * scan
Definition: proresdec.h:50
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
unsigned mb_height
height of the current picture in mb
Definition: proresdec.h:47
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
int version
Definition: avisynth_c.h:666
int idct_permutation_type
Definition: proresdsp.h:32
uint8_t run
Definition: svq3.c:136
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
unsigned mb_y
Definition: proresdec.h:31
void(* clear_block)(int16_t *block)
Definition: dsputil.h:145
static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, uint16_t *dst, int dst_stride, const uint8_t *buf, unsigned buf_size, const int16_t *qmat, int log2_blocks_per_mb)
Definition: proresdec2.c:395
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
AVFrame * frame
Definition: proresdec.h:40
unsigned data_size
Definition: proresdec.h:33
uint8_t
#define av_cold
Definition: attributes.h:78
static int decode_picture_header(AVCodecContext *avctx, const uint8_t *buf, const int buf_size)
Definition: proresdec2.c:156
#define AV_RB32
static av_cold int decode_init(AVCodecContext *avctx)
Definition: proresdec2.c:66
unsigned mb_count
Definition: proresdec.h:32
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
AVCodec ff_prores_decoder
Definition: proresdec2.c:587
uint8_t * data
bitstream reader API header.
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:270
void ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx)
Definition: proresdsp.c:74
frame
Definition: stft.m:14
int slice_count
number of slices in the current picture
Definition: proresdec.h:45
SliceContext * slices
Definition: proresdec.h:44
#define U(x)
unsigned mb_width
width of the current picture in mb
Definition: proresdec.h:46
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:160
ProresDSPContext prodsp
Definition: proresdec.h:39
const uint8_t * data
Definition: proresdec.h:29
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
const char * arg
int flags
CODEC_FLAG_*.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:281
#define CLOSE_READER(name, gb)
Definition: get_bits.h:140
external API header
unsigned mb_x
Definition: proresdec.h:30
#define SKIP_BITS(name, gb, num)
Definition: get_bits.h:175
DSPContext dsp
Definition: proresdec.h:38
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
#define FFMIN(a, b)
Definition: common.h:58
int width
picture width / height.
uint8_t idct_permutation[64]
Definition: proresdsp.h:33
int size_in_bits
Definition: get_bits.h:57
#define AV_RL32
static const uint8_t lev_to_cb[10]
Definition: proresdec2.c:321
uint8_t interlaced_scan[64]
Definition: proresdec.h:49
FIXME Range Coding of cr are level
Definition: snow.txt:367
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:187
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
NULL
Definition: eval.c:55
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, uint16_t *dst, int dst_stride, const uint8_t *buf, unsigned buf_size, const int16_t *qmat)
Definition: proresdec2.c:365
static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64])
Definition: proresdec2.c:37
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define OPEN_READER(name, gb)
Definition: get_bits.h:126
void * buf
Definition: avisynth_c.h:594
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
static const uint8_t run_to_cb[16]
Definition: proresdec2.c:320
uint8_t progressive_scan[64]
Definition: proresdec.h:48
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
#define TOSIGNED(x)
Definition: proresdec2.c:287
void(* idct_put)(uint16_t *out, int linesize, int16_t *block, const int16_t *qmat)
Definition: proresdsp.h:36
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: proresdec2.c:521
static const uint8_t progressive_scan[64]
Definition: proresdec2.c:44
void ff_init_scantable_permutation(uint8_t *idct_permutation, int idct_permutation_type)
Definition: dsputil.c:131
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:280
static int flags
Definition: cpu.c:23
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define SHOW_SBITS(name, gb, num)
Definition: get_bits.h:188
#define FIRST_DC_CB
Definition: proresdec2.c:289
#define CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
common internal api header.
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
static av_always_inline void decode_dc_coeffs(GetBitContext *gb, int16_t *out, int blocks_per_slice)
Definition: proresdec2.c:293
static const uint8_t dc_codebook[7]
Definition: proresdec2.c:291
static const uint8_t interlaced_scan[64]
Definition: proresdec2.c:55
float re
Definition: fft-test.c:64
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:275
simple idct header.
#define av_log2
Definition: intmath.h:89
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
static int decode_frame_header(ProresContext *ctx, const uint8_t *buf, const int data_size, AVCodecContext *avctx)
Definition: proresdec2.c:85
static av_cold int decode_close(AVCodecContext *avctx)
Definition: proresdec2.c:578
#define LOCAL_ALIGNED_16(t, v,...)
#define av_always_inline
Definition: attributes.h:41
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
struct ProresContext ProresContext
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
uint8_t qmat_luma[64]
dequantization matrix for luma
Definition: proresdec.h:42
int frame_type
0 = progressive, 1 = tff, 2 = bff
Definition: proresdec.h:41
This structure stores compressed data.
static int decode_picture(AVCodecContext *avctx)
Definition: proresdec2.c:507