35 #define CFACTOR_Y422 2 36 #define CFACTOR_Y444 3 38 #define MAX_MBS_PER_SLICE 8 62 4, 7, 9, 11, 13, 14, 15, 63,
63 7, 7, 11, 12, 14, 15, 63, 63,
64 9, 11, 13, 14, 15, 63, 63, 63,
65 11, 11, 13, 14, 63, 63, 63, 63,
66 11, 13, 14, 63, 63, 63, 63, 63,
67 13, 14, 63, 63, 63, 63, 63, 63,
68 13, 63, 63, 63, 63, 63, 63, 63,
69 63, 63, 63, 63, 63, 63, 63, 63,
72 4, 5, 6, 7, 9, 11, 13, 15,
73 5, 5, 7, 8, 11, 13, 15, 17,
74 6, 7, 9, 11, 13, 15, 15, 17,
75 7, 7, 9, 11, 13, 15, 17, 19,
76 7, 9, 11, 13, 14, 16, 19, 23,
77 9, 11, 13, 14, 16, 19, 23, 29,
78 9, 11, 13, 15, 17, 21, 28, 35,
79 11, 13, 16, 17, 21, 28, 35, 41,
82 4, 4, 5, 5, 6, 7, 7, 9,
83 4, 4, 5, 6, 7, 7, 9, 9,
84 5, 5, 6, 7, 7, 9, 9, 10,
85 5, 5, 6, 7, 7, 9, 9, 10,
86 5, 6, 7, 7, 8, 9, 10, 12,
87 6, 7, 7, 8, 9, 10, 12, 15,
88 6, 7, 7, 9, 10, 11, 14, 17,
89 7, 7, 9, 10, 11, 14, 17, 21,
92 4, 4, 4, 4, 4, 4, 4, 4,
93 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 4,
95 4, 4, 4, 4, 4, 4, 4, 5,
96 4, 4, 4, 4, 4, 4, 5, 5,
97 4, 4, 4, 4, 4, 5, 5, 6,
98 4, 4, 4, 4, 5, 5, 6, 7,
99 4, 4, 4, 4, 5, 6, 7, 7,
102 4, 4, 4, 4, 4, 4, 4, 4,
103 4, 4, 4, 4, 4, 4, 4, 4,
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, 4,
108 4, 4, 4, 4, 4, 4, 4, 4,
109 4, 4, 4, 4, 4, 4, 4, 4,
113 #define NUM_MB_LIMITS 4 131 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
134 .br_tab = { 300, 242, 220, 194 },
139 .tag =
MKTAG(
'a',
'p',
'c',
's'),
142 .br_tab = { 720, 560, 490, 440 },
146 .full_name =
"standard",
147 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
150 .br_tab = { 1050, 808, 710, 632 },
154 .full_name =
"high quality",
155 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
158 .br_tab = { 1566, 1216, 1070, 950 },
163 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
166 .br_tab = { 2350, 1828, 1600, 1425 },
170 .full_name =
"4444XQ",
171 .tag =
MKTAG(
'a',
'p',
'4',
'x'),
174 .br_tab = { 3525, 2742, 2400, 2137 },
179 #define TRELLIS_WIDTH 16 180 #define SCORE_LIMIT INT_MAX / 2 189 #define MAX_STORED_Q 16 194 int16_t custom_q[64];
203 int16_t custom_q[64];
208 ptrdiff_t linesize, int16_t *
block);
214 int num_chroma_blocks, chroma_factor;
239 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
240 int16_t *blocks, uint16_t *emu_buf,
241 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
243 const uint16_t *esrc;
244 const int mb_width = 4 * blocks_per_mb;
248 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
250 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
254 if (x + mb_width <= w && y + 16 <= h) {
256 elinesize = linesize;
261 elinesize = 16 *
sizeof(*emu_buf);
263 bw =
FFMIN(w - x, mb_width);
264 bh =
FFMIN(h - y, 16);
266 for (j = 0; j < bh; j++) {
267 memcpy(emu_buf + j * 16,
268 (
const uint8_t*)src + j * linesize,
270 pix = emu_buf[j * 16 + bw - 1];
271 for (k = bw; k < mb_width; k++)
272 emu_buf[j * 16 + k] = pix;
275 memcpy(emu_buf + j * 16,
276 emu_buf + (bh - 1) * 16,
277 mb_width *
sizeof(*emu_buf));
280 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
282 if (blocks_per_mb > 2) {
283 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
286 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
288 if (blocks_per_mb > 2) {
289 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
293 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
295 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
297 if (blocks_per_mb > 2) {
298 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
300 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
310 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
311 int16_t *blocks,
int mbs_per_slice,
int abits)
313 const int slice_width = 16 * mbs_per_slice;
314 int i, j, copy_w, copy_h;
316 copy_w =
FFMIN(w - x, slice_width);
317 copy_h =
FFMIN(h - y, 16);
318 for (i = 0; i < copy_h; i++) {
319 memcpy(blocks, src, copy_w *
sizeof(*src));
321 for (j = 0; j < copy_w; j++)
324 for (j = 0; j < copy_w; j++)
325 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
326 for (j = copy_w; j < slice_width; j++)
327 blocks[j] = blocks[copy_w - 1];
328 blocks += slice_width;
329 src += linesize >> 1;
331 for (; i < 16; i++) {
332 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
333 blocks += slice_width;
342 unsigned int rice_order, exp_order, switch_bits, switch_val;
346 switch_bits = (codebook & 3) + 1;
347 rice_order = codebook >> 5;
348 exp_order = (codebook >> 2) & 7;
350 switch_val = switch_bits << rice_order;
352 if (val >= switch_val) {
353 val -= switch_val - (1 << exp_order);
356 put_bits(pb, exponent - exp_order + switch_bits, 0);
359 exponent = val >> rice_order;
369 #define GET_SIGN(x) ((x) >> 31) 370 #define MAKE_CODE(x) ((((x)) * 2) ^ GET_SIGN(x)) 373 int blocks_per_slice,
int scale)
376 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
378 prev_dc = (blocks[0] - 0x4000) / scale;
384 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
385 dc = (blocks[0] - 0x4000) / scale;
386 delta = dc - prev_dc;
388 delta = (delta ^ sign) - sign;
391 codebook = (code + (code & 1)) >> 1;
392 codebook =
FFMIN(codebook, 3);
399 int blocks_per_slice,
400 int plane_size_factor,
401 const uint8_t *scan,
const int16_t *qmat)
405 int max_coeffs, abs_level;
407 max_coeffs = blocks_per_slice << 6;
412 for (i = 1; i < 64; i++) {
413 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
414 level = blocks[idx] / qmat[scan[i]];
416 abs_level =
FFABS(level);
433 const uint16_t *
src, ptrdiff_t linesize,
434 int mbs_per_slice, int16_t *blocks,
435 int blocks_per_mb,
int plane_size_factor,
438 int blocks_per_slice, saved_pos;
441 blocks_per_slice = mbs_per_slice * blocks_per_mb;
443 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
444 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
453 const int dbits = (abits == 8) ? 4 : 7;
454 const int dsize = 1 << dbits - 1;
455 int diff = cur - prev;
457 diff = av_mod_uintp2(diff, abits);
458 if (diff >= (1 << abits) - dsize)
460 if (diff < -dsize || diff > dsize || !diff) {
485 int mbs_per_slice, uint16_t *blocks,
489 const int mask = (1 << abits) - 1;
490 const int num_coeffs = mbs_per_slice * 256;
492 int prev =
mask, cur;
509 }
while (idx < num_coeffs);
525 int slice_width_factor =
av_log2(mbs_per_slice);
526 int num_cblocks, pwidth, line_add;
528 int plane_factor, is_chroma;
542 for (i = 0; i < 64; i++)
547 is_chroma = (i == 1 || i == 2);
548 plane_factor = slice_width_factor + 2;
555 pwidth = avctx->
width;
560 pwidth = avctx->
width >> 1;
564 src = (
const uint16_t*)(pic->
data[i] + yp * linesize +
571 mbs_per_slice, num_cblocks, is_chroma);
573 mbs_per_slice, ctx->
blocks[0],
574 num_cblocks, plane_factor,
583 total_size += sizes[i];
586 "Underestimated required buffer size.\n");
595 unsigned int rice_order, exp_order, switch_bits, switch_val;
599 switch_bits = (codebook & 3) + 1;
600 rice_order = codebook >> 5;
601 exp_order = (codebook >> 2) & 7;
603 switch_val = switch_bits << rice_order;
605 if (val >= switch_val) {
606 val -= switch_val - (1 << exp_order);
609 return exponent * 2 - exp_order + switch_bits + 1;
611 return (val >> rice_order) + rice_order + 1;
619 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
622 prev_dc = (blocks[0] - 0x4000) / scale;
627 *error +=
FFABS(blocks[0] - 0x4000) % scale;
629 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
630 dc = (blocks[0] - 0x4000) / scale;
631 *error +=
FFABS(blocks[0] - 0x4000) % scale;
632 delta = dc - prev_dc;
634 delta = (delta ^ sign) - sign;
637 codebook = (code + (code & 1)) >> 1;
638 codebook =
FFMIN(codebook, 3);
647 int plane_size_factor,
648 const uint8_t *scan,
const int16_t *qmat)
652 int max_coeffs, abs_level;
655 max_coeffs = blocks_per_slice << 6;
660 for (i = 1; i < 64; i++) {
661 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
662 level = blocks[idx] / qmat[scan[i]];
663 *error +=
FFABS(blocks[idx]) % qmat[scan[i]];
665 abs_level =
FFABS(level);
683 const uint16_t *
src, ptrdiff_t linesize,
685 int blocks_per_mb,
int plane_size_factor,
688 int blocks_per_slice;
691 blocks_per_slice = mbs_per_slice * blocks_per_mb;
695 plane_size_factor, ctx->
scantable, qmat);
702 const int dbits = (abits == 8) ? 4 : 7;
703 const int dsize = 1 << dbits - 1;
704 int diff = cur - prev;
706 diff = av_mod_uintp2(diff, abits);
707 if (diff >= (1 << abits) - dsize)
709 if (diff < -dsize || diff > dsize || !diff)
716 const uint16_t *
src, ptrdiff_t linesize,
717 int mbs_per_slice, int16_t *blocks)
720 const int mask = (1 << abits) - 1;
721 const int num_coeffs = mbs_per_slice * 256;
722 int prev =
mask, cur;
745 }
while (idx < num_coeffs);
758 int trellis_node,
int x,
int y,
int mbs_per_slice,
762 int i, q, pq, xp, yp;
764 int slice_width_factor =
av_log2(mbs_per_slice);
769 int error, bits, bits_limit;
770 int mbs, prev, cur, new_score;
774 int linesize[4], line_add;
781 mbs = x + mbs_per_slice;
784 is_chroma[i] = (i == 1 || i == 2);
785 plane_factor[i] = slice_width_factor + 2;
792 pwidth = avctx->
width;
797 pwidth = avctx->
width >> 1;
801 src = (
const uint16_t *)(ctx->
pic->
data[i] + yp * linesize[i] +
808 mbs_per_slice, num_cblocks[i], is_chroma[i]);
816 for (q = min_quant; q < max_quant + 2; q++) {
823 mbs_per_slice, td->
blocks[3]);
825 for (q = min_quant; q <=
max_quant; q++) {
832 num_cblocks[i], plane_factor[i],
835 if (bits > 65000 * 8)
838 slice_bits[q] = bits;
839 slice_score[q] =
error;
841 if (slice_bits[max_quant] <= ctx->
bits_per_mb * mbs_per_slice) {
842 slice_bits[max_quant + 1] = slice_bits[
max_quant];
843 slice_score[max_quant + 1] = slice_score[
max_quant] + 1;
846 for (q = max_quant + 1; q < 128; q++) {
853 for (i = 0; i < 64; i++)
860 num_cblocks[i], plane_factor[i],
863 if (bits <= ctx->bits_per_mb * mbs_per_slice)
867 slice_bits[max_quant + 1] = bits;
868 slice_score[max_quant + 1] =
error;
871 td->
nodes[trellis_node + max_quant + 1].
quant = overquant;
874 for (pq = min_quant; pq < max_quant + 2; pq++) {
877 for (q = min_quant; q < max_quant + 2; q++) {
878 cur = trellis_node + q;
880 bits = td->
nodes[prev].
bits + slice_bits[q];
881 error = slice_score[q];
882 if (bits > bits_limit)
901 for (q = min_quant + 1; q < max_quant + 2; q++) {
902 if (td->
nodes[trellis_node + q].
score <= error) {
904 pq = trellis_node + q;
912 int jobnr,
int threadnr)
917 int x, y = jobnr,
mb, q = 0;
919 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
920 while (ctx->
mb_width - x < mbs_per_slice)
936 const AVFrame *pic,
int *got_packet)
942 int x, y, i,
mb, q = 0;
943 int sizes[4] = { 0 };
944 int slice_hdr_size = 2 + 2 * (ctx->
num_planes - 1);
956 orig_buf = pkt->
data;
960 bytestream_put_be32 (&orig_buf,
FRAME_ID);
966 bytestream_put_be16 (&buf, 0);
968 bytestream_put_be16 (&buf, avctx->
width);
969 bytestream_put_be16 (&buf, avctx->
height);
974 bytestream_put_byte (&buf, frame_flags);
976 bytestream_put_byte (&buf, 0);
978 bytestream_put_byte (&buf, pic->
color_trc);
980 bytestream_put_byte (&buf, 0x40 | (ctx->
alpha_bits >> 3));
981 bytestream_put_byte (&buf, 0);
983 bytestream_put_byte (&buf, 0x03);
985 for (i = 0; i < 64; i++)
986 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
988 for (i = 0; i < 64; i++)
989 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
991 bytestream_put_byte (&buf, 0x00);
993 bytestream_put_be16 (&tmp, buf - orig_buf);
999 picture_size_pos = buf + 1;
1000 bytestream_put_byte (&buf, 0x40);
1019 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
1023 while (ctx->
mb_width - x < mbs_per_slice)
1024 mbs_per_slice >>= 1;
1026 bytestream_put_byte(&buf, slice_hdr_size << 3);
1028 buf += slice_hdr_size - 1;
1029 if (pkt_size <= buf - orig_buf + 2 * max_slice_size) {
1035 max_slice_size - pkt_size;
1037 delta =
FFMAX(delta, 2 * max_slice_size);
1042 "Packet too small: is %i," 1043 " needs %i (slice: %i). " 1044 "Correct allocation",
1045 pkt_size, delta, max_slice_size);
1055 orig_buf = pkt->
data + (orig_buf -
start);
1057 picture_size_pos = pkt->
data + (picture_size_pos -
start);
1058 slice_sizes = pkt->
data + (slice_sizes -
start);
1059 slice_hdr = pkt->
data + (slice_hdr -
start);
1068 bytestream_put_byte(&slice_hdr, q);
1069 slice_size = slice_hdr_size + sizes[ctx->
num_planes - 1];
1071 bytestream_put_be16(&slice_hdr, sizes[i]);
1072 slice_size += sizes[i];
1074 bytestream_put_be16(&slice_sizes, slice_size);
1075 buf += slice_size - slice_hdr_size;
1076 if (max_slice_size < slice_size)
1077 max_slice_size = slice_size;
1081 picture_size = buf - (picture_size_pos - 1);
1082 bytestream_put_be32(&picture_size_pos, picture_size);
1086 frame_size = buf - orig_buf;
1087 bytestream_put_be32(&orig_buf, frame_size);
1112 ptrdiff_t linesize, int16_t *
block)
1115 const uint16_t *tsrc =
src;
1117 for (y = 0; y < 8; y++) {
1118 for (x = 0; x < 8; x++)
1119 block[y * 8 + x] = tsrc[x];
1120 tsrc += linesize >> 1;
1134 #if FF_API_CODED_FRAME 1147 if (mps & (mps - 1)) {
1149 "there should be an integer power of two MBs per slice\n");
1159 ?
"4:4:4:4 profile because of the used input colorspace" 1160 :
"HQ profile to keep best quality");
1167 "encode alpha. Override with -profile if needed.\n");
1202 if (strlen(ctx->
vendor) != 4) {
1225 for (j = 0; j < 64; j++)
1249 for (i = min_quant; i < max_quant + 2; i++) {
1263 for (j = 0; j < 64; j++) {
1290 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1299 #define OFFSET(x) offsetof(ProresContext, x) 1300 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 1303 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1309 0, 0,
VE,
"profile" },
1311 0, 0,
VE,
"profile" },
1313 0, 0,
VE,
"profile" },
1315 0, 0,
VE,
"profile" },
1317 0, 0,
VE,
"profile" },
1319 0, 0,
VE,
"profile" },
1321 0, 0,
VE,
"profile" },
1322 {
"vendor",
"vendor ID",
OFFSET(vendor),
1324 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1329 0, 0,
VE,
"quant_mat" },
1331 0, 0,
VE,
"quant_mat" },
1333 0, 0,
VE,
"quant_mat" },
1335 0, 0,
VE,
"quant_mat" },
1337 0, 0,
VE,
"quant_mat" },
1339 0, 0,
VE,
"quant_mat" },
1341 { .i64 = 16 }, 0, 16, VE },
1353 .
name =
"prores_ks",
static const AVClass proresenc_class
#define MAX_MBS_PER_SLICE
const char const char void * val
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
static void put_sbits(PutBitContext *pb, int n, int32_t value)
static av_cold int encode_init(AVCodecContext *avctx)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
const uint8_t ff_prores_ac_codebook[7]
static av_cold int init(AVCodecContext *avctx)
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)
const char * av_default_item_name(void *ptr)
Return the context name.
static void prores_fdct(FDCTDSPContext *fdsp, const uint16_t *src, ptrdiff_t linesize, int16_t *block)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
unsigned mb_height
height of the current picture in mb
const uint8_t * scantable
static const AVOption options[]
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
static av_cold int encode_close(AVCodecContext *avctx)
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
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)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
int16_t quants[MAX_STORED_Q][64]
#define AV_CODEC_CAP_INTRA_ONLY
Codec is intra only.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
static int estimate_vlc(unsigned codebook, int val)
static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, PutBitContext *pb, int sizes[4], int x, int y, int quant, int mbs_per_slice)
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
const uint8_t ff_prores_run_to_cb_index[16]
Lookup tables for adaptive switching between codebooks according with previous run/level value...
const uint8_t ff_prores_lev_to_cb_index[10]
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
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)
static int estimate_alpha_plane(ProresContext *ctx, const uint16_t *src, ptrdiff_t linesize, int mbs_per_slice, int16_t *blocks)
#define AV_INPUT_BUFFER_MIN_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
static int est_alpha_diff(int cur, int prev, int abits)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
int16_t blocks[MAX_PLANES][64 *4 *MAX_MBS_PER_SLICE]
unsigned mb_width
width of the current picture in mb
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
static int put_bits_left(PutBitContext *s)
static const uint16_t mask[17]
static const int sizes[][2]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const struct prores_profile * profile_info
int flags
AV_CODEC_FLAG_*.
enum AVColorSpace colorspace
YUV colorspace type.
static const struct prores_profile prores_profile_info[6]
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
#define AV_PIX_FMT_YUV444P10
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)
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
static const int prores_mb_limits[NUM_MB_LIMITS]
int flags
A combination of AV_PKT_FLAG values.
struct TrellisNode * nodes
static int put_bits_count(PutBitContext *s)
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
static void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
Write an unsigned rice/exp golomb codeword.
enum AVPictureType pict_type
Picture type of the frame.
int width
picture width / height.
static int 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)
const uint8_t ff_prores_dc_codebook[4]
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static void put_alpha_diff(PutBitContext *pb, int cur, int prev, int abits)
void(* fdct)(int16_t *block)
#define AV_PIX_FMT_YUVA444P10
static void encode_dcs(PutBitContext *pb, int16_t *blocks, int blocks_per_slice, int scale)
static void error(const char *err)
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
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.
#define AV_LOG_INFO
Standard information.
const uint8_t ff_prores_interlaced_scan[64]
Libavcodec external API header.
typedef void(RENAME(mix_any_func_type))
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
main external API structure.
const uint8_t ff_prores_progressive_scan[64]
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Describe the class of an AVClass context structure.
static enum AVPixelFormat pix_fmts[]
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> dc
int global_quality
Global quality for codecs which cannot change it per frame.
#define AV_PIX_FMT_YUV422P10
static int find_slice_quant(AVCodecContext *avctx, int trellis_node, int x, int y, int mbs_per_slice, ProresThreadData *td)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int br_tab[NUM_MB_LIMITS]
static void put_alpha_run(PutBitContext *pb, int run)
#define FF_DISABLE_DEPRECATION_WARNINGS
static int encode_alpha_plane(ProresContext *ctx, PutBitContext *pb, int mbs_per_slice, uint16_t *blocks, int quant)
static const uint8_t prores_quant_matrices[][64]
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static int find_quant_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
#define FF_ENABLE_DEPRECATION_WARNINGS
int top_field_first
If the content is interlaced, is top field displayed first.
int key_frame
1 -> keyframe, 0-> not
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
enum AVColorPrimaries color_primaries
enum AVColorTransferCharacteristic color_trc
AVCodec ff_prores_ks_encoder
const uint8_t * quant_mat
#define MKTAG(a, b, c, d)
int frame_size_upper_bound
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)
AVPixelFormat
Pixel format.
This structure stores compressed data.
static int estimate_dcs(int *error, int16_t *blocks, int blocks_per_slice, int scale)
void(* fdct)(FDCTDSPContext *fdsp, const uint16_t *src, ptrdiff_t linesize, int16_t *block)