FFmpeg
proresenc_anatoliy.c
Go to the documentation of this file.
1 /*
2  * Apple ProRes encoder
3  *
4  * Copyright (c) 2011 Anatoliy Wasserman
5  * Copyright (c) 2012 Konstantin Shishkov
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 /**
25  * @file
26  * Apple ProRes encoder (Anatoliy Wasserman version)
27  * Known FOURCCs: 'ap4h' (444), 'apch' (HQ), 'apcn' (422), 'apcs' (LT), 'acpo' (Proxy)
28  */
29 
30 #include "libavutil/avassert.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/mem_internal.h"
33 #include "libavutil/opt.h"
34 #include "avcodec.h"
35 #include "codec_internal.h"
36 #include "encode.h"
37 #include "profiles.h"
38 #include "proresdata.h"
39 #include "put_bits.h"
40 #include "bytestream.h"
41 #include "fdctdsp.h"
42 
43 #define DEFAULT_SLICE_MB_WIDTH 8
44 
45 static const AVProfile profiles[] = {
46  { AV_PROFILE_PRORES_PROXY, "apco"},
47  { AV_PROFILE_PRORES_LT, "apcs"},
48  { AV_PROFILE_PRORES_STANDARD, "apcn"},
49  { AV_PROFILE_PRORES_HQ, "apch"},
50  { AV_PROFILE_PRORES_4444, "ap4h"},
51  { AV_PROFILE_PRORES_XQ, "ap4x"},
53 };
54 
55 static const int qp_start_table[] = { 8, 3, 2, 1, 1, 1};
56 static const int qp_end_table[] = { 13, 9, 6, 6, 5, 4};
57 static const int bitrate_table[] = { 1000, 2100, 3500, 5400, 7000, 10000};
58 
62  AVCOL_TRC_ARIB_STD_B67, INT_MAX };
64  AVCOL_SPC_BT2020_NCL, INT_MAX };
65 
66 static const uint8_t QMAT_LUMA[6][64] = {
67  {
68  4, 7, 9, 11, 13, 14, 15, 63,
69  7, 7, 11, 12, 14, 15, 63, 63,
70  9, 11, 13, 14, 15, 63, 63, 63,
71  11, 11, 13, 14, 63, 63, 63, 63,
72  11, 13, 14, 63, 63, 63, 63, 63,
73  13, 14, 63, 63, 63, 63, 63, 63,
74  13, 63, 63, 63, 63, 63, 63, 63,
75  63, 63, 63, 63, 63, 63, 63, 63
76  }, {
77  4, 5, 6, 7, 9, 11, 13, 15,
78  5, 5, 7, 8, 11, 13, 15, 17,
79  6, 7, 9, 11, 13, 15, 15, 17,
80  7, 7, 9, 11, 13, 15, 17, 19,
81  7, 9, 11, 13, 14, 16, 19, 23,
82  9, 11, 13, 14, 16, 19, 23, 29,
83  9, 11, 13, 15, 17, 21, 28, 35,
84  11, 13, 16, 17, 21, 28, 35, 41
85  }, {
86  4, 4, 5, 5, 6, 7, 7, 9,
87  4, 4, 5, 6, 7, 7, 9, 9,
88  5, 5, 6, 7, 7, 9, 9, 10,
89  5, 5, 6, 7, 7, 9, 9, 10,
90  5, 6, 7, 7, 8, 9, 10, 12,
91  6, 7, 7, 8, 9, 10, 12, 15,
92  6, 7, 7, 9, 10, 11, 14, 17,
93  7, 7, 9, 10, 11, 14, 17, 21
94  }, {
95  4, 4, 4, 4, 4, 4, 4, 4,
96  4, 4, 4, 4, 4, 4, 4, 4,
97  4, 4, 4, 4, 4, 4, 4, 4,
98  4, 4, 4, 4, 4, 4, 4, 5,
99  4, 4, 4, 4, 4, 4, 5, 5,
100  4, 4, 4, 4, 4, 5, 5, 6,
101  4, 4, 4, 4, 5, 5, 6, 7,
102  4, 4, 4, 4, 5, 6, 7, 7
103  }, { /* 444 */
104  4, 4, 4, 4, 4, 4, 4, 4,
105  4, 4, 4, 4, 4, 4, 4, 4,
106  4, 4, 4, 4, 4, 4, 4, 4,
107  4, 4, 4, 4, 4, 4, 4, 5,
108  4, 4, 4, 4, 4, 4, 5, 5,
109  4, 4, 4, 4, 4, 5, 5, 6,
110  4, 4, 4, 4, 5, 5, 6, 7,
111  4, 4, 4, 4, 5, 6, 7, 7
112  }, { /* 444 XQ */
113  2, 2, 2, 2, 2, 2, 2, 2,
114  2, 2, 2, 2, 2, 2, 2, 2,
115  2, 2, 2, 2, 2, 2, 2, 2,
116  2, 2, 2, 2, 2, 2, 2, 3,
117  2, 2, 2, 2, 2, 2, 3, 3,
118  2, 2, 2, 2, 2, 3, 3, 3,
119  2, 2, 2, 2, 3, 3, 3, 4,
120  2, 2, 2, 2, 3, 3, 4, 4,
121  }
122 };
123 
124 static const uint8_t QMAT_CHROMA[6][64] = {
125  {
126  4, 7, 9, 11, 13, 14, 63, 63,
127  7, 7, 11, 12, 14, 63, 63, 63,
128  9, 11, 13, 14, 63, 63, 63, 63,
129  11, 11, 13, 14, 63, 63, 63, 63,
130  11, 13, 14, 63, 63, 63, 63, 63,
131  13, 14, 63, 63, 63, 63, 63, 63,
132  13, 63, 63, 63, 63, 63, 63, 63,
133  63, 63, 63, 63, 63, 63, 63, 63
134  }, {
135  4, 5, 6, 7, 9, 11, 13, 15,
136  5, 5, 7, 8, 11, 13, 15, 17,
137  6, 7, 9, 11, 13, 15, 15, 17,
138  7, 7, 9, 11, 13, 15, 17, 19,
139  7, 9, 11, 13, 14, 16, 19, 23,
140  9, 11, 13, 14, 16, 19, 23, 29,
141  9, 11, 13, 15, 17, 21, 28, 35,
142  11, 13, 16, 17, 21, 28, 35, 41
143  }, {
144  4, 4, 5, 5, 6, 7, 7, 9,
145  4, 4, 5, 6, 7, 7, 9, 9,
146  5, 5, 6, 7, 7, 9, 9, 10,
147  5, 5, 6, 7, 7, 9, 9, 10,
148  5, 6, 7, 7, 8, 9, 10, 12,
149  6, 7, 7, 8, 9, 10, 12, 15,
150  6, 7, 7, 9, 10, 11, 14, 17,
151  7, 7, 9, 10, 11, 14, 17, 21
152  }, {
153  4, 4, 4, 4, 4, 4, 4, 4,
154  4, 4, 4, 4, 4, 4, 4, 4,
155  4, 4, 4, 4, 4, 4, 4, 4,
156  4, 4, 4, 4, 4, 4, 4, 5,
157  4, 4, 4, 4, 4, 4, 5, 5,
158  4, 4, 4, 4, 4, 5, 5, 6,
159  4, 4, 4, 4, 5, 5, 6, 7,
160  4, 4, 4, 4, 5, 6, 7, 7
161  }, { /* 444 */
162  4, 4, 4, 4, 4, 4, 4, 4,
163  4, 4, 4, 4, 4, 4, 4, 4,
164  4, 4, 4, 4, 4, 4, 4, 4,
165  4, 4, 4, 4, 4, 4, 4, 5,
166  4, 4, 4, 4, 4, 4, 5, 5,
167  4, 4, 4, 4, 4, 5, 5, 6,
168  4, 4, 4, 4, 5, 5, 6, 7,
169  4, 4, 4, 4, 5, 6, 7, 7
170  }, { /* 444 xq */
171  4, 4, 4, 4, 4, 4, 4, 4,
172  4, 4, 4, 4, 4, 4, 4, 4,
173  4, 4, 4, 4, 4, 4, 4, 4,
174  4, 4, 4, 4, 4, 4, 4, 5,
175  4, 4, 4, 4, 4, 4, 5, 5,
176  4, 4, 4, 4, 4, 5, 5, 6,
177  4, 4, 4, 4, 5, 5, 6, 7,
178  4, 4, 4, 4, 5, 6, 7, 7
179  }
180 };
181 
182 
183 typedef struct {
184  AVClass *class;
186  uint8_t* fill_y;
187  uint8_t* fill_u;
188  uint8_t* fill_v;
189  uint8_t* fill_a;
190 
191  int qmat_luma[16][64];
192  int qmat_chroma[16][64];
193  const uint8_t *scantable;
194 
195  int is_422;
198 
199  char *vendor;
200 } ProresContext;
201 
202 /**
203  * Check if a value is in the list. If not, return the default value
204  *
205  * @param ctx Context for the log msg
206  * @param val_name Name of the checked value, for log msg
207  * @param array_valid_values Array of valid int, ended with INT_MAX
208  * @param default_value Value return if checked value is not in the array
209  * @return Value or default_value.
210  */
211 static int int_from_list_or_default(void *ctx, const char *val_name, int val,
212  const int *array_valid_values, int default_value)
213 {
214  int i = 0;
215 
216  while (1) {
217  int ref_val = array_valid_values[i];
218  if (ref_val == INT_MAX)
219  break;
220  if (val == ref_val)
221  return val;
222  i++;
223  }
224  /* val is not a valid value */
226  "%s %d are not supported. Set to default value : %d\n",
227  val_name, val, default_value);
228  return default_value;
229 }
230 
231 static void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
232 {
233  unsigned int rice_order, exp_order, switch_bits, switch_val;
234  int exponent;
235 
236  /* number of prefix bits to switch between Rice and expGolomb */
237  switch_bits = (codebook & 3) + 1;
238  rice_order = codebook >> 5; /* rice code order */
239  exp_order = (codebook >> 2) & 7; /* exp golomb code order */
240 
241  switch_val = switch_bits << rice_order;
242 
243  if (val >= switch_val) {
244  val -= switch_val - (1 << exp_order);
245  exponent = av_log2(val);
246 
247  put_bits(pb, exponent - exp_order + switch_bits, 0);
248  put_bits(pb, exponent + 1, val);
249  } else {
250  exponent = val >> rice_order;
251 
252  if (exponent)
253  put_bits(pb, exponent, 0);
254  put_bits(pb, 1, 1);
255  if (rice_order)
256  put_sbits(pb, rice_order, val);
257  }
258 }
259 
260 #define GET_SIGN(x) ((x) >> 31)
261 #define MAKE_CODE(x) (((x) * 2) ^ GET_SIGN(x))
262 
263 static void encode_dcs(PutBitContext *pb, int16_t *blocks,
264  int blocks_per_slice, int scale)
265 {
266  int i;
267  int codebook = 5, code, dc, prev_dc, delta, sign, new_sign;
268 
269  prev_dc = (blocks[0] - 0x4000) / scale;
271  sign = 0;
272  blocks += 64;
273 
274  for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
275  dc = (blocks[0] - 0x4000) / scale;
276  delta = dc - prev_dc;
277  new_sign = GET_SIGN(delta);
278  delta = (delta ^ sign) - sign;
279  code = MAKE_CODE(delta);
281  codebook = FFMIN(code, 6);
282  sign = new_sign;
283  prev_dc = dc;
284  }
285 }
286 
287 static void encode_acs(PutBitContext *pb, int16_t *blocks,
288  int blocks_per_slice,
289  int *qmat, const uint8_t *scan)
290 {
291  int idx, i;
292  int prev_run = 4;
293  int prev_level = 2;
294  int run = 0, level;
295  int max_coeffs, abs_level;
296 
297  max_coeffs = blocks_per_slice << 6;
298 
299  for (i = 1; i < 64; i++) {
300  for (idx = scan[i]; idx < max_coeffs; idx += 64) {
301  level = blocks[idx] / qmat[scan[i]];
302  if (level) {
303  abs_level = FFABS(level);
305  encode_vlc_codeword(pb, ff_prores_level_to_cb[prev_level], abs_level - 1);
306  put_sbits(pb, 1, GET_SIGN(level));
307 
308  prev_run = FFMIN(run, 15);
309  prev_level = FFMIN(abs_level, 9);
310  run = 0;
311  } else {
312  run++;
313  }
314  }
315  }
316 }
317 
318 static void get(const uint8_t *pixels, int stride, int16_t* block)
319 {
320  int i;
321 
322  for (i = 0; i < 8; i++) {
323  AV_WN64(block, AV_RN64(pixels));
324  AV_WN64(block+4, AV_RN64(pixels+8));
325  pixels += stride;
326  block += 8;
327  }
328 }
329 
330 static void fdct_get(FDCTDSPContext *fdsp, const uint8_t *pixels, int stride, int16_t* block)
331 {
332  get(pixels, stride, block);
333  fdsp->fdct(block);
334 }
335 
336 static void calc_plane_dct(FDCTDSPContext *fdsp, const uint8_t *src, int16_t * blocks, int src_stride, int mb_count, int chroma, int is_422)
337 {
338  int16_t *block;
339  int i;
340 
341  block = blocks;
342 
343  if (!chroma) { /* Luma plane */
344  for (i = 0; i < mb_count; i++) {
345  fdct_get(fdsp, src, src_stride, block + (0 << 6));
346  fdct_get(fdsp, src + 16, src_stride, block + (1 << 6));
347  fdct_get(fdsp, src + 8 * src_stride, src_stride, block + (2 << 6));
348  fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, block + (3 << 6));
349 
350  block += 256;
351  src += 32;
352  }
353  } else if (chroma && is_422){ /* chroma plane 422 */
354  for (i = 0; i < mb_count; i++) {
355  fdct_get(fdsp, src, src_stride, block + (0 << 6));
356  fdct_get(fdsp, src + 8 * src_stride, src_stride, block + (1 << 6));
357  block += (256 >> 1);
358  src += (32 >> 1);
359  }
360  } else { /* chroma plane 444 */
361  for (i = 0; i < mb_count; i++) {
362  fdct_get(fdsp, src, src_stride, block + (0 << 6));
363  fdct_get(fdsp, src + 8 * src_stride, src_stride, block + (1 << 6));
364  fdct_get(fdsp, src + 16, src_stride, block + (2 << 6));
365  fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, block + (3 << 6));
366 
367  block += 256;
368  src += 32;
369  }
370  }
371 }
372 
373 static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsigned buf_size, int *qmat, int sub_sample_chroma,
374  const uint8_t *scan)
375 {
376  int blocks_per_slice;
377  PutBitContext pb;
378 
379  blocks_per_slice = mb_count << (2 - sub_sample_chroma);
380  init_put_bits(&pb, buf, buf_size);
381 
382  encode_dcs(&pb, blocks, blocks_per_slice, qmat[0]);
383  encode_acs(&pb, blocks, blocks_per_slice, qmat, scan);
384 
385  flush_put_bits(&pb);
386  return put_bytes_output(&pb);
387 }
388 
390  int16_t * blocks_y, int16_t * blocks_u, int16_t * blocks_v,
391  unsigned mb_count, uint8_t *buf, unsigned data_size,
392  unsigned* y_data_size, unsigned* u_data_size, unsigned* v_data_size,
393  int qp)
394 {
395  ProresContext* ctx = avctx->priv_data;
396 
397  *y_data_size = encode_slice_plane(blocks_y, mb_count,
398  buf, data_size, ctx->qmat_luma[qp - 1], 0, ctx->scantable);
399 
400  if (!(avctx->flags & AV_CODEC_FLAG_GRAY)) {
401  *u_data_size = encode_slice_plane(blocks_u, mb_count, buf + *y_data_size, data_size - *y_data_size,
402  ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
403 
404  *v_data_size = encode_slice_plane(blocks_v, mb_count, buf + *y_data_size + *u_data_size,
405  data_size - *y_data_size - *u_data_size,
406  ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
407  }
408 
409  return *y_data_size + *u_data_size + *v_data_size;
410 }
411 
412 static void put_alpha_diff(PutBitContext *pb, int cur, int prev)
413 {
414  const int abits = 16;
415  const int dbits = 7;
416  const int dsize = 1 << dbits - 1;
417  int diff = cur - prev;
418 
419  diff = av_zero_extend(diff, abits);
420  if (diff >= (1 << abits) - dsize)
421  diff -= 1 << abits;
422  if (diff < -dsize || diff > dsize || !diff) {
423  put_bits(pb, 1, 1);
424  put_bits(pb, abits, diff);
425  } else {
426  put_bits(pb, 1, 0);
427  put_bits(pb, dbits - 1, FFABS(diff) - 1);
428  put_bits(pb, 1, diff < 0);
429  }
430 }
431 
432 static inline void put_alpha_run(PutBitContext *pb, int run)
433 {
434  if (run) {
435  put_bits(pb, 1, 0);
436  if (run < 0x10)
437  put_bits(pb, 4, run);
438  else
439  put_bits(pb, 15, run);
440  } else {
441  put_bits(pb, 1, 1);
442  }
443 }
444 
445 static av_always_inline int encode_alpha_slice_data(AVCodecContext *avctx, int8_t * src_a,
446  unsigned mb_count, uint8_t *buf, unsigned data_size, unsigned* a_data_size)
447 {
448  const int abits = 16;
449  const int mask = (1 << abits) - 1;
450  const int num_coeffs = mb_count * 256;
451  int prev = mask, cur;
452  int idx = 0;
453  int run = 0;
454  int16_t * blocks = (int16_t *)src_a;
455  PutBitContext pb;
456  init_put_bits(&pb, buf, data_size);
457 
458  cur = blocks[idx++];
459  put_alpha_diff(&pb, cur, prev);
460  prev = cur;
461  do {
462  cur = blocks[idx++];
463  if (cur != prev) {
464  put_alpha_run (&pb, run);
465  put_alpha_diff(&pb, cur, prev);
466  prev = cur;
467  run = 0;
468  } else {
469  run++;
470  }
471  } while (idx < num_coeffs);
472  put_alpha_run(&pb, run);
473  flush_put_bits(&pb);
474  *a_data_size = put_bytes_output(&pb);
475 
476  if (put_bits_left(&pb) < 0) {
477  av_log(avctx, AV_LOG_ERROR,
478  "Underestimated required buffer size.\n");
479  return AVERROR_BUG;
480  } else {
481  return 0;
482  }
483 }
484 
485 static inline void subimage_with_fill_template(const uint16_t *src, unsigned x, unsigned y,
486  unsigned stride, unsigned width, unsigned height, uint16_t *dst,
487  unsigned dst_width, unsigned dst_height, int is_alpha_plane,
488  int is_interlaced, int is_top_field)
489 {
490  int box_width = FFMIN(width - x, dst_width);
491  int i, j, src_stride, box_height;
492  uint16_t last_pix, *last_line;
493 
494  if (!is_interlaced) {
495  src_stride = stride >> 1;
496  src += y * src_stride + x;
497  box_height = FFMIN(height - y, dst_height);
498  } else {
499  src_stride = stride; /* 2 lines stride */
500  src += y * src_stride + x;
501  box_height = FFMIN(height/2 - y, dst_height);
502  if (!is_top_field)
503  src += stride >> 1;
504  }
505 
506  for (i = 0; i < box_height; ++i) {
507  for (j = 0; j < box_width; ++j) {
508  if (!is_alpha_plane) {
509  dst[j] = src[j];
510  } else {
511  dst[j] = src[j] << 6; /* alpha 10b to 16b */
512  }
513  }
514  if (!is_alpha_plane) {
515  last_pix = dst[j - 1];
516  } else {
517  last_pix = dst[j - 1] << 6; /* alpha 10b to 16b */
518  }
519  for (; j < dst_width; j++)
520  dst[j] = last_pix;
521  src += src_stride;
522  dst += dst_width;
523  }
524  last_line = dst - dst_width;
525  for (; i < dst_height; i++) {
526  for (j = 0; j < dst_width; ++j) {
527  dst[j] = last_line[j];
528  }
529  dst += dst_width;
530  }
531 }
532 
533 static void subimage_with_fill(const uint16_t *src, unsigned x, unsigned y,
534  unsigned stride, unsigned width, unsigned height, uint16_t *dst,
535  unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
536 {
537  subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 0, is_interlaced, is_top_field);
538 }
539 
540 /* reorganize alpha data and convert 10b -> 16b */
541 static void subimage_alpha_with_fill(const uint16_t *src, unsigned x, unsigned y,
542  unsigned stride, unsigned width, unsigned height, uint16_t *dst,
543  unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
544 {
545  subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 1, is_interlaced, is_top_field);
546 }
547 
548 static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x,
549  int mb_y, unsigned mb_count, uint8_t *buf, unsigned data_size,
550  int unsafe, int *qp, int is_interlaced, int is_top_field)
551 {
552  int luma_stride, chroma_stride, alpha_stride = 0;
553  ProresContext* ctx = avctx->priv_data;
554  int hdr_size = 6 + (ctx->need_alpha * 2); /* v data size is write when there is alpha */
555  int ret = 0, slice_size;
556  const uint8_t *dest_y, *dest_u, *dest_v;
557  unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0, a_data_size = 0;
558  FDCTDSPContext *fdsp = &ctx->fdsp;
559  int tgt_bits = (mb_count * bitrate_table[avctx->profile]) >> 2;
560  int low_bytes = (tgt_bits - (tgt_bits >> 3)) >> 3; // 12% bitrate fluctuation
561  int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
562 
563  LOCAL_ALIGNED(16, int16_t, blocks_y, [DEFAULT_SLICE_MB_WIDTH << 8]);
564  LOCAL_ALIGNED(16, int16_t, blocks_u, [DEFAULT_SLICE_MB_WIDTH << 8]);
565  LOCAL_ALIGNED(16, int16_t, blocks_v, [DEFAULT_SLICE_MB_WIDTH << 8]);
566 
567  luma_stride = pic->linesize[0];
568  chroma_stride = pic->linesize[1];
569 
570  if (ctx->need_alpha)
571  alpha_stride = pic->linesize[3];
572 
573  if (!is_interlaced) {
574  dest_y = pic->data[0] + (mb_y << 4) * luma_stride + (mb_x << 5);
575  dest_u = pic->data[1] + (mb_y << 4) * chroma_stride + (mb_x << (5 - ctx->is_422));
576  dest_v = pic->data[2] + (mb_y << 4) * chroma_stride + (mb_x << (5 - ctx->is_422));
577  } else {
578  dest_y = pic->data[0] + (mb_y << 4) * luma_stride * 2 + (mb_x << 5);
579  dest_u = pic->data[1] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 - ctx->is_422));
580  dest_v = pic->data[2] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 - ctx->is_422));
581  if (!is_top_field){ /* bottom field, offset dest */
582  dest_y += luma_stride;
583  dest_u += chroma_stride;
584  dest_v += chroma_stride;
585  }
586  }
587 
588  if (unsafe) {
589  subimage_with_fill((const uint16_t *) pic->data[0], mb_x << 4, mb_y << 4,
590  luma_stride, avctx->width, avctx->height,
591  (uint16_t *) ctx->fill_y, mb_count << 4, 16, is_interlaced, is_top_field);
592  subimage_with_fill((const uint16_t *) pic->data[1], mb_x << (4 - ctx->is_422), mb_y << 4,
593  chroma_stride, avctx->width >> ctx->is_422, avctx->height,
594  (uint16_t *) ctx->fill_u, mb_count << (4 - ctx->is_422), 16, is_interlaced, is_top_field);
595  subimage_with_fill((const uint16_t *) pic->data[2], mb_x << (4 - ctx->is_422), mb_y << 4,
596  chroma_stride, avctx->width >> ctx->is_422, avctx->height,
597  (uint16_t *) ctx->fill_v, mb_count << (4 - ctx->is_422), 16, is_interlaced, is_top_field);
598 
599  /* no need for interlaced special case, data already reorganized in subimage_with_fill */
600  calc_plane_dct(fdsp, ctx->fill_y, blocks_y, mb_count << 5, mb_count, 0, 0);
601  calc_plane_dct(fdsp, ctx->fill_u, blocks_u, mb_count << (5 - ctx->is_422), mb_count, 1, ctx->is_422);
602  calc_plane_dct(fdsp, ctx->fill_v, blocks_v, mb_count << (5 - ctx->is_422), mb_count, 1, ctx->is_422);
603 
604  slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
605  mb_count, buf + hdr_size, data_size - hdr_size,
606  &y_data_size, &u_data_size, &v_data_size,
607  *qp);
608  } else {
609  if (!is_interlaced) {
610  calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride, mb_count, 0, 0);
611  calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride, mb_count, 1, ctx->is_422);
612  calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride, mb_count, 1, ctx->is_422);
613  } else {
614  calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride * 2, mb_count, 0, 0);
615  calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride * 2, mb_count, 1, ctx->is_422);
616  calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride * 2, mb_count, 1, ctx->is_422);
617  }
618 
619  slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
620  mb_count, buf + hdr_size, data_size - hdr_size,
621  &y_data_size, &u_data_size, &v_data_size,
622  *qp);
623 
624  if (slice_size > high_bytes && *qp < qp_end_table[avctx->profile]) {
625  do {
626  *qp += 1;
627  slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
628  mb_count, buf + hdr_size, data_size - hdr_size,
629  &y_data_size, &u_data_size, &v_data_size,
630  *qp);
631  } while (slice_size > high_bytes && *qp < qp_end_table[avctx->profile]);
632  } else if (slice_size < low_bytes && *qp
633  > qp_start_table[avctx->profile]) {
634  do {
635  *qp -= 1;
636  slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
637  mb_count, buf + hdr_size, data_size - hdr_size,
638  &y_data_size, &u_data_size, &v_data_size,
639  *qp);
640  } while (slice_size < low_bytes && *qp > qp_start_table[avctx->profile]);
641  }
642  }
643 
644  buf[0] = hdr_size << 3;
645  buf[1] = *qp;
646  AV_WB16(buf + 2, y_data_size);
647  AV_WB16(buf + 4, u_data_size);
648 
649  if (ctx->need_alpha) {
650  AV_WB16(buf + 6, v_data_size); /* write v data size only if there is alpha */
651 
652  subimage_alpha_with_fill((const uint16_t *) pic->data[3], mb_x << 4, mb_y << 4,
653  alpha_stride, avctx->width, avctx->height,
654  (uint16_t *) ctx->fill_a, mb_count << 4, 16, is_interlaced, is_top_field);
655  ret = encode_alpha_slice_data(avctx, ctx->fill_a, mb_count,
656  buf + hdr_size + slice_size,
657  data_size - hdr_size - slice_size, &a_data_size);
658  }
659 
660  if (ret != 0) {
661  return ret;
662  }
663  return hdr_size + y_data_size + u_data_size + v_data_size + a_data_size;
664 }
665 
666 static int prores_encode_picture(AVCodecContext *avctx, const AVFrame *pic,
667  uint8_t *buf, const int buf_size, const int picture_index, const int is_top_field)
668 {
669  ProresContext *ctx = avctx->priv_data;
670  int mb_width = (avctx->width + 15) >> 4;
671  int hdr_size, sl_size, i;
672  int mb_y, sl_data_size, qp, mb_height, picture_height, unsafe_mb_height_limit;
673  int unsafe_bot, unsafe_right;
674  uint8_t *sl_data, *sl_data_sizes;
675  int slice_per_line = 0, rem = mb_width;
676 
677  if (!ctx->is_interlaced) { /* progressive encoding */
678  mb_height = (avctx->height + 15) >> 4;
679  unsafe_mb_height_limit = mb_height;
680  } else {
681  if (is_top_field) {
682  picture_height = (avctx->height + 1) / 2;
683  } else {
684  picture_height = avctx->height / 2;
685  }
686  mb_height = (picture_height + 15) >> 4;
687  unsafe_mb_height_limit = mb_height;
688  }
689 
690  for (i = av_log2(DEFAULT_SLICE_MB_WIDTH); i >= 0; --i) {
691  slice_per_line += rem >> i;
692  rem &= (1 << i) - 1;
693  }
694 
695  qp = qp_start_table[avctx->profile];
696  hdr_size = 8; sl_data_size = buf_size - hdr_size;
697  sl_data_sizes = buf + hdr_size;
698  sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
699  for (mb_y = 0; mb_y < mb_height; mb_y++) {
700  int mb_x = 0;
701  int slice_mb_count = DEFAULT_SLICE_MB_WIDTH;
702  while (mb_x < mb_width) {
703  while (mb_width - mb_x < slice_mb_count)
704  slice_mb_count >>= 1;
705 
706  unsafe_bot = (avctx->height & 0xf) && (mb_y == unsafe_mb_height_limit - 1);
707  unsafe_right = (avctx->width & 0xf) && (mb_x + slice_mb_count == mb_width);
708 
709  sl_size = encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
710  sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp, ctx->is_interlaced, is_top_field);
711  if (sl_size < 0){
712  return sl_size;
713  }
714 
715  bytestream_put_be16(&sl_data_sizes, sl_size);
716  sl_data += sl_size;
717  sl_data_size -= sl_size;
718  mb_x += slice_mb_count;
719  }
720  }
721 
722  buf[0] = hdr_size << 3;
723  AV_WB32(buf + 1, sl_data - buf);
724  AV_WB16(buf + 5, slice_per_line * mb_height); /* picture size */
725  buf[7] = av_log2(DEFAULT_SLICE_MB_WIDTH) << 4; /* number of slices */
726 
727  return sl_data - buf;
728 }
729 
731  const AVFrame *pict, int *got_packet)
732 {
733  ProresContext *ctx = avctx->priv_data;
734  int header_size = 148;
735  uint8_t *buf;
736  int compress_frame_size, pic_size, ret, is_top_field_first = 0;
737  uint8_t frame_flags;
738  int frame_size = FFALIGN(avctx->width, 16) * FFALIGN(avctx->height, 16)*16 + 500 + FF_INPUT_BUFFER_MIN_SIZE; //FIXME choose tighter limit
739 
740 
742  return ret;
743 
744  buf = pkt->data;
745  compress_frame_size = 8 + header_size;
746 
747  bytestream_put_be32(&buf, compress_frame_size);/* frame size will be update after picture(s) encoding */
748  bytestream_put_be32(&buf, FRAME_ID);
749 
750  bytestream_put_be16(&buf, header_size);
751  bytestream_put_be16(&buf, avctx->pix_fmt != AV_PIX_FMT_YUV422P10 || ctx->need_alpha ? 1 : 0); /* version */
752  bytestream_put_buffer(&buf, ctx->vendor, 4);
753  bytestream_put_be16(&buf, avctx->width);
754  bytestream_put_be16(&buf, avctx->height);
755  frame_flags = 0x80; /* 422 not interlaced */
756  if (avctx->profile >= AV_PROFILE_PRORES_4444) /* 4444 or 4444 Xq */
757  frame_flags |= 0x40; /* 444 chroma */
758  if (ctx->is_interlaced) {
760  /* tff frame or progressive frame interpret as tff */
761  av_log(avctx, AV_LOG_DEBUG, "use interlaced encoding, top field first\n");
762  frame_flags |= 0x04; /* interlaced tff */
763  is_top_field_first = 1;
764  } else {
765  av_log(avctx, AV_LOG_DEBUG, "use interlaced encoding, bottom field first\n");
766  frame_flags |= 0x08; /* interlaced bff */
767  }
768  } else {
769  av_log(avctx, AV_LOG_DEBUG, "use progressive encoding\n");
770  }
771  *buf++ = frame_flags;
772  *buf++ = 0; /* reserved */
773  /* only write color properties, if valid value. set to unspecified otherwise */
774  *buf++ = int_from_list_or_default(avctx, "frame color primaries",
775  pict->color_primaries, valid_primaries, 0);
776  *buf++ = int_from_list_or_default(avctx, "frame color trc",
777  pict->color_trc, valid_trc, 0);
778  *buf++ = int_from_list_or_default(avctx, "frame colorspace",
779  pict->colorspace, valid_colorspace, 0);
780  *buf++ = ctx->need_alpha ? 0x2 /* 16-bit alpha */ : 0;
781  *buf++ = 0; /* reserved */
782  *buf++ = 3; /* luma and chroma matrix present */
783 
784  bytestream_put_buffer(&buf, QMAT_LUMA[avctx->profile], 64);
785  bytestream_put_buffer(&buf, QMAT_CHROMA[avctx->profile], 64);
786 
787  pic_size = prores_encode_picture(avctx, pict, buf,
788  pkt->size - compress_frame_size, 0, is_top_field_first);/* encode progressive or first field */
789  if (pic_size < 0) {
790  return pic_size;
791  }
792  compress_frame_size += pic_size;
793 
794  if (ctx->is_interlaced) { /* encode second field */
795  pic_size = prores_encode_picture(avctx, pict, pkt->data + compress_frame_size,
796  pkt->size - compress_frame_size, 1, !is_top_field_first);
797  if (pic_size < 0) {
798  return pic_size;
799  }
800  compress_frame_size += pic_size;
801  }
802 
803  AV_WB32(pkt->data, compress_frame_size);/* update frame size */
804  pkt->size = compress_frame_size;
805  *got_packet = 1;
806 
807  return 0;
808 }
809 
810 static void scale_mat(const uint8_t* src, int* dst, int scale)
811 {
812  int i;
813  for (i = 0; i < 64; i++)
814  dst[i] = src[i] * scale;
815 }
816 
818 {
819  int i;
820  ProresContext* ctx = avctx->priv_data;
821 
822  avctx->bits_per_raw_sample = 10;
823  ctx->need_alpha = 0;
824  ctx->is_interlaced = !!(avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT);
825  if (ctx->is_interlaced) {
826  ctx->scantable = ff_prores_interlaced_scan;
827  } else {
828  ctx->scantable = ff_prores_progressive_scan;
829  }
830 
831  if (avctx->width & 0x1) {
832  av_log(avctx, AV_LOG_ERROR,
833  "frame width needs to be multiple of 2\n");
834  return AVERROR(EINVAL);
835  }
836 
837  if (avctx->width > 65534 || avctx->height > 65535) {
838  av_log(avctx, AV_LOG_ERROR,
839  "The maximum dimensions are 65534x65535\n");
840  return AVERROR(EINVAL);
841  }
842 
843  if (strlen(ctx->vendor) != 4) {
844  av_log(avctx, AV_LOG_ERROR, "vendor ID should be 4 bytes\n");
845  return AVERROR(EINVAL);
846  }
847 
848  if (avctx->profile == AV_PROFILE_UNKNOWN) {
849  switch (avctx->pix_fmt) {
852  av_log(avctx, AV_LOG_INFO,
853  "encoding with ProRes standard (apcn) profile\n");
854  break;
857  av_log(avctx, AV_LOG_INFO,
858  "encoding with ProRes 4444 (ap4h) profile\n");
859  break;
862  av_log(avctx, AV_LOG_INFO,
863  "encoding with ProRes 4444+ (ap4h) profile\n");
864  break;
865  default:
866  av_unreachable("Already checked via CODEC_PIXFMTS");
867  }
868  } else if (avctx->profile < AV_PROFILE_PRORES_PROXY
869  || avctx->profile > AV_PROFILE_PRORES_XQ) {
870  av_log(
871  avctx,
872  AV_LOG_ERROR,
873  "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h, 5 - ap4x]\n",
874  avctx->profile);
875  return AVERROR(EINVAL);
876  } else if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P10) && (avctx->profile > AV_PROFILE_PRORES_HQ)){
877  av_log(avctx, AV_LOG_ERROR,
878  "encoding with ProRes 444/Xq (ap4h/ap4x) profile, need YUV444P10 input\n");
879  return AVERROR(EINVAL);
880  } else if ((avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10)
881  && (avctx->profile < AV_PROFILE_PRORES_4444)){
882  av_log(avctx, AV_LOG_ERROR,
883  "encoding with ProRes Proxy/LT/422/422 HQ (apco, apcs, apcn, ap4h) profile, need YUV422P10 input\n");
884  return AVERROR(EINVAL);
885  }
886 
887  if (avctx->profile < AV_PROFILE_PRORES_4444) { /* 422 versions */
888  ctx->is_422 = 1;
889  if ((avctx->height & 0xf) || (avctx->width & 0xf)) {
890  ctx->fill_y = av_malloc(4 * (DEFAULT_SLICE_MB_WIDTH << 8));
891  if (!ctx->fill_y)
892  return AVERROR(ENOMEM);
893  ctx->fill_u = ctx->fill_y + (DEFAULT_SLICE_MB_WIDTH << 9);
894  ctx->fill_v = ctx->fill_u + (DEFAULT_SLICE_MB_WIDTH << 8);
895  }
896  } else { /* 444 */
897  ctx->is_422 = 0;
898  if ((avctx->height & 0xf) || (avctx->width & 0xf)) {
899  ctx->fill_y = av_malloc(3 * (DEFAULT_SLICE_MB_WIDTH << 9));
900  if (!ctx->fill_y)
901  return AVERROR(ENOMEM);
902  ctx->fill_u = ctx->fill_y + (DEFAULT_SLICE_MB_WIDTH << 9);
903  ctx->fill_v = ctx->fill_u + (DEFAULT_SLICE_MB_WIDTH << 9);
904  }
905  if (avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
906  ctx->need_alpha = 1;
907  ctx->fill_a = av_malloc(DEFAULT_SLICE_MB_WIDTH << 9); /* 8 blocks x 16px x 16px x sizeof (uint16) */
908  if (!ctx->fill_a)
909  return AVERROR(ENOMEM);
910  }
911  }
912 
913  if (ctx->need_alpha)
914  avctx->bits_per_coded_sample = 32;
915 
916  ff_fdctdsp_init(&ctx->fdsp, avctx);
917 
918  avctx->codec_tag = AV_RL32((const uint8_t*)profiles[avctx->profile].name);
919 
920  for (i = 1; i <= 16; i++) {
921  scale_mat(QMAT_LUMA[avctx->profile] , ctx->qmat_luma[i - 1] , i);
922  scale_mat(QMAT_CHROMA[avctx->profile], ctx->qmat_chroma[i - 1], i);
923  }
924 
925  return 0;
926 }
927 
929 {
930  ProresContext* ctx = avctx->priv_data;
931  av_freep(&ctx->fill_y);
932  av_freep(&ctx->fill_a);
933 
934  return 0;
935 }
936 
937 #define OFFSET(x) offsetof(ProresContext, x)
938 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
939 
940 static const AVOption options[] = {
941  { "vendor", "vendor ID", OFFSET(vendor), AV_OPT_TYPE_STRING, { .str = "fmpg" }, 0, 0, VE },
942  { NULL }
943 };
944 
945 static const AVClass prores_enc_class = {
946  .class_name = "ProRes encoder",
947  .item_name = av_default_item_name,
948  .option = options,
949  .version = LIBAVUTIL_VERSION_INT,
950 };
951 
952 static const enum AVPixelFormat pix_fmts[] = {
955 };
956 
958  .p.name = "prores_aw",
959  CODEC_LONG_NAME("Apple ProRes"),
960  .p.type = AVMEDIA_TYPE_VIDEO,
961  .p.id = AV_CODEC_ID_PRORES,
962  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
965  .color_ranges = AVCOL_RANGE_MPEG,
966  .priv_data_size = sizeof(ProresContext),
970  .p.priv_class = &prores_enc_class,
972  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
973 };
974 
976  .p.name = "prores",
977  CODEC_LONG_NAME("Apple ProRes"),
978  .p.type = AVMEDIA_TYPE_VIDEO,
979  .p.id = AV_CODEC_ID_PRORES,
980  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
983  .color_ranges = AVCOL_RANGE_MPEG,
984  .priv_data_size = sizeof(ProresContext),
988  .p.priv_class = &prores_enc_class,
990  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
991 };
int_from_list_or_default
static int int_from_list_or_default(void *ctx, const char *val_name, int val, const int *array_valid_values, int default_value)
Check if a value is in the list.
Definition: proresenc_anatoliy.c:211
AVFrame::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:665
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
level
uint8_t level
Definition: svq3.c:208
subimage_with_fill_template
static void subimage_with_fill_template(const uint16_t *src, unsigned x, unsigned y, unsigned stride, unsigned width, unsigned height, uint16_t *dst, unsigned dst_width, unsigned dst_height, int is_alpha_plane, int is_interlaced, int is_top_field)
Definition: proresenc_anatoliy.c:485
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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. Frame references ownership and permissions
opt.h
ProresContext::fdsp
FDCTDSPContext fdsp
Definition: proresenc_anatoliy.c:185
mem_internal.h
put_bytes_output
static int put_bytes_output(const PutBitContext *s)
Definition: put_bits.h:99
ff_prores_profiles
const AVProfile ff_prores_profiles[]
Definition: profiles.c:175
AVProfile::name
const char * name
short name for the profile
Definition: codec.h:166
GET_SIGN
#define GET_SIGN(x)
Definition: proresenc_anatoliy.c:260
options
static const AVOption options[]
Definition: proresenc_anatoliy.c:940
prores_encode_picture
static int prores_encode_picture(AVCodecContext *avctx, const AVFrame *pic, uint8_t *buf, const int buf_size, const int picture_index, const int is_top_field)
Definition: proresenc_anatoliy.c:666
put_sbits
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:291
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:62
prores_enc_class
static const AVClass prores_enc_class
Definition: proresenc_anatoliy.c:945
AVFrame::color_primaries
enum AVColorPrimaries color_primaries
Definition: frame.h:663
mask
int mask
Definition: mediacodecdec_common.c:154
ProresContext::vendor
char * vendor
Definition: proresenc_anatoliy.c:199
encode_slice
static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x, int mb_y, unsigned mb_count, uint8_t *buf, unsigned data_size, int unsafe, int *qp, int is_interlaced, int is_top_field)
Definition: proresenc_anatoliy.c:548
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:672
AV_RN64
#define AV_RN64(p)
Definition: intreadwrite.h:364
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:223
AVPacket::data
uint8_t * data
Definition: packet.h:535
AVOption
AVOption.
Definition: opt.h:429
encode.h
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:647
FIRST_DC_CB
#define FIRST_DC_CB
Definition: proresdata.h:36
chroma
static av_always_inline void chroma(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, int offset_y, int offset_x, int column, int mirror, int jobnr, int nb_jobs)
Definition: vf_waveform.c:1639
ProresContext
Definition: proresdec.h:43
FFCodec
Definition: codec_internal.h:127
encode_alpha_slice_data
static av_always_inline int encode_alpha_slice_data(AVCodecContext *avctx, int8_t *src_a, unsigned mb_count, uint8_t *buf, unsigned data_size, unsigned *a_data_size)
Definition: proresenc_anatoliy.c:445
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:654
VE
#define VE
Definition: proresenc_anatoliy.c:938
prores_encode_init
static av_cold int prores_encode_init(AVCodecContext *avctx)
Definition: proresenc_anatoliy.c:817
ff_prores_progressive_scan
const uint8_t ff_prores_progressive_scan[64]
Definition: proresdata.c:25
ff_prores_level_to_cb
const uint8_t ff_prores_level_to_cb[10]
Definition: proresdata.c:52
FF_INPUT_BUFFER_MIN_SIZE
#define FF_INPUT_BUFFER_MIN_SIZE
Used by some encoders as upper bound for the length of headers.
Definition: encode.h:33
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AV_PROFILE_PRORES_STANDARD
#define AV_PROFILE_PRORES_STANDARD
Definition: defs.h:183
encode_vlc_codeword
static void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
Definition: proresenc_anatoliy.c:231
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:638
AVProfile
AVProfile.
Definition: codec.h:164
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
QMAT_CHROMA
static const uint8_t QMAT_CHROMA[6][64]
Definition: proresenc_anatoliy.c:124
AV_PROFILE_PRORES_HQ
#define AV_PROFILE_PRORES_HQ
Definition: defs.h:184
FDCTDSPContext
Definition: fdctdsp.h:28
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
ff_prores_aw_encoder
const FFCodec ff_prores_aw_encoder
Definition: proresenc_anatoliy.c:957
put_bits_left
static int put_bits_left(PutBitContext *s)
Definition: put_bits.h:135
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
val
static double val(void *priv, double ch)
Definition: aeval.c:77
qp_start_table
static const int qp_start_table[]
Definition: proresenc_anatoliy.c:55
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:310
bitrate_table
static const int bitrate_table[]
Definition: proresenc_anatoliy.c:57
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:531
avassert.h
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:90
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
AVCOL_PRI_RESERVED0
@ AVCOL_PRI_RESERVED0
Definition: pixfmt.h:620
LOCAL_ALIGNED
#define LOCAL_ALIGNED(a, t, v,...)
Definition: mem_internal.h:124
prores_encode_frame
static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: proresenc_anatoliy.c:730
ProresContext::fill_v
uint8_t * fill_v
Definition: proresenc_anatoliy.c:188
prores_encode_close
static av_cold int prores_encode_close(AVCodecContext *avctx)
Definition: proresenc_anatoliy.c:928
put_alpha_run
static void put_alpha_run(PutBitContext *pb, int run)
Definition: proresenc_anatoliy.c:432
AVCOL_SPC_SMPTE170M
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition: pixfmt.h:680
frame_size
int frame_size
Definition: mxfenc.c:2446
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1553
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
AVFormatContext * ctx
Definition: movenc.c:49
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: proresenc_anatoliy.c:952
ff_prores_interlaced_scan
const uint8_t ff_prores_interlaced_scan[64]
Definition: proresdata.c:36
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:622
PutBitContext
Definition: put_bits.h:50
valid_primaries
static const int valid_primaries[]
Definition: proresenc_anatoliy.c:59
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
AVCOL_PRI_BT470BG
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:626
AVCOL_PRI_SMPTE170M
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
Definition: pixfmt.h:627
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
scale_mat
static void scale_mat(const uint8_t *src, int *dst, int scale)
Definition: proresenc_anatoliy.c:810
AVCOL_TRC_RESERVED0
@ AVCOL_TRC_RESERVED0
Definition: pixfmt.h:645
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ff_prores_run_to_cb
const uint8_t ff_prores_run_to_cb[16]
Definition: proresdata.c:49
NULL
#define NULL
Definition: coverity.c:32
run
uint8_t run
Definition: svq3.c:207
CODEC_PIXFMTS_ARRAY
#define CODEC_PIXFMTS_ARRAY(array)
Definition: codec_internal.h:387
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:401
av_unreachable
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition: avassert.h:109
ff_prores_encoder
const FFCodec ff_prores_encoder
Definition: proresenc_anatoliy.c:975
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:621
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
profiles.h
options
Definition: swscale.c:43
valid_trc
static const int valid_trc[]
Definition: proresenc_anatoliy.c:61
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:529
get
static void get(const uint8_t *pixels, int stride, int16_t *block)
Definition: proresenc_anatoliy.c:318
DEFAULT_SLICE_MB_WIDTH
#define DEFAULT_SLICE_MB_WIDTH
Definition: proresenc_anatoliy.c:43
AV_PROFILE_PRORES_LT
#define AV_PROFILE_PRORES_LT
Definition: defs.h:182
AVCOL_PRI_BT2020
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition: pixfmt.h:630
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
AVCOL_TRC_SMPTE2084
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition: pixfmt.h:661
ProresContext::fill_y
uint8_t * fill_y
Definition: proresenc_anatoliy.c:186
AVCOL_PRI_SMPTE431
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
Definition: pixfmt.h:633
profiles
static const AVProfile profiles[]
Definition: proresenc_anatoliy.c:45
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
put_alpha_diff
static void put_alpha_diff(PutBitContext *pb, int cur, int prev)
Definition: proresenc_anatoliy.c:412
ProresContext::fill_a
uint8_t * fill_a
Definition: proresenc_anatoliy.c:189
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:302
AVPacket::size
int size
Definition: packet.h:536
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
ProresContext::scantable
const uint8_t * scantable
Definition: proresenc_anatoliy.c:193
height
#define height
Definition: dsp.h:89
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
calc_plane_dct
static void calc_plane_dct(FDCTDSPContext *fdsp, const uint8_t *src, int16_t *blocks, int src_stride, int mb_count, int chroma, int is_422)
Definition: proresenc_anatoliy.c:336
ProresContext::is_interlaced
int is_interlaced
Definition: proresenc_anatoliy.c:197
proresdata.h
ProresContext::is_422
int is_422
Definition: proresenc_anatoliy.c:195
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
AV_PROFILE_PRORES_4444
#define AV_PROFILE_PRORES_4444
Definition: defs.h:185
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:575
ff_prores_dc_codebook
const uint8_t ff_prores_dc_codebook[7]
Definition: proresdata.c:47
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:621
av_zero_extend
#define av_zero_extend
Definition: common.h:151
AV_PROFILE_PRORES_PROXY
#define AV_PROFILE_PRORES_PROXY
Definition: defs.h:181
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:646
encode_acs
static void encode_acs(PutBitContext *pb, int16_t *blocks, int blocks_per_slice, int *qmat, const uint8_t *scan)
Definition: proresenc_anatoliy.c:287
encode_slice_plane
static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsigned buf_size, int *qmat, int sub_sample_chroma, const uint8_t *scan)
Definition: proresenc_anatoliy.c:373
AVCodecContext::bits_per_coded_sample
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:1546
bytestream_put_buffer
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
Definition: bytestream.h:372
subimage_with_fill
static void subimage_with_fill(const uint16_t *src, unsigned x, unsigned y, unsigned stride, unsigned width, unsigned height, uint16_t *dst, unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
Definition: proresenc_anatoliy.c:533
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
AVCOL_SPC_BT2020_NCL
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:684
ff_fdctdsp_init
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
Definition: fdctdsp.c:25
delta
float delta
Definition: vorbis_enc_data.h:430
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
fdctdsp.h
encode_dcs
static void encode_dcs(PutBitContext *pb, int16_t *blocks, int blocks_per_slice, int scale)
Definition: proresenc_anatoliy.c:263
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
OFFSET
#define OFFSET(x)
Definition: proresenc_anatoliy.c:937
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:676
fdct_get
static void fdct_get(FDCTDSPContext *fdsp, const uint8_t *pixels, int stride, int16_t *block)
Definition: proresenc_anatoliy.c:330
AVCodecContext::height
int height
Definition: avcodec.h:592
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
qp_end_table
static const int qp_end_table[]
Definition: proresenc_anatoliy.c:56
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:633
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
avcodec.h
stride
#define stride
Definition: h264pred_template.c:536
ProresContext::need_alpha
int need_alpha
Definition: proresenc_anatoliy.c:196
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
subimage_alpha_with_fill
static void subimage_alpha_with_fill(const uint16_t *src, unsigned x, unsigned y, unsigned stride, unsigned width, unsigned height, uint16_t *dst, unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
Definition: proresenc_anatoliy.c:541
encode_slice_data
static av_always_inline unsigned encode_slice_data(AVCodecContext *avctx, int16_t *blocks_y, int16_t *blocks_u, int16_t *blocks_v, unsigned mb_count, uint8_t *buf, unsigned data_size, unsigned *y_data_size, unsigned *u_data_size, unsigned *v_data_size, int qp)
Definition: proresenc_anatoliy.c:389
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
ProresContext::fill_u
uint8_t * fill_u
Definition: proresenc_anatoliy.c:187
AVCodecContext
main external API structure.
Definition: avcodec.h:431
AVCOL_TRC_ARIB_STD_B67
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition: pixfmt.h:665
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1618
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
FRAME_ID
#define FRAME_ID
Definition: proresdata.h:28
QMAT_LUMA
static const uint8_t QMAT_LUMA[6][64]
Definition: proresenc_anatoliy.c:66
valid_colorspace
static const int valid_colorspace[]
Definition: proresenc_anatoliy.c:63
FDCTDSPContext::fdct
void(* fdct)(int16_t *block)
Definition: fdctdsp.h:29
MAKE_CODE
#define MAKE_CODE(x)
Definition: proresenc_anatoliy.c:261
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:153
AVCOL_PRI_SMPTE432
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
Definition: pixfmt.h:634
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:456
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:273
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
bytestream.h
AV_PROFILE_PRORES_XQ
#define AV_PROFILE_PRORES_XQ
Definition: defs.h:186
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:455
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_WN64
#define AV_WN64(p, v)
Definition: intreadwrite.h:376
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
width
#define width
Definition: dsp.h:89
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition: pixfmt.h:675
put_bits.h
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:62
src
#define src
Definition: vp8dsp.c:248
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:41
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:200