FFmpeg
proresenc_kostya.c
Go to the documentation of this file.
1 /*
2  * Apple ProRes encoder
3  *
4  * Copyright (c) 2012 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 "libavutil/mem_internal.h"
24 #include "libavutil/opt.h"
25 #include "libavutil/pixdesc.h"
26 #include "avcodec.h"
27 #include "codec_internal.h"
28 #include "encode.h"
29 #include "fdctdsp.h"
30 #include "put_bits.h"
31 #include "profiles.h"
32 #include "bytestream.h"
33 #include "proresdata.h"
34 
35 #define CFACTOR_Y422 2
36 #define CFACTOR_Y444 3
37 
38 #define MAX_MBS_PER_SLICE 8
39 
40 #define MAX_PLANES 4
41 
42 enum {
50 };
51 
52 enum {
60 };
61 
62 static const uint8_t prores_quant_matrices[][64] = {
63  { // proxy
64  4, 7, 9, 11, 13, 14, 15, 63,
65  7, 7, 11, 12, 14, 15, 63, 63,
66  9, 11, 13, 14, 15, 63, 63, 63,
67  11, 11, 13, 14, 63, 63, 63, 63,
68  11, 13, 14, 63, 63, 63, 63, 63,
69  13, 14, 63, 63, 63, 63, 63, 63,
70  13, 63, 63, 63, 63, 63, 63, 63,
71  63, 63, 63, 63, 63, 63, 63, 63,
72  },
73  { // proxy chromas
74  4, 7, 9, 11, 13, 14, 63, 63,
75  7, 7, 11, 12, 14, 63, 63, 63,
76  9, 11, 13, 14, 63, 63, 63, 63,
77  11, 11, 13, 14, 63, 63, 63, 63,
78  11, 13, 14, 63, 63, 63, 63, 63,
79  13, 14, 63, 63, 63, 63, 63, 63,
80  13, 63, 63, 63, 63, 63, 63, 63,
81  63, 63, 63, 63, 63, 63, 63, 63
82  },
83  { // LT
84  4, 5, 6, 7, 9, 11, 13, 15,
85  5, 5, 7, 8, 11, 13, 15, 17,
86  6, 7, 9, 11, 13, 15, 15, 17,
87  7, 7, 9, 11, 13, 15, 17, 19,
88  7, 9, 11, 13, 14, 16, 19, 23,
89  9, 11, 13, 14, 16, 19, 23, 29,
90  9, 11, 13, 15, 17, 21, 28, 35,
91  11, 13, 16, 17, 21, 28, 35, 41,
92  },
93  { // standard
94  4, 4, 5, 5, 6, 7, 7, 9,
95  4, 4, 5, 6, 7, 7, 9, 9,
96  5, 5, 6, 7, 7, 9, 9, 10,
97  5, 5, 6, 7, 7, 9, 9, 10,
98  5, 6, 7, 7, 8, 9, 10, 12,
99  6, 7, 7, 8, 9, 10, 12, 15,
100  6, 7, 7, 9, 10, 11, 14, 17,
101  7, 7, 9, 10, 11, 14, 17, 21,
102  },
103  { // high quality
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  },
113  { // XQ luma
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, 2,
117  2, 2, 2, 2, 2, 2, 2, 3,
118  2, 2, 2, 2, 2, 2, 3, 3,
119  2, 2, 2, 2, 2, 3, 3, 3,
120  2, 2, 2, 2, 3, 3, 3, 4,
121  2, 2, 2, 2, 3, 3, 4, 4,
122  },
123  { // codec default
124  4, 4, 4, 4, 4, 4, 4, 4,
125  4, 4, 4, 4, 4, 4, 4, 4,
126  4, 4, 4, 4, 4, 4, 4, 4,
127  4, 4, 4, 4, 4, 4, 4, 4,
128  4, 4, 4, 4, 4, 4, 4, 4,
129  4, 4, 4, 4, 4, 4, 4, 4,
130  4, 4, 4, 4, 4, 4, 4, 4,
131  4, 4, 4, 4, 4, 4, 4, 4,
132  },
133 };
134 
135 static const uint8_t prores_dc_codebook[4] = {
136  0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
137  0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
138  0x4D, // rice_order = 2, exp_golomb_order = 3, switch_bits = 1
139  0x70 // rice_order = 3, exp_golomb_order = 4, switch_bits = 0
140 };
141 
142 static const uint8_t prores_ac_codebook[7] = {
143  0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
144  0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
145  0x4C, // rice_order = 2, exp_golomb_order = 3, switch_bits = 0
146  0x05, // rice_order = 0, exp_golomb_order = 1, switch_bits = 1
147  0x29, // rice_order = 1, exp_golomb_order = 2, switch_bits = 1
148  0x06, // rice_order = 0, exp_golomb_order = 1, switch_bits = 2
149  0x0A, // rice_order = 0, exp_golomb_order = 2, switch_bits = 2
150 };
151 
152 /**
153  * Lookup tables for adaptive switching between codebooks
154  * according with previous run/level value.
155  */
156 static const uint8_t prores_run_to_cb_index[16] =
157  { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 };
158 
159 static const uint8_t prores_lev_to_cb_index[10] = { 0, 6, 3, 5, 0, 1, 1, 1, 1, 2 };
160 
161 #define NUM_MB_LIMITS 4
162 static const int prores_mb_limits[NUM_MB_LIMITS] = {
163  1620, // up to 720x576
164  2700, // up to 960x720
165  6075, // up to 1440x1080
166  9216, // up to 2048x1152
167 };
168 
169 static const struct prores_profile {
170  const char *full_name;
171  uint32_t tag;
175  int quant;
177 } prores_profile_info[6] = {
178  {
179  .full_name = "proxy",
180  .tag = MKTAG('a', 'p', 'c', 'o'),
181  .min_quant = 4,
182  .max_quant = 8,
183  .br_tab = { 300, 242, 220, 194 },
184  .quant = QUANT_MAT_PROXY,
185  .quant_chroma = QUANT_MAT_PROXY_CHROMA,
186  },
187  {
188  .full_name = "LT",
189  .tag = MKTAG('a', 'p', 'c', 's'),
190  .min_quant = 1,
191  .max_quant = 9,
192  .br_tab = { 720, 560, 490, 440 },
193  .quant = QUANT_MAT_LT,
194  .quant_chroma = QUANT_MAT_LT,
195  },
196  {
197  .full_name = "standard",
198  .tag = MKTAG('a', 'p', 'c', 'n'),
199  .min_quant = 1,
200  .max_quant = 6,
201  .br_tab = { 1050, 808, 710, 632 },
202  .quant = QUANT_MAT_STANDARD,
203  .quant_chroma = QUANT_MAT_STANDARD,
204  },
205  {
206  .full_name = "high quality",
207  .tag = MKTAG('a', 'p', 'c', 'h'),
208  .min_quant = 1,
209  .max_quant = 6,
210  .br_tab = { 1566, 1216, 1070, 950 },
211  .quant = QUANT_MAT_HQ,
212  .quant_chroma = QUANT_MAT_HQ,
213  },
214  {
215  .full_name = "4444",
216  .tag = MKTAG('a', 'p', '4', 'h'),
217  .min_quant = 1,
218  .max_quant = 6,
219  .br_tab = { 2350, 1828, 1600, 1425 },
220  .quant = QUANT_MAT_HQ,
221  .quant_chroma = QUANT_MAT_HQ,
222  },
223  {
224  .full_name = "4444XQ",
225  .tag = MKTAG('a', 'p', '4', 'x'),
226  .min_quant = 1,
227  .max_quant = 6,
228  .br_tab = { 3525, 2742, 2400, 2137 },
229  .quant = QUANT_MAT_HQ, /* Fix me : use QUANT_MAT_XQ_LUMA */
230  .quant_chroma = QUANT_MAT_HQ,
231  }
232 };
233 
234 #define TRELLIS_WIDTH 16
235 #define SCORE_LIMIT INT_MAX / 2
236 
237 struct TrellisNode {
239  int quant;
240  int bits;
241  int score;
242 };
243 
244 #define MAX_STORED_Q 16
245 
246 typedef struct ProresThreadData {
248  DECLARE_ALIGNED(16, uint16_t, emu_buf)[16 * 16];
249  int16_t custom_q[64];
250  int16_t custom_chroma_q[64];
253 
254 typedef struct ProresContext {
255  AVClass *class;
257  DECLARE_ALIGNED(16, uint16_t, emu_buf)[16*16];
258  int16_t quants[MAX_STORED_Q][64];
260  int16_t custom_q[64];
261  int16_t custom_chroma_q[64];
262  const uint8_t *quant_mat;
263  const uint8_t *quant_chroma_mat;
264  const uint8_t *scantable;
265 
266  void (*fdct)(FDCTDSPContext *fdsp, const uint16_t *src,
267  ptrdiff_t linesize, int16_t *block);
269 
270  const AVFrame *pic;
276  int pictures_per_frame; // 1 for progressive, 2 for interlaced
282  int warn;
283 
284  char *vendor;
286 
288 
289  int profile;
291 
292  int *slice_q;
293 
295 } ProresContext;
296 
297 static void get_slice_data(ProresContext *ctx, const uint16_t *src,
298  ptrdiff_t linesize, int x, int y, int w, int h,
299  int16_t *blocks, uint16_t *emu_buf,
300  int mbs_per_slice, int blocks_per_mb, int is_chroma)
301 {
302  const uint16_t *esrc;
303  const int mb_width = 4 * blocks_per_mb;
304  ptrdiff_t elinesize;
305  int i, j, k;
306 
307  for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
308  if (x >= w) {
309  memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
310  * sizeof(*blocks));
311  return;
312  }
313  if (x + mb_width <= w && y + 16 <= h) {
314  esrc = src;
315  elinesize = linesize;
316  } else {
317  int bw, bh, pix;
318 
319  esrc = emu_buf;
320  elinesize = 16 * sizeof(*emu_buf);
321 
322  bw = FFMIN(w - x, mb_width);
323  bh = FFMIN(h - y, 16);
324 
325  for (j = 0; j < bh; j++) {
326  memcpy(emu_buf + j * 16,
327  (const uint8_t*)src + j * linesize,
328  bw * sizeof(*src));
329  pix = emu_buf[j * 16 + bw - 1];
330  for (k = bw; k < mb_width; k++)
331  emu_buf[j * 16 + k] = pix;
332  }
333  for (; j < 16; j++)
334  memcpy(emu_buf + j * 16,
335  emu_buf + (bh - 1) * 16,
336  mb_width * sizeof(*emu_buf));
337  }
338  if (!is_chroma) {
339  ctx->fdct(&ctx->fdsp, esrc, elinesize, blocks);
340  blocks += 64;
341  if (blocks_per_mb > 2) {
342  ctx->fdct(&ctx->fdsp, esrc + 8, elinesize, blocks);
343  blocks += 64;
344  }
345  ctx->fdct(&ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
346  blocks += 64;
347  if (blocks_per_mb > 2) {
348  ctx->fdct(&ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
349  blocks += 64;
350  }
351  } else {
352  ctx->fdct(&ctx->fdsp, esrc, elinesize, blocks);
353  blocks += 64;
354  ctx->fdct(&ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
355  blocks += 64;
356  if (blocks_per_mb > 2) {
357  ctx->fdct(&ctx->fdsp, esrc + 8, elinesize, blocks);
358  blocks += 64;
359  ctx->fdct(&ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
360  blocks += 64;
361  }
362  }
363 
364  x += mb_width;
365  }
366 }
367 
368 static void get_alpha_data(ProresContext *ctx, const uint16_t *src,
369  ptrdiff_t linesize, int x, int y, int w, int h,
370  int16_t *blocks, int mbs_per_slice, int abits)
371 {
372  const int slice_width = 16 * mbs_per_slice;
373  int i, j, copy_w, copy_h;
374 
375  copy_w = FFMIN(w - x, slice_width);
376  copy_h = FFMIN(h - y, 16);
377  for (i = 0; i < copy_h; i++) {
378  memcpy(blocks, src, copy_w * sizeof(*src));
379  if (abits == 8)
380  for (j = 0; j < copy_w; j++)
381  blocks[j] >>= 2;
382  else
383  for (j = 0; j < copy_w; j++)
384  blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
385  for (j = copy_w; j < slice_width; j++)
386  blocks[j] = blocks[copy_w - 1];
387  blocks += slice_width;
388  src += linesize >> 1;
389  }
390  for (; i < 16; i++) {
391  memcpy(blocks, blocks - slice_width, slice_width * sizeof(*blocks));
392  blocks += slice_width;
393  }
394 }
395 
396 /**
397  * Write an unsigned rice/exp golomb codeword.
398  */
399 static inline void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
400 {
401  unsigned int rice_order, exp_order, switch_bits, switch_val;
402  int exponent;
403 
404  /* number of prefix bits to switch between Rice and expGolomb */
405  switch_bits = (codebook & 3) + 1;
406  rice_order = codebook >> 5; /* rice code order */
407  exp_order = (codebook >> 2) & 7; /* exp golomb code order */
408 
409  switch_val = switch_bits << rice_order;
410 
411  if (val >= switch_val) {
412  val -= switch_val - (1 << exp_order);
413  exponent = av_log2(val);
414 
415  put_bits(pb, exponent - exp_order + switch_bits, 0);
416  put_bits(pb, exponent + 1, val);
417  } else {
418  exponent = val >> rice_order;
419 
420  if (exponent)
421  put_bits(pb, exponent, 0);
422  put_bits(pb, 1, 1);
423  if (rice_order)
424  put_sbits(pb, rice_order, val);
425  }
426 }
427 
428 #define GET_SIGN(x) ((x) >> 31)
429 #define MAKE_CODE(x) ((((x)) * 2) ^ GET_SIGN(x))
430 
431 static void encode_dcs(PutBitContext *pb, int16_t *blocks,
432  int blocks_per_slice, int scale)
433 {
434  int i;
435  int codebook = 3, code, dc, prev_dc, delta, sign, new_sign;
436 
437  prev_dc = (blocks[0] - 0x4000) / scale;
439  sign = 0;
440  codebook = 3;
441  blocks += 64;
442 
443  for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
444  dc = (blocks[0] - 0x4000) / scale;
445  delta = dc - prev_dc;
446  new_sign = GET_SIGN(delta);
447  delta = (delta ^ sign) - sign;
448  code = MAKE_CODE(delta);
450  codebook = (code + (code & 1)) >> 1;
451  codebook = FFMIN(codebook, 3);
452  sign = new_sign;
453  prev_dc = dc;
454  }
455 }
456 
457 static void encode_acs(PutBitContext *pb, int16_t *blocks,
458  int blocks_per_slice,
459  int plane_size_factor,
460  const uint8_t *scan, const int16_t *qmat)
461 {
462  int idx, i;
463  int run, level, run_cb, lev_cb;
464  int max_coeffs, abs_level;
465 
466  max_coeffs = blocks_per_slice << 6;
467  run_cb = prores_run_to_cb_index[4];
468  lev_cb = prores_lev_to_cb_index[2];
469  run = 0;
470 
471  for (i = 1; i < 64; i++) {
472  for (idx = scan[i]; idx < max_coeffs; idx += 64) {
473  level = blocks[idx] / qmat[scan[i]];
474  if (level) {
475  abs_level = FFABS(level);
478  abs_level - 1);
479  put_sbits(pb, 1, GET_SIGN(level));
480 
481  run_cb = prores_run_to_cb_index[FFMIN(run, 15)];
482  lev_cb = prores_lev_to_cb_index[FFMIN(abs_level, 9)];
483  run = 0;
484  } else {
485  run++;
486  }
487  }
488  }
489 }
490 
492  const uint16_t *src, ptrdiff_t linesize,
493  int mbs_per_slice, int16_t *blocks,
494  int blocks_per_mb, int plane_size_factor,
495  const int16_t *qmat)
496 {
497  int blocks_per_slice = mbs_per_slice * blocks_per_mb;
498 
499  encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
500  encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
501  ctx->scantable, qmat);
502 }
503 
504 static void put_alpha_diff(PutBitContext *pb, int cur, int prev, int abits)
505 {
506  const int dbits = (abits == 8) ? 4 : 7;
507  const int dsize = 1 << dbits - 1;
508  int diff = cur - prev;
509 
510  diff = av_mod_uintp2(diff, abits);
511  if (diff >= (1 << abits) - dsize)
512  diff -= 1 << abits;
513  if (diff < -dsize || diff > dsize || !diff) {
514  put_bits(pb, 1, 1);
515  put_bits(pb, abits, diff);
516  } else {
517  put_bits(pb, 1, 0);
518  put_bits(pb, dbits - 1, FFABS(diff) - 1);
519  put_bits(pb, 1, diff < 0);
520  }
521 }
522 
523 static void put_alpha_run(PutBitContext *pb, int run)
524 {
525  if (run) {
526  put_bits(pb, 1, 0);
527  if (run < 0x10)
528  put_bits(pb, 4, run);
529  else
530  put_bits(pb, 15, run);
531  } else {
532  put_bits(pb, 1, 1);
533  }
534 }
535 
536 // todo alpha quantisation for high quants
538  int mbs_per_slice, uint16_t *blocks,
539  int quant)
540 {
541  const int abits = ctx->alpha_bits;
542  const int mask = (1 << abits) - 1;
543  const int num_coeffs = mbs_per_slice * 256;
544  int prev = mask, cur;
545  int idx = 0;
546  int run = 0;
547 
548  cur = blocks[idx++];
549  put_alpha_diff(pb, cur, prev, abits);
550  prev = cur;
551  do {
552  cur = blocks[idx++];
553  if (cur != prev) {
554  put_alpha_run (pb, run);
555  put_alpha_diff(pb, cur, prev, abits);
556  prev = cur;
557  run = 0;
558  } else {
559  run++;
560  }
561  } while (idx < num_coeffs);
562  if (run)
563  put_alpha_run(pb, run);
564 }
565 
566 static int encode_slice(AVCodecContext *avctx, const AVFrame *pic,
567  PutBitContext *pb,
568  int sizes[4], int x, int y, int quant,
569  int mbs_per_slice)
570 {
571  ProresContext *ctx = avctx->priv_data;
572  int i, xp, yp;
573  int total_size = 0;
574  const uint16_t *src;
575  int slice_width_factor = av_log2(mbs_per_slice);
576  int num_cblocks, pwidth, line_add;
577  ptrdiff_t linesize;
578  int plane_factor, is_chroma;
579  uint16_t *qmat;
580  uint16_t *qmat_chroma;
581 
582  if (ctx->pictures_per_frame == 1)
583  line_add = 0;
584  else
585  line_add = ctx->cur_picture_idx ^ !(pic->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
586 
587  if (ctx->force_quant) {
588  qmat = ctx->quants[0];
589  qmat_chroma = ctx->quants_chroma[0];
590  } else if (quant < MAX_STORED_Q) {
591  qmat = ctx->quants[quant];
592  qmat_chroma = ctx->quants_chroma[quant];
593  } else {
594  qmat = ctx->custom_q;
595  qmat_chroma = ctx->custom_chroma_q;
596  for (i = 0; i < 64; i++) {
597  qmat[i] = ctx->quant_mat[i] * quant;
598  qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;
599  }
600  }
601 
602  for (i = 0; i < ctx->num_planes; i++) {
603  is_chroma = (i == 1 || i == 2);
604  plane_factor = slice_width_factor + 2;
605  if (is_chroma)
606  plane_factor += ctx->chroma_factor - 3;
607  if (!is_chroma || ctx->chroma_factor == CFACTOR_Y444) {
608  xp = x << 4;
609  yp = y << 4;
610  num_cblocks = 4;
611  pwidth = avctx->width;
612  } else {
613  xp = x << 3;
614  yp = y << 4;
615  num_cblocks = 2;
616  pwidth = avctx->width >> 1;
617  }
618 
619  linesize = pic->linesize[i] * ctx->pictures_per_frame;
620  src = (const uint16_t*)(pic->data[i] + yp * linesize +
621  line_add * pic->linesize[i]) + xp;
622 
623  if (i < 3) {
624  get_slice_data(ctx, src, linesize, xp, yp,
625  pwidth, avctx->height / ctx->pictures_per_frame,
626  ctx->blocks[0], ctx->emu_buf,
627  mbs_per_slice, num_cblocks, is_chroma);
628  if (!is_chroma) {/* luma quant */
629  encode_slice_plane(ctx, pb, src, linesize,
630  mbs_per_slice, ctx->blocks[0],
631  num_cblocks, plane_factor, qmat);
632  } else { /* chroma plane */
633  encode_slice_plane(ctx, pb, src, linesize,
634  mbs_per_slice, ctx->blocks[0],
635  num_cblocks, plane_factor, qmat_chroma);
636  }
637  } else {
638  get_alpha_data(ctx, src, linesize, xp, yp,
639  pwidth, avctx->height / ctx->pictures_per_frame,
640  ctx->blocks[0], mbs_per_slice, ctx->alpha_bits);
641  encode_alpha_plane(ctx, pb, mbs_per_slice, ctx->blocks[0], quant);
642  }
643  flush_put_bits(pb);
644  sizes[i] = put_bytes_output(pb) - total_size;
645  total_size = put_bytes_output(pb);
646  }
647  return total_size;
648 }
649 
650 static inline int estimate_vlc(unsigned codebook, int val)
651 {
652  unsigned int rice_order, exp_order, switch_bits, switch_val;
653  int exponent;
654 
655  /* number of prefix bits to switch between Rice and expGolomb */
656  switch_bits = (codebook & 3) + 1;
657  rice_order = codebook >> 5; /* rice code order */
658  exp_order = (codebook >> 2) & 7; /* exp golomb code order */
659 
660  switch_val = switch_bits << rice_order;
661 
662  if (val >= switch_val) {
663  val -= switch_val - (1 << exp_order);
664  exponent = av_log2(val);
665 
666  return exponent * 2 - exp_order + switch_bits + 1;
667  } else {
668  return (val >> rice_order) + rice_order + 1;
669  }
670 }
671 
672 static int estimate_dcs(int *error, int16_t *blocks, int blocks_per_slice,
673  int scale)
674 {
675  int i;
676  int codebook = 3, code, dc, prev_dc, delta, sign, new_sign;
677  int bits;
678 
679  prev_dc = (blocks[0] - 0x4000) / scale;
680  bits = estimate_vlc(FIRST_DC_CB, MAKE_CODE(prev_dc));
681  sign = 0;
682  codebook = 3;
683  blocks += 64;
684  *error += FFABS(blocks[0] - 0x4000) % scale;
685 
686  for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
687  dc = (blocks[0] - 0x4000) / scale;
688  *error += FFABS(blocks[0] - 0x4000) % scale;
689  delta = dc - prev_dc;
690  new_sign = GET_SIGN(delta);
691  delta = (delta ^ sign) - sign;
692  code = MAKE_CODE(delta);
694  codebook = (code + (code & 1)) >> 1;
695  codebook = FFMIN(codebook, 3);
696  sign = new_sign;
697  prev_dc = dc;
698  }
699 
700  return bits;
701 }
702 
703 static int estimate_acs(int *error, int16_t *blocks, int blocks_per_slice,
704  int plane_size_factor,
705  const uint8_t *scan, const int16_t *qmat)
706 {
707  int idx, i;
708  int run, level, run_cb, lev_cb;
709  int max_coeffs, abs_level;
710  int bits = 0;
711 
712  max_coeffs = blocks_per_slice << 6;
713  run_cb = prores_run_to_cb_index[4];
714  lev_cb = prores_lev_to_cb_index[2];
715  run = 0;
716 
717  for (i = 1; i < 64; i++) {
718  for (idx = scan[i]; idx < max_coeffs; idx += 64) {
719  level = blocks[idx] / qmat[scan[i]];
720  *error += FFABS(blocks[idx]) % qmat[scan[i]];
721  if (level) {
722  abs_level = FFABS(level);
725  abs_level - 1) + 1;
726 
727  run_cb = prores_run_to_cb_index[FFMIN(run, 15)];
728  lev_cb = prores_lev_to_cb_index[FFMIN(abs_level, 9)];
729  run = 0;
730  } else {
731  run++;
732  }
733  }
734  }
735 
736  return bits;
737 }
738 
739 static int estimate_slice_plane(ProresContext *ctx, int *error, int plane,
740  const uint16_t *src, ptrdiff_t linesize,
741  int mbs_per_slice,
742  int blocks_per_mb, int plane_size_factor,
743  const int16_t *qmat, ProresThreadData *td)
744 {
745  int blocks_per_slice;
746  int bits;
747 
748  blocks_per_slice = mbs_per_slice * blocks_per_mb;
749 
750  bits = estimate_dcs(error, td->blocks[plane], blocks_per_slice, qmat[0]);
751  bits += estimate_acs(error, td->blocks[plane], blocks_per_slice,
752  plane_size_factor, ctx->scantable, qmat);
753 
754  return FFALIGN(bits, 8);
755 }
756 
757 static int est_alpha_diff(int cur, int prev, int abits)
758 {
759  const int dbits = (abits == 8) ? 4 : 7;
760  const int dsize = 1 << dbits - 1;
761  int diff = cur - prev;
762 
763  diff = av_mod_uintp2(diff, abits);
764  if (diff >= (1 << abits) - dsize)
765  diff -= 1 << abits;
766  if (diff < -dsize || diff > dsize || !diff)
767  return abits + 1;
768  else
769  return dbits + 1;
770 }
771 
773  const uint16_t *src, ptrdiff_t linesize,
774  int mbs_per_slice, int16_t *blocks)
775 {
776  const int abits = ctx->alpha_bits;
777  const int mask = (1 << abits) - 1;
778  const int num_coeffs = mbs_per_slice * 256;
779  int prev = mask, cur;
780  int idx = 0;
781  int run = 0;
782  int bits;
783 
784  cur = blocks[idx++];
785  bits = est_alpha_diff(cur, prev, abits);
786  prev = cur;
787  do {
788  cur = blocks[idx++];
789  if (cur != prev) {
790  if (!run)
791  bits++;
792  else if (run < 0x10)
793  bits += 4;
794  else
795  bits += 15;
796  bits += est_alpha_diff(cur, prev, abits);
797  prev = cur;
798  run = 0;
799  } else {
800  run++;
801  }
802  } while (idx < num_coeffs);
803 
804  if (run) {
805  if (run < 0x10)
806  bits += 4;
807  else
808  bits += 15;
809  }
810 
811  return bits;
812 }
813 
815  int trellis_node, int x, int y, int mbs_per_slice,
817 {
818  ProresContext *ctx = avctx->priv_data;
819  int i, q, pq, xp, yp;
820  const uint16_t *src;
821  int slice_width_factor = av_log2(mbs_per_slice);
822  int num_cblocks[MAX_PLANES], pwidth;
823  int plane_factor[MAX_PLANES], is_chroma[MAX_PLANES];
824  const int min_quant = ctx->profile_info->min_quant;
825  const int max_quant = ctx->profile_info->max_quant;
826  int error, bits, bits_limit;
827  int mbs, prev, cur, new_score;
828  int slice_bits[TRELLIS_WIDTH], slice_score[TRELLIS_WIDTH];
829  int overquant;
830  uint16_t *qmat;
831  uint16_t *qmat_chroma;
832  int linesize[4], line_add;
833  int alpha_bits = 0;
834 
835  if (ctx->pictures_per_frame == 1)
836  line_add = 0;
837  else
838  line_add = ctx->cur_picture_idx ^ !(ctx->pic->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
839  mbs = x + mbs_per_slice;
840 
841  for (i = 0; i < ctx->num_planes; i++) {
842  is_chroma[i] = (i == 1 || i == 2);
843  plane_factor[i] = slice_width_factor + 2;
844  if (is_chroma[i])
845  plane_factor[i] += ctx->chroma_factor - 3;
846  if (!is_chroma[i] || ctx->chroma_factor == CFACTOR_Y444) {
847  xp = x << 4;
848  yp = y << 4;
849  num_cblocks[i] = 4;
850  pwidth = avctx->width;
851  } else {
852  xp = x << 3;
853  yp = y << 4;
854  num_cblocks[i] = 2;
855  pwidth = avctx->width >> 1;
856  }
857 
858  linesize[i] = ctx->pic->linesize[i] * ctx->pictures_per_frame;
859  src = (const uint16_t *)(ctx->pic->data[i] + yp * linesize[i] +
860  line_add * ctx->pic->linesize[i]) + xp;
861 
862  if (i < 3) {
863  get_slice_data(ctx, src, linesize[i], xp, yp,
864  pwidth, avctx->height / ctx->pictures_per_frame,
865  td->blocks[i], td->emu_buf,
866  mbs_per_slice, num_cblocks[i], is_chroma[i]);
867  } else {
868  get_alpha_data(ctx, src, linesize[i], xp, yp,
869  pwidth, avctx->height / ctx->pictures_per_frame,
870  td->blocks[i], mbs_per_slice, ctx->alpha_bits);
871  }
872  }
873 
874  for (q = min_quant; q < max_quant + 2; q++) {
875  td->nodes[trellis_node + q].prev_node = -1;
876  td->nodes[trellis_node + q].quant = q;
877  }
878 
879  if (ctx->alpha_bits)
880  alpha_bits = estimate_alpha_plane(ctx, src, linesize[3],
881  mbs_per_slice, td->blocks[3]);
882  // todo: maybe perform coarser quantising to fit into frame size when needed
883  for (q = min_quant; q <= max_quant; q++) {
884  bits = alpha_bits;
885  error = 0;
887  src, linesize[0],
888  mbs_per_slice,
889  num_cblocks[0], plane_factor[0],
890  ctx->quants[q], td); /* estimate luma plane */
891  for (i = 1; i < ctx->num_planes - !!ctx->alpha_bits; i++) { /* estimate chroma plane */
893  src, linesize[i],
894  mbs_per_slice,
895  num_cblocks[i], plane_factor[i],
896  ctx->quants_chroma[q], td);
897  }
898  if (bits > 65000 * 8)
899  error = SCORE_LIMIT;
900 
901  slice_bits[q] = bits;
902  slice_score[q] = error;
903  }
904  if (slice_bits[max_quant] <= ctx->bits_per_mb * mbs_per_slice) {
905  slice_bits[max_quant + 1] = slice_bits[max_quant];
906  slice_score[max_quant + 1] = slice_score[max_quant] + 1;
907  overquant = max_quant;
908  } else {
909  for (q = max_quant + 1; q < 128; q++) {
910  bits = alpha_bits;
911  error = 0;
912  if (q < MAX_STORED_Q) {
913  qmat = ctx->quants[q];
914  qmat_chroma = ctx->quants_chroma[q];
915  } else {
916  qmat = td->custom_q;
917  qmat_chroma = td->custom_chroma_q;
918  for (i = 0; i < 64; i++) {
919  qmat[i] = ctx->quant_mat[i] * q;
920  qmat_chroma[i] = ctx->quant_chroma_mat[i] * q;
921  }
922  }
924  src, linesize[0],
925  mbs_per_slice,
926  num_cblocks[0], plane_factor[0],
927  qmat, td);/* estimate luma plane */
928  for (i = 1; i < ctx->num_planes - !!ctx->alpha_bits; i++) { /* estimate chroma plane */
930  src, linesize[i],
931  mbs_per_slice,
932  num_cblocks[i], plane_factor[i],
933  qmat_chroma, td);
934  }
935  if (bits <= ctx->bits_per_mb * mbs_per_slice)
936  break;
937  }
938 
939  slice_bits[max_quant + 1] = bits;
940  slice_score[max_quant + 1] = error;
941  overquant = q;
942  }
943  td->nodes[trellis_node + max_quant + 1].quant = overquant;
944 
945  bits_limit = mbs * ctx->bits_per_mb;
946  for (pq = min_quant; pq < max_quant + 2; pq++) {
947  prev = trellis_node - TRELLIS_WIDTH + pq;
948 
949  for (q = min_quant; q < max_quant + 2; q++) {
950  cur = trellis_node + q;
951 
952  bits = td->nodes[prev].bits + slice_bits[q];
953  error = slice_score[q];
954  if (bits > bits_limit)
955  error = SCORE_LIMIT;
956 
957  if (td->nodes[prev].score < SCORE_LIMIT && error < SCORE_LIMIT)
958  new_score = td->nodes[prev].score + error;
959  else
960  new_score = SCORE_LIMIT;
961  if (td->nodes[cur].prev_node == -1 ||
962  td->nodes[cur].score >= new_score) {
963 
964  td->nodes[cur].bits = bits;
965  td->nodes[cur].score = new_score;
966  td->nodes[cur].prev_node = prev;
967  }
968  }
969  }
970 
971  error = td->nodes[trellis_node + min_quant].score;
972  pq = trellis_node + min_quant;
973  for (q = min_quant + 1; q < max_quant + 2; q++) {
974  if (td->nodes[trellis_node + q].score <= error) {
975  error = td->nodes[trellis_node + q].score;
976  pq = trellis_node + q;
977  }
978  }
979 
980  return pq;
981 }
982 
983 static int find_quant_thread(AVCodecContext *avctx, void *arg,
984  int jobnr, int threadnr)
985 {
986  ProresContext *ctx = avctx->priv_data;
987  ProresThreadData *td = ctx->tdata + threadnr;
988  int mbs_per_slice = ctx->mbs_per_slice;
989  int x, y = jobnr, mb, q = 0;
990 
991  for (x = mb = 0; x < ctx->mb_width; x += mbs_per_slice, mb++) {
992  while (ctx->mb_width - x < mbs_per_slice)
993  mbs_per_slice >>= 1;
994  q = find_slice_quant(avctx,
995  (mb + 1) * TRELLIS_WIDTH, x, y,
996  mbs_per_slice, td);
997  }
998 
999  for (x = ctx->slices_width - 1; x >= 0; x--) {
1000  ctx->slice_q[x + y * ctx->slices_width] = td->nodes[q].quant;
1001  q = td->nodes[q].prev_node;
1002  }
1003 
1004  return 0;
1005 }
1006 
1008  const AVFrame *pic, int *got_packet)
1009 {
1010  ProresContext *ctx = avctx->priv_data;
1011  uint8_t *orig_buf, *buf, *slice_hdr, *slice_sizes, *tmp;
1012  uint8_t *picture_size_pos;
1013  PutBitContext pb;
1014  int x, y, i, mb, q = 0;
1015  int sizes[4] = { 0 };
1016  int slice_hdr_size = 2 + 2 * (ctx->num_planes - 1);
1017  int frame_size, picture_size, slice_size;
1018  int pkt_size, ret;
1019  int max_slice_size = (ctx->frame_size_upper_bound - 200) / (ctx->pictures_per_frame * ctx->slices_per_picture + 1);
1020  uint8_t frame_flags;
1021 
1022  ctx->pic = pic;
1023  pkt_size = ctx->frame_size_upper_bound;
1024 
1025  if ((ret = ff_alloc_packet(avctx, pkt, pkt_size + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
1026  return ret;
1027 
1028  orig_buf = pkt->data;
1029 
1030  // frame atom
1031  orig_buf += 4; // frame size
1032  bytestream_put_be32 (&orig_buf, FRAME_ID); // frame container ID
1033  buf = orig_buf;
1034 
1035  // frame header
1036  tmp = buf;
1037  buf += 2; // frame header size will be stored here
1038  bytestream_put_be16 (&buf, 0); // version 1
1039  bytestream_put_buffer(&buf, ctx->vendor, 4);
1040  bytestream_put_be16 (&buf, avctx->width);
1041  bytestream_put_be16 (&buf, avctx->height);
1042 
1043  frame_flags = ctx->chroma_factor << 6;
1044  if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT)
1045  frame_flags |= (pic->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? 0x04 : 0x08;
1046  bytestream_put_byte (&buf, frame_flags);
1047 
1048  bytestream_put_byte (&buf, 0); // reserved
1049  bytestream_put_byte (&buf, pic->color_primaries);
1050  bytestream_put_byte (&buf, pic->color_trc);
1051  bytestream_put_byte (&buf, pic->colorspace);
1052  bytestream_put_byte (&buf, 0x40 | (ctx->alpha_bits >> 3));
1053  bytestream_put_byte (&buf, 0); // reserved
1054  if (ctx->quant_sel != QUANT_MAT_DEFAULT) {
1055  bytestream_put_byte (&buf, 0x03); // matrix flags - both matrices are present
1056  // luma quantisation matrix
1057  for (i = 0; i < 64; i++)
1058  bytestream_put_byte(&buf, ctx->quant_mat[i]);
1059  // chroma quantisation matrix
1060  for (i = 0; i < 64; i++)
1061  bytestream_put_byte(&buf, ctx->quant_mat[i]);
1062  } else {
1063  bytestream_put_byte (&buf, 0x00); // matrix flags - default matrices are used
1064  }
1065  bytestream_put_be16 (&tmp, buf - orig_buf); // write back frame header size
1066 
1067  for (ctx->cur_picture_idx = 0;
1068  ctx->cur_picture_idx < ctx->pictures_per_frame;
1069  ctx->cur_picture_idx++) {
1070  // picture header
1071  picture_size_pos = buf + 1;
1072  bytestream_put_byte (&buf, 0x40); // picture header size (in bits)
1073  buf += 4; // picture data size will be stored here
1074  bytestream_put_be16 (&buf, ctx->slices_per_picture);
1075  bytestream_put_byte (&buf, av_log2(ctx->mbs_per_slice) << 4); // slice width and height in MBs
1076 
1077  // seek table - will be filled during slice encoding
1078  slice_sizes = buf;
1079  buf += ctx->slices_per_picture * 2;
1080 
1081  // slices
1082  if (!ctx->force_quant) {
1083  ret = avctx->execute2(avctx, find_quant_thread, (void*)pic, NULL,
1084  ctx->mb_height);
1085  if (ret)
1086  return ret;
1087  }
1088 
1089  for (y = 0; y < ctx->mb_height; y++) {
1090  int mbs_per_slice = ctx->mbs_per_slice;
1091  for (x = mb = 0; x < ctx->mb_width; x += mbs_per_slice, mb++) {
1092  q = ctx->force_quant ? ctx->force_quant
1093  : ctx->slice_q[mb + y * ctx->slices_width];
1094 
1095  while (ctx->mb_width - x < mbs_per_slice)
1096  mbs_per_slice >>= 1;
1097 
1098  bytestream_put_byte(&buf, slice_hdr_size << 3);
1099  slice_hdr = buf;
1100  buf += slice_hdr_size - 1;
1101  if (pkt_size <= buf - orig_buf + 2 * max_slice_size) {
1102  uint8_t *start = pkt->data;
1103  // Recompute new size according to max_slice_size
1104  // and deduce delta
1105  int delta = 200 + (ctx->pictures_per_frame *
1106  ctx->slices_per_picture + 1) *
1107  max_slice_size - pkt_size;
1108 
1109  delta = FFMAX(delta, 2 * max_slice_size);
1110  ctx->frame_size_upper_bound += delta;
1111 
1112  if (!ctx->warn) {
1113  avpriv_request_sample(avctx,
1114  "Packet too small: is %i,"
1115  " needs %i (slice: %i). "
1116  "Correct allocation",
1117  pkt_size, delta, max_slice_size);
1118  ctx->warn = 1;
1119  }
1120 
1122  if (ret < 0)
1123  return ret;
1124 
1125  pkt_size += delta;
1126  // restore pointers
1127  orig_buf = pkt->data + (orig_buf - start);
1128  buf = pkt->data + (buf - start);
1129  picture_size_pos = pkt->data + (picture_size_pos - start);
1130  slice_sizes = pkt->data + (slice_sizes - start);
1131  slice_hdr = pkt->data + (slice_hdr - start);
1132  tmp = pkt->data + (tmp - start);
1133  }
1134  init_put_bits(&pb, buf, (pkt_size - (buf - orig_buf)));
1135  ret = encode_slice(avctx, pic, &pb, sizes, x, y, q,
1136  mbs_per_slice);
1137  if (ret < 0)
1138  return ret;
1139 
1140  bytestream_put_byte(&slice_hdr, q);
1141  slice_size = slice_hdr_size + sizes[ctx->num_planes - 1];
1142  for (i = 0; i < ctx->num_planes - 1; i++) {
1143  bytestream_put_be16(&slice_hdr, sizes[i]);
1144  slice_size += sizes[i];
1145  }
1146  bytestream_put_be16(&slice_sizes, slice_size);
1147  buf += slice_size - slice_hdr_size;
1148  if (max_slice_size < slice_size)
1149  max_slice_size = slice_size;
1150  }
1151  }
1152 
1153  picture_size = buf - (picture_size_pos - 1);
1154  bytestream_put_be32(&picture_size_pos, picture_size);
1155  }
1156 
1157  orig_buf -= 8;
1158  frame_size = buf - orig_buf;
1159  bytestream_put_be32(&orig_buf, frame_size);
1160 
1161  pkt->size = frame_size;
1162  *got_packet = 1;
1163 
1164  return 0;
1165 }
1166 
1168 {
1169  ProresContext *ctx = avctx->priv_data;
1170  int i;
1171 
1172  if (ctx->tdata) {
1173  for (i = 0; i < avctx->thread_count; i++)
1174  av_freep(&ctx->tdata[i].nodes);
1175  }
1176  av_freep(&ctx->tdata);
1177  av_freep(&ctx->slice_q);
1178 
1179  return 0;
1180 }
1181 
1182 static void prores_fdct(FDCTDSPContext *fdsp, const uint16_t *src,
1183  ptrdiff_t linesize, int16_t *block)
1184 {
1185  int x, y;
1186  const uint16_t *tsrc = src;
1187 
1188  for (y = 0; y < 8; y++) {
1189  for (x = 0; x < 8; x++)
1190  block[y * 8 + x] = tsrc[x];
1191  tsrc += linesize >> 1;
1192  }
1193  fdsp->fdct(block);
1194 }
1195 
1197 {
1198  ProresContext *ctx = avctx->priv_data;
1199  int mps;
1200  int i, j;
1201  int min_quant, max_quant;
1202  int interlaced = !!(avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT);
1203 
1204  avctx->bits_per_raw_sample = 10;
1205 
1206  ctx->fdct = prores_fdct;
1209  ff_fdctdsp_init(&ctx->fdsp, avctx);
1210 
1211  mps = ctx->mbs_per_slice;
1212  if (mps & (mps - 1)) {
1213  av_log(avctx, AV_LOG_ERROR,
1214  "there should be an integer power of two MBs per slice\n");
1215  return AVERROR(EINVAL);
1216  }
1217  if (ctx->profile == PRORES_PROFILE_AUTO) {
1219  ctx->profile = (desc->flags & AV_PIX_FMT_FLAG_ALPHA ||
1220  !(desc->log2_chroma_w + desc->log2_chroma_h))
1222  av_log(avctx, AV_LOG_INFO, "Autoselected %s. It can be overridden "
1223  "through -profile option.\n", ctx->profile == PRORES_PROFILE_4444
1224  ? "4:4:4:4 profile because of the used input colorspace"
1225  : "HQ profile to keep best quality");
1226  }
1228  if (ctx->profile != PRORES_PROFILE_4444 &&
1229  ctx->profile != PRORES_PROFILE_4444XQ) {
1230  // force alpha and warn
1231  av_log(avctx, AV_LOG_WARNING, "Profile selected will not "
1232  "encode alpha. Override with -profile if needed.\n");
1233  ctx->alpha_bits = 0;
1234  }
1235  if (ctx->alpha_bits & 7) {
1236  av_log(avctx, AV_LOG_ERROR, "alpha bits should be 0, 8 or 16\n");
1237  return AVERROR(EINVAL);
1238  }
1239  avctx->bits_per_coded_sample = 32;
1240  } else {
1241  ctx->alpha_bits = 0;
1242  }
1243 
1244  ctx->chroma_factor = avctx->pix_fmt == AV_PIX_FMT_YUV422P10
1245  ? CFACTOR_Y422
1246  : CFACTOR_Y444;
1247  ctx->profile_info = prores_profile_info + ctx->profile;
1248  ctx->num_planes = 3 + !!ctx->alpha_bits;
1249 
1250  ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
1251 
1252  if (interlaced)
1253  ctx->mb_height = FFALIGN(avctx->height, 32) >> 5;
1254  else
1255  ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
1256 
1257  ctx->slices_width = ctx->mb_width / mps;
1258  ctx->slices_width += av_popcount(ctx->mb_width - ctx->slices_width * mps);
1259  ctx->slices_per_picture = ctx->mb_height * ctx->slices_width;
1260  ctx->pictures_per_frame = 1 + interlaced;
1261 
1262  if (ctx->quant_sel == -1) {
1263  ctx->quant_mat = prores_quant_matrices[ctx->profile_info->quant];
1264  ctx->quant_chroma_mat = prores_quant_matrices[ctx->profile_info->quant_chroma];
1265  } else {
1266  ctx->quant_mat = prores_quant_matrices[ctx->quant_sel];
1267  ctx->quant_chroma_mat = prores_quant_matrices[ctx->quant_sel];
1268  }
1269 
1270  if (strlen(ctx->vendor) != 4) {
1271  av_log(avctx, AV_LOG_ERROR, "vendor ID should be 4 bytes\n");
1272  return AVERROR_INVALIDDATA;
1273  }
1274 
1275  ctx->force_quant = avctx->global_quality / FF_QP2LAMBDA;
1276  if (!ctx->force_quant) {
1277  if (!ctx->bits_per_mb) {
1278  for (i = 0; i < NUM_MB_LIMITS - 1; i++)
1279  if (prores_mb_limits[i] >= ctx->mb_width * ctx->mb_height *
1280  ctx->pictures_per_frame)
1281  break;
1282  ctx->bits_per_mb = ctx->profile_info->br_tab[i];
1283  if (ctx->alpha_bits)
1284  ctx->bits_per_mb *= 20;
1285  } else if (ctx->bits_per_mb < 128) {
1286  av_log(avctx, AV_LOG_ERROR, "too few bits per MB, please set at least 128\n");
1287  return AVERROR_INVALIDDATA;
1288  }
1289 
1290  min_quant = ctx->profile_info->min_quant;
1291  max_quant = ctx->profile_info->max_quant;
1292  for (i = min_quant; i < MAX_STORED_Q; i++) {
1293  for (j = 0; j < 64; j++) {
1294  ctx->quants[i][j] = ctx->quant_mat[j] * i;
1295  ctx->quants_chroma[i][j] = ctx->quant_chroma_mat[j] * i;
1296  }
1297  }
1298 
1299  ctx->slice_q = av_malloc_array(ctx->slices_per_picture, sizeof(*ctx->slice_q));
1300  if (!ctx->slice_q)
1301  return AVERROR(ENOMEM);
1302 
1303  ctx->tdata = av_calloc(avctx->thread_count, sizeof(*ctx->tdata));
1304  if (!ctx->tdata)
1305  return AVERROR(ENOMEM);
1306 
1307  for (j = 0; j < avctx->thread_count; j++) {
1308  ctx->tdata[j].nodes = av_malloc_array(ctx->slices_width + 1,
1310  * sizeof(*ctx->tdata->nodes));
1311  if (!ctx->tdata[j].nodes)
1312  return AVERROR(ENOMEM);
1313  for (i = min_quant; i < max_quant + 2; i++) {
1314  ctx->tdata[j].nodes[i].prev_node = -1;
1315  ctx->tdata[j].nodes[i].bits = 0;
1316  ctx->tdata[j].nodes[i].score = 0;
1317  }
1318  }
1319  } else {
1320  int ls = 0;
1321  int ls_chroma = 0;
1322 
1323  if (ctx->force_quant > 64) {
1324  av_log(avctx, AV_LOG_ERROR, "too large quantiser, maximum is 64\n");
1325  return AVERROR_INVALIDDATA;
1326  }
1327 
1328  for (j = 0; j < 64; j++) {
1329  ctx->quants[0][j] = ctx->quant_mat[j] * ctx->force_quant;
1330  ctx->quants_chroma[0][j] = ctx->quant_chroma_mat[j] * ctx->force_quant;
1331  ls += av_log2((1 << 11) / ctx->quants[0][j]) * 2 + 1;
1332  ls_chroma += av_log2((1 << 11) / ctx->quants_chroma[0][j]) * 2 + 1;
1333  }
1334 
1335  ctx->bits_per_mb = ls * 4 + ls_chroma * 4;
1336  if (ctx->chroma_factor == CFACTOR_Y444)
1337  ctx->bits_per_mb += ls_chroma * 4;
1338  }
1339 
1340  ctx->frame_size_upper_bound = (ctx->pictures_per_frame *
1341  ctx->slices_per_picture + 1) *
1342  (2 + 2 * ctx->num_planes +
1343  (mps * ctx->bits_per_mb) / 8)
1344  + 200;
1345 
1346  if (ctx->alpha_bits) {
1347  // The alpha plane is run-coded and might exceed the bit budget.
1348  ctx->frame_size_upper_bound += (ctx->pictures_per_frame *
1349  ctx->slices_per_picture + 1) *
1350  /* num pixels per slice */ (ctx->mbs_per_slice * 256 *
1351  /* bits per pixel */ (1 + ctx->alpha_bits + 1) + 7 >> 3);
1352  }
1353 
1354  avctx->codec_tag = ctx->profile_info->tag;
1355  avctx->profile = ctx->profile;
1356 
1357  av_log(avctx, AV_LOG_DEBUG,
1358  "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1359  ctx->profile, ctx->slices_per_picture * ctx->pictures_per_frame,
1360  interlaced ? "yes" : "no", ctx->bits_per_mb);
1361  av_log(avctx, AV_LOG_DEBUG, "frame size upper bound: %d\n",
1362  ctx->frame_size_upper_bound);
1363 
1364  return 0;
1365 }
1366 
1367 #define OFFSET(x) offsetof(ProresContext, x)
1368 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1369 
1370 static const AVOption options[] = {
1371  { "mbs_per_slice", "macroblocks per slice", OFFSET(mbs_per_slice),
1372  AV_OPT_TYPE_INT, { .i64 = 8 }, 1, MAX_MBS_PER_SLICE, VE },
1373  { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT,
1374  { .i64 = PRORES_PROFILE_AUTO },
1376  { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_AUTO },
1377  0, 0, VE, "profile" },
1378  { "proxy", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_PROXY },
1379  0, 0, VE, "profile" },
1380  { "lt", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_LT },
1381  0, 0, VE, "profile" },
1382  { "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_STANDARD },
1383  0, 0, VE, "profile" },
1384  { "hq", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_HQ },
1385  0, 0, VE, "profile" },
1386  { "4444", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_4444 },
1387  0, 0, VE, "profile" },
1388  { "4444xq", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_4444XQ },
1389  0, 0, VE, "profile" },
1390  { "vendor", "vendor ID", OFFSET(vendor),
1391  AV_OPT_TYPE_STRING, { .str = "Lavc" }, 0, 0, VE },
1392  { "bits_per_mb", "desired bits per macroblock", OFFSET(bits_per_mb),
1393  AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 8192, VE },
1394  { "quant_mat", "quantiser matrix", OFFSET(quant_sel), AV_OPT_TYPE_INT,
1395  { .i64 = -1 }, -1, QUANT_MAT_DEFAULT, VE, "quant_mat" },
1396  { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 },
1397  0, 0, VE, "quant_mat" },
1398  { "proxy", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_PROXY },
1399  0, 0, VE, "quant_mat" },
1400  { "lt", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_LT },
1401  0, 0, VE, "quant_mat" },
1402  { "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_STANDARD },
1403  0, 0, VE, "quant_mat" },
1404  { "hq", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_HQ },
1405  0, 0, VE, "quant_mat" },
1406  { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = QUANT_MAT_DEFAULT },
1407  0, 0, VE, "quant_mat" },
1408  { "alpha_bits", "bits for alpha plane", OFFSET(alpha_bits), AV_OPT_TYPE_INT,
1409  { .i64 = 16 }, 0, 16, VE },
1410  { NULL }
1411 };
1412 
1413 static const AVClass proresenc_class = {
1414  .class_name = "ProRes encoder",
1415  .item_name = av_default_item_name,
1416  .option = options,
1417  .version = LIBAVUTIL_VERSION_INT,
1418 };
1419 
1421  .p.name = "prores_ks",
1422  CODEC_LONG_NAME("Apple ProRes (iCodec Pro)"),
1423  .p.type = AVMEDIA_TYPE_VIDEO,
1424  .p.id = AV_CODEC_ID_PRORES,
1425  .priv_data_size = sizeof(ProresContext),
1426  .init = encode_init,
1427  .close = encode_close,
1431  .p.pix_fmts = (const enum AVPixelFormat[]) {
1434  },
1435  .p.priv_class = &proresenc_class,
1437  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1438 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
ProresContext::force_quant
int force_quant
Definition: proresenc_kostya.c:280
PRORES_PROFILE_LT
@ PRORES_PROFILE_LT
Definition: proresenc_kostya.c:45
ProresContext::quant_chroma_mat
const uint8_t * quant_chroma_mat
Definition: proresenc_kostya.c:263
AVFrame::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:660
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
td
#define td
Definition: regdef.h:70
estimate_dcs
static int estimate_dcs(int *error, int16_t *blocks, int blocks_per_slice, int scale)
Definition: proresenc_kostya.c:672
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
QUANT_MAT_PROXY_CHROMA
@ QUANT_MAT_PROXY_CHROMA
Definition: proresenc_kostya.c:54
level
uint8_t level
Definition: svq3.c:204
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
encode_dcs
static void encode_dcs(PutBitContext *pb, int16_t *blocks, int blocks_per_slice, int scale)
Definition: proresenc_kostya.c:431
ProresContext::fdsp
FDCTDSPContext fdsp
Definition: proresenc_anatoliy.c:183
mem_internal.h
put_bytes_output
static int put_bytes_output(const PutBitContext *s)
Definition: put_bits.h:89
GET_SIGN
#define GET_SIGN(x)
Definition: proresenc_kostya.c:428
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
Definition: proresenc_kostya.c:1007
ff_prores_profiles
const AVProfile ff_prores_profiles[]
Definition: profiles.c:172
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2964
av_grow_packet
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
Definition: avpacket.c:121
put_sbits
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:281
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
AVFrame::color_primaries
enum AVColorPrimaries color_primaries
Definition: frame.h:658
ProresContext::quants_chroma
int16_t quants_chroma[MAX_STORED_Q][64]
Definition: proresenc_kostya.c:259
av_mod_uintp2
#define av_mod_uintp2
Definition: common.h:123
ProresContext::vendor
char * vendor
Definition: proresenc_anatoliy.c:197
prores_profile::tag
uint32_t tag
Definition: proresenc_kostya.c:171
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:667
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:340
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:222
pixdesc.h
w
uint8_t w
Definition: llviddspenc.c:38
encode_alpha_plane
static void encode_alpha_plane(ProresContext *ctx, PutBitContext *pb, int mbs_per_slice, uint16_t *blocks, int quant)
Definition: proresenc_kostya.c:537
AVPacket::data
uint8_t * data
Definition: packet.h:491
ff_prores_ks_encoder
const FFCodec ff_prores_ks_encoder
Definition: proresenc_kostya.c:1420
AVOption
AVOption.
Definition: opt.h:251
ProresContext::slices_width
int slices_width
Definition: proresenc_kostya.c:274
encode.h
FIRST_DC_CB
#define FIRST_DC_CB
Definition: proresdata.h:33
ProresContext::alpha_bits
int alpha_bits
Definition: proresenc_kostya.c:281
ProresContext
Definition: proresdec.h:43
FFCodec
Definition: codec_internal.h:127
ProresContext::num_planes
int num_planes
Definition: proresenc_kostya.c:278
ProresContext::emu_buf
uint16_t emu_buf[16 *16]
Definition: proresenc_kostya.c:257
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:649
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
ProresThreadData::emu_buf
uint16_t emu_buf[16 *16]
Definition: proresenc_kostya.c:248
QUANT_MAT_HQ
@ QUANT_MAT_HQ
Definition: proresenc_kostya.c:57
av_popcount
#define av_popcount
Definition: common.h:150
SCORE_LIMIT
#define SCORE_LIMIT
Definition: proresenc_kostya.c:235
put_alpha_run
static void put_alpha_run(PutBitContext *pb, int run)
Definition: proresenc_kostya.c:523
ff_prores_progressive_scan
const uint8_t ff_prores_progressive_scan[64]
Definition: proresdata.c:25
prores_quant_matrices
static const uint8_t prores_quant_matrices[][64]
Definition: proresenc_kostya.c:62
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:361
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:641
prores_fdct
static void prores_fdct(FDCTDSPContext *fdsp, const uint16_t *src, ptrdiff_t linesize, int16_t *block)
Definition: proresenc_kostya.c:1182
ProresContext::profile_info
const struct prores_profile * profile_info
Definition: proresenc_kostya.c:290
FDCTDSPContext
Definition: fdctdsp.h:28
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1532
ProresContext::slice_q
int * slice_q
Definition: proresenc_kostya.c:292
ProresContext::mbs_per_slice
int mbs_per_slice
Definition: proresenc_kostya.c:272
TrellisNode
Definition: adpcmenc.c:60
prores_mb_limits
static const int prores_mb_limits[NUM_MB_LIMITS]
Definition: proresenc_kostya.c:162
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:521
ProresContext::custom_chroma_q
int16_t custom_chroma_q[64]
Definition: proresenc_kostya.c:261
val
static double val(void *priv, double ch)
Definition: aeval.c:78
put_alpha_diff
static void put_alpha_diff(PutBitContext *pb, int cur, int prev, int abits)
Definition: proresenc_kostya.c:504
QUANT_MAT_PROXY
@ QUANT_MAT_PROXY
Definition: proresenc_kostya.c:53
CFACTOR_Y422
#define CFACTOR_Y422
Definition: proresenc_kostya.c:35
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
estimate_alpha_plane
static int estimate_alpha_plane(ProresContext *ctx, const uint16_t *src, ptrdiff_t linesize, int mbs_per_slice, int16_t *blocks)
Definition: proresenc_kostya.c:772
PRORES_PROFILE_4444XQ
@ PRORES_PROFILE_4444XQ
Definition: proresenc_kostya.c:49
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:315
ProresThreadData::nodes
struct TrellisNode * nodes
Definition: proresenc_kostya.c:251
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:326
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:471
prores_profile::max_quant
int max_quant
Definition: proresenc_kostya.c:173
quant
static const uint8_t quant[64]
Definition: vmixdec.c:71
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
prores_dc_codebook
static const uint8_t prores_dc_codebook[4]
Definition: proresenc_kostya.c:135
ff_fdctdsp_init
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
Definition: fdctdsp.c:25
prores_profile_info
static const struct prores_profile prores_profile_info[6]
mask
static const uint16_t mask[17]
Definition: lzw.c:38
ProresThreadData::custom_chroma_q
int16_t custom_chroma_q[64]
Definition: proresenc_kostya.c:250
AVCodecContext::global_quality
int global_quality
Global quality for codecs which cannot change it per frame.
Definition: avcodec.h:507
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1233
frame_size
int frame_size
Definition: mxfenc.c:2311
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
ProresThreadData::custom_q
int16_t custom_q[64]
Definition: proresenc_kostya.c:249
PRORES_PROFILE_AUTO
@ PRORES_PROFILE_AUTO
Definition: proresenc_kostya.c:43
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:159
bits
uint8_t bits
Definition: vp3data.h:128
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1517
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
ctx
AVFormatContext * ctx
Definition: movenc.c:48
ProresContext::bits_per_mb
int bits_per_mb
Definition: proresenc_kostya.c:279
ProresContext::quants
int16_t quants[MAX_STORED_Q][64]
Definition: proresenc_kostya.c:258
ProresContext::profile
int profile
Definition: proresenc_kostya.c:289
AV_INPUT_BUFFER_MIN_SIZE
#define AV_INPUT_BUFFER_MIN_SIZE
Definition: avcodec.h:195
TrellisNode::prev_node
int prev_node
Definition: proresenc_kostya.c:238
prores_profile::min_quant
int min_quant
Definition: proresenc_kostya.c:172
prores_profile::full_name
const char * full_name
Definition: proresenc_kostya.c:170
TrellisNode::quant
int quant
Definition: proresenc_kostya.c:239
ff_prores_interlaced_scan
const uint8_t ff_prores_interlaced_scan[64]
Definition: proresdata.c:36
find_quant_thread
static int find_quant_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
Definition: proresenc_kostya.c:983
PutBitContext
Definition: put_bits.h:50
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
ProresContext::mb_width
int mb_width
Definition: proresenc_kostya.c:271
arg
const char * arg
Definition: jacosubdec.c:67
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
ProresContext::pictures_per_frame
int pictures_per_frame
Definition: proresenc_kostya.c:276
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:110
MAX_MBS_PER_SLICE
#define MAX_MBS_PER_SLICE
Definition: proresenc_kostya.c:38
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
QUANT_MAT_STANDARD
@ QUANT_MAT_STANDARD
Definition: proresenc_kostya.c:56
NULL
#define NULL
Definition: coverity.c:32
sizes
static const int sizes[][2]
Definition: img2dec.c:58
ProresContext::pic
const AVFrame * pic
Definition: proresenc_kostya.c:270
MAX_STORED_Q
#define MAX_STORED_Q
Definition: proresenc_kostya.c:244
PRORES_PROFILE_STANDARD
@ PRORES_PROFILE_STANDARD
Definition: proresenc_kostya.c:46
run
uint8_t run
Definition: svq3.c:203
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: proresenc_kostya.c:1196
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
profiles.h
find_slice_quant
static int find_slice_quant(AVCodecContext *avctx, int trellis_node, int x, int y, int mbs_per_slice, ProresThreadData *td)
Definition: proresenc_kostya.c:814
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:469
ProresContext::tdata
ProresThreadData * tdata
Definition: proresenc_kostya.c:294
ProresContext::quant_sel
int quant_sel
Definition: proresenc_kostya.c:285
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
ProresContext::blocks
int16_t blocks[MAX_PLANES][64 *4 *MAX_MBS_PER_SLICE]
Definition: proresenc_kostya.c:256
prores_profile::br_tab
int br_tab[NUM_MB_LIMITS]
Definition: proresenc_kostya.c:174
CFACTOR_Y444
#define CFACTOR_Y444
Definition: proresenc_kostya.c:36
ProresContext::chroma_factor
int chroma_factor
Definition: proresenc_kostya.c:273
AVPacket::size
int size
Definition: packet.h:492
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:106
ProresContext::scantable
const uint8_t * scantable
Definition: proresenc_anatoliy.c:191
ProresContext::custom_q
int16_t custom_q[64]
Definition: proresenc_kostya.c:260
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:87
prores_lev_to_cb_index
static const uint8_t prores_lev_to_cb_index[10]
Definition: proresenc_kostya.c:159
estimate_slice_plane
static int estimate_slice_plane(ProresContext *ctx, int *error, int plane, const uint16_t *src, ptrdiff_t linesize, int mbs_per_slice, int blocks_per_mb, int plane_size_factor, const int16_t *qmat, ProresThreadData *td)
Definition: proresenc_kostya.c:739
TrellisNode::bits
int bits
Definition: proresenc_kostya.c:240
proresdata.h
MAKE_CODE
#define MAKE_CODE(x)
Definition: proresenc_kostya.c:429
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:164
PRORES_PROFILE_4444
@ PRORES_PROFILE_4444
Definition: proresenc_kostya.c:48
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:114
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:508
mb
#define mb
Definition: vf_colormatrix.c:99
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
OFFSET
#define OFFSET(x)
Definition: proresenc_kostya.c:1367
AVCodecContext::bits_per_coded_sample
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:1510
options
static const AVOption options[]
Definition: proresenc_kostya.c:1370
interlaced
uint8_t interlaced
Definition: mxfenc.c:2152
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
get_alpha_data
static void get_alpha_data(ProresContext *ctx, const uint16_t *src, ptrdiff_t linesize, int x, int y, int w, int h, int16_t *blocks, int mbs_per_slice, int abits)
Definition: proresenc_kostya.c:368
prores_profile
Definition: proresenc_kostya.c:169
TRELLIS_WIDTH
#define TRELLIS_WIDTH
Definition: proresenc_kostya.c:234
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
MAX_PLANES
#define MAX_PLANES
Definition: proresenc_kostya.c:40
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
prores_ac_codebook
static const uint8_t prores_ac_codebook[7]
Definition: proresenc_kostya.c:142
get_slice_data
static void get_slice_data(ProresContext *ctx, const uint16_t *src, ptrdiff_t linesize, int x, int y, int w, int h, int16_t *blocks, uint16_t *emu_buf, int mbs_per_slice, int blocks_per_mb, int is_chroma)
Definition: proresenc_kostya.c:297
ProresContext::frame_size_upper_bound
int frame_size_upper_bound
Definition: proresenc_kostya.c:287
ProresThreadData::blocks
int16_t blocks[MAX_PLANES][64 *4 *MAX_MBS_PER_SLICE]
Definition: proresenc_kostya.c:247
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
delta
float delta
Definition: vorbis_enc_data.h:430
ProresContext::num_chroma_blocks
int num_chroma_blocks
Definition: proresenc_kostya.c:273
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
fdctdsp.h
est_alpha_diff
static int est_alpha_diff(int cur, int prev, int abits)
Definition: proresenc_kostya.c:757
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
estimate_acs
static int estimate_acs(int *error, int16_t *blocks, int blocks_per_slice, int plane_size_factor, const uint8_t *scan, const int16_t *qmat)
Definition: proresenc_kostya.c:703
profile
int profile
Definition: mxfenc.c:2115
AVCodecContext::height
int height
Definition: avcodec.h:621
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:658
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:262
avcodec.h
proresenc_class
static const AVClass proresenc_class
Definition: proresenc_kostya.c:1413
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:71
prores_profile::quant
int quant
Definition: proresenc_kostya.c:175
ProresContext::quant_mat
const uint8_t * quant_mat
Definition: proresenc_kostya.c:262
encode_slice_plane
static void encode_slice_plane(ProresContext *ctx, PutBitContext *pb, const uint16_t *src, ptrdiff_t linesize, int mbs_per_slice, int16_t *blocks, int blocks_per_mb, int plane_size_factor, const int16_t *qmat)
Definition: proresenc_kostya.c:491
prores_profile::quant_chroma
int quant_chroma
Definition: proresenc_kostya.c:176
AVCodecContext
main external API structure.
Definition: avcodec.h:441
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
ProresContext::slices_per_picture
int slices_per_picture
Definition: proresenc_kostya.c:275
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1596
TrellisNode::score
int score
Definition: proresenc_kostya.c:241
PRORES_PROFILE_HQ
@ PRORES_PROFILE_HQ
Definition: proresenc_kostya.c:47
encode_acs
static void encode_acs(PutBitContext *pb, int16_t *blocks, int blocks_per_slice, int plane_size_factor, const uint8_t *scan, const int16_t *qmat)
Definition: proresenc_kostya.c:457
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
PRORES_PROFILE_PROXY
@ PRORES_PROFILE_PROXY
Definition: proresenc_kostya.c:44
FRAME_ID
#define FRAME_ID
Definition: proresdata.h:28
NUM_MB_LIMITS
#define NUM_MB_LIMITS
Definition: proresenc_kostya.c:161
FDCTDSPContext::fdct
void(* fdct)(int16_t *block)
Definition: fdctdsp.h:29
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
estimate_vlc
static int estimate_vlc(unsigned codebook, int val)
Definition: proresenc_kostya.c:650
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:143
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
encode_slice
static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, PutBitContext *pb, int sizes[4], int x, int y, int quant, int mbs_per_slice)
Definition: proresenc_kostya.c:566
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:466
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:468
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:468
encode_vlc_codeword
static void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
Write an unsigned rice/exp golomb codeword.
Definition: proresenc_kostya.c:399
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
VE
#define VE
Definition: proresenc_kostya.c:1368
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:621
QUANT_MAT_XQ_LUMA
@ QUANT_MAT_XQ_LUMA
Definition: proresenc_kostya.c:58
bytestream.h
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:385
ProresThreadData
Definition: proresenc_kostya.c:246
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
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ProresContext::fdct
void(* fdct)(FDCTDSPContext *fdsp, const uint16_t *src, ptrdiff_t linesize, int16_t *block)
Definition: proresenc_kostya.c:266
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
ProresContext::cur_picture_idx
int cur_picture_idx
Definition: proresenc_kostya.c:277
h
h
Definition: vp9dsp_template.c:2038
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
put_bits.h
ProresContext::warn
int warn
Definition: proresenc_kostya.c:282
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
prores_run_to_cb_index
static const uint8_t prores_run_to_cb_index[16]
Lookup tables for adaptive switching between codebooks according with previous run/level value.
Definition: proresenc_kostya.c:156
AVCodecContext::execute2
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.
Definition: avcodec.h:1581
QUANT_MAT_DEFAULT
@ QUANT_MAT_DEFAULT
Definition: proresenc_kostya.c:59
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:61
encode_close
static av_cold int encode_close(AVCodecContext *avctx)
Definition: proresenc_kostya.c:1167
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:42
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:200
ProresContext::mb_height
unsigned mb_height
height of the current picture in mb
Definition: proresdec.h:53
QUANT_MAT_LT
@ QUANT_MAT_LT
Definition: proresenc_kostya.c:55