36 #define CFACTOR_Y422 2
37 #define CFACTOR_Y444 3
39 #define MAX_MBS_PER_SLICE 8
61 4, 7, 9, 11, 13, 14, 15, 63,
62 7, 7, 11, 12, 14, 15, 63, 63,
63 9, 11, 13, 14, 15, 63, 63, 63,
64 11, 11, 13, 14, 63, 63, 63, 63,
65 11, 13, 14, 63, 63, 63, 63, 63,
66 13, 14, 63, 63, 63, 63, 63, 63,
67 13, 63, 63, 63, 63, 63, 63, 63,
68 63, 63, 63, 63, 63, 63, 63, 63,
71 4, 5, 6, 7, 9, 11, 13, 15,
72 5, 5, 7, 8, 11, 13, 15, 17,
73 6, 7, 9, 11, 13, 15, 15, 17,
74 7, 7, 9, 11, 13, 15, 17, 19,
75 7, 9, 11, 13, 14, 16, 19, 23,
76 9, 11, 13, 14, 16, 19, 23, 29,
77 9, 11, 13, 15, 17, 21, 28, 35,
78 11, 13, 16, 17, 21, 28, 35, 41,
81 4, 4, 5, 5, 6, 7, 7, 9,
82 4, 4, 5, 6, 7, 7, 9, 9,
83 5, 5, 6, 7, 7, 9, 9, 10,
84 5, 5, 6, 7, 7, 9, 9, 10,
85 5, 6, 7, 7, 8, 9, 10, 12,
86 6, 7, 7, 8, 9, 10, 12, 15,
87 6, 7, 7, 9, 10, 11, 14, 17,
88 7, 7, 9, 10, 11, 14, 17, 21,
91 4, 4, 4, 4, 4, 4, 4, 4,
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, 5,
95 4, 4, 4, 4, 4, 4, 5, 5,
96 4, 4, 4, 4, 4, 5, 5, 6,
97 4, 4, 4, 4, 5, 5, 6, 7,
98 4, 4, 4, 4, 5, 6, 7, 7,
101 4, 4, 4, 4, 4, 4, 4, 4,
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,
112 #define NUM_MB_LIMITS 4
130 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
133 .br_tab = { 300, 242, 220, 194 },
138 .tag =
MKTAG(
'a',
'p',
'c',
's'),
141 .br_tab = { 720, 560, 490, 440 },
145 .full_name =
"standard",
146 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
149 .br_tab = { 1050, 808, 710, 632 },
153 .full_name =
"high quality",
154 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
157 .br_tab = { 1566, 1216, 1070, 950 },
162 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
165 .br_tab = { 2350, 1828, 1600, 1425 },
170 #define TRELLIS_WIDTH 16
171 #define SCORE_LIMIT INT_MAX / 2
180 #define MAX_STORED_Q 16
226 int linesize,
int x,
int y,
int w,
int h,
227 int16_t *blocks, uint16_t *emu_buf,
228 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
230 const uint16_t *esrc;
231 const int mb_width = 4 * blocks_per_mb;
235 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
237 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
241 if (x + mb_width <= w && y + 16 <= h) {
243 elinesize = linesize;
248 elinesize = 16 *
sizeof(*emu_buf);
250 bw =
FFMIN(w - x, mb_width);
251 bh =
FFMIN(h - y, 16);
253 for (j = 0; j < bh; j++) {
254 memcpy(emu_buf + j * 16,
255 (
const uint8_t*)src + j * linesize,
257 pix = emu_buf[j * 16 + bw - 1];
258 for (k = bw; k < mb_width; k++)
259 emu_buf[j * 16 + k] = pix;
262 memcpy(emu_buf + j * 16,
263 emu_buf + (bh - 1) * 16,
264 mb_width *
sizeof(*emu_buf));
267 ctx->
dsp.
fdct(esrc, elinesize, blocks);
269 if (blocks_per_mb > 2) {
270 ctx->
dsp.
fdct(esrc + 8, elinesize, blocks);
273 ctx->
dsp.
fdct(esrc + elinesize * 4, elinesize, blocks);
275 if (blocks_per_mb > 2) {
276 ctx->
dsp.
fdct(esrc + elinesize * 4 + 8, elinesize, blocks);
280 ctx->
dsp.
fdct(esrc, elinesize, blocks);
282 ctx->
dsp.
fdct(esrc + elinesize * 4, elinesize, blocks);
284 if (blocks_per_mb > 2) {
285 ctx->
dsp.
fdct(esrc + 8, elinesize, blocks);
287 ctx->
dsp.
fdct(esrc + elinesize * 4 + 8, elinesize, blocks);
297 int linesize,
int x,
int y,
int w,
int h,
298 int16_t *blocks,
int mbs_per_slice,
int abits)
300 const int slice_width = 16 * mbs_per_slice;
301 int i, j, copy_w, copy_h;
303 copy_w =
FFMIN(w - x, slice_width);
304 copy_h =
FFMIN(h - y, 16);
305 for (i = 0; i < copy_h; i++) {
306 memcpy(blocks, src, copy_w *
sizeof(*src));
308 for (j = 0; j < copy_w; j++)
311 for (j = 0; j < copy_w; j++)
312 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
313 for (j = copy_w; j < slice_width; j++)
314 blocks[j] = blocks[copy_w - 1];
315 blocks += slice_width;
316 src += linesize >> 1;
318 for (; i < 16; i++) {
319 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
320 blocks += slice_width;
329 unsigned int rice_order, exp_order, switch_bits, switch_val;
333 switch_bits = (codebook & 3) + 1;
334 rice_order = codebook >> 5;
335 exp_order = (codebook >> 2) & 7;
337 switch_val = switch_bits << rice_order;
339 if (val >= switch_val) {
340 val -= switch_val - (1 << exp_order);
343 put_bits(pb, exponent - exp_order + switch_bits, 0);
346 exponent = val >> rice_order;
356 #define GET_SIGN(x) ((x) >> 31)
357 #define MAKE_CODE(x) (((x) << 1) ^ GET_SIGN(x))
360 int blocks_per_slice,
int scale)
363 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
365 prev_dc = (blocks[0] - 0x4000) / scale;
371 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
372 dc = (blocks[0] - 0x4000) / scale;
373 delta = dc - prev_dc;
375 delta = (delta ^ sign) - sign;
378 codebook = (code + (code & 1)) >> 1;
379 codebook =
FFMIN(codebook, 3);
386 int blocks_per_slice,
387 int plane_size_factor,
388 const uint8_t *scan,
const int16_t *qmat)
392 int max_coeffs, abs_level;
394 max_coeffs = blocks_per_slice << 6;
399 for (i = 1; i < 64; i++) {
400 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
401 level = blocks[idx] / qmat[scan[i]];
403 abs_level =
FFABS(level);
420 const uint16_t *
src,
int linesize,
421 int mbs_per_slice, int16_t *blocks,
422 int blocks_per_mb,
int plane_size_factor,
425 int blocks_per_slice, saved_pos;
428 blocks_per_slice = mbs_per_slice * blocks_per_mb;
430 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
431 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
440 const int mask = (1 << abits) - 1;
441 const int dbits = (abits == 8) ? 4 : 7;
442 const int dsize = 1 << dbits - 1;
443 int diff = cur - prev;
446 if (diff >= (1 << abits) - dsize)
448 if (diff < -dsize || diff > dsize || !diff) {
473 const uint16_t *
src,
int linesize,
474 int mbs_per_slice, uint16_t *blocks,
478 const int mask = (1 << abits) - 1;
479 const int num_coeffs = mbs_per_slice * 256;
481 int prev =
mask, cur;
498 }
while (idx < num_coeffs);
514 int slice_width_factor =
av_log2(mbs_per_slice);
515 int num_cblocks, pwidth, linesize, line_add;
516 int plane_factor, is_chroma;
530 for (i = 0; i < 64; i++)
535 is_chroma = (i == 1 || i == 2);
536 plane_factor = slice_width_factor + 2;
543 pwidth = avctx->
width;
548 pwidth = avctx->
width >> 1;
552 src = (
const uint16_t*)(pic->
data[i] + yp * linesize +
559 mbs_per_slice, num_cblocks, is_chroma);
561 mbs_per_slice, ctx->
blocks[0],
562 num_cblocks, plane_factor,
569 mbs_per_slice, ctx->
blocks[0],
572 total_size += sizes[i];
579 unsigned int rice_order, exp_order, switch_bits, switch_val;
583 switch_bits = (codebook & 3) + 1;
584 rice_order = codebook >> 5;
585 exp_order = (codebook >> 2) & 7;
587 switch_val = switch_bits << rice_order;
589 if (val >= switch_val) {
590 val -= switch_val - (1 << exp_order);
593 return exponent * 2 - exp_order + switch_bits + 1;
595 return (val >> rice_order) + rice_order + 1;
599 static int estimate_dcs(
int *error, int16_t *blocks,
int blocks_per_slice,
603 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
606 prev_dc = (blocks[0] - 0x4000) / scale;
613 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
614 dc = (blocks[0] - 0x4000) / scale;
616 delta = dc - prev_dc;
618 delta = (delta ^ sign) - sign;
621 codebook = (code + (code & 1)) >> 1;
622 codebook =
FFMIN(codebook, 3);
630 static int estimate_acs(
int *error, int16_t *blocks,
int blocks_per_slice,
631 int plane_size_factor,
632 const uint8_t *scan,
const int16_t *qmat)
636 int max_coeffs, abs_level;
639 max_coeffs = blocks_per_slice << 6;
644 for (i = 1; i < 64; i++) {
645 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
646 level = blocks[idx] / qmat[scan[i]];
647 *error +=
FFABS(blocks[idx]) % qmat[scan[i]];
649 abs_level =
FFABS(level);
667 const uint16_t *
src,
int linesize,
669 int blocks_per_mb,
int plane_size_factor,
672 int blocks_per_slice;
675 blocks_per_slice = mbs_per_slice * blocks_per_mb;
686 const int mask = (1 << abits) - 1;
687 const int dbits = (abits == 8) ? 4 : 7;
688 const int dsize = 1 << dbits - 1;
689 int diff = cur - prev;
692 if (diff >= (1 << abits) - dsize)
694 if (diff < -dsize || diff > dsize || !diff)
701 const uint16_t *
src,
int linesize,
702 int mbs_per_slice,
int quant,
706 const int mask = (1 << abits) - 1;
707 const int num_coeffs = mbs_per_slice * 256;
708 int prev =
mask, cur;
732 }
while (idx < num_coeffs);
745 int trellis_node,
int x,
int y,
int mbs_per_slice,
749 int i, q, pq, xp, yp;
751 int slice_width_factor =
av_log2(mbs_per_slice);
756 int error,
bits, bits_limit;
757 int mbs, prev, cur, new_score;
761 int linesize[4], line_add;
767 mbs = x + mbs_per_slice;
770 is_chroma[i] = (i == 1 || i == 2);
771 plane_factor[i] = slice_width_factor + 2;
778 pwidth = avctx->
width;
783 pwidth = avctx->
width >> 1;
787 src = (
const uint16_t*)(pic->
data[i] + yp * linesize[i] +
794 mbs_per_slice, num_cblocks[i], is_chroma[i]);
802 for (q = min_quant; q < max_quant + 2; q++) {
808 for (q = min_quant; q <=
max_quant; q++) {
815 num_cblocks[i], plane_factor[i],
820 mbs_per_slice, q, td->
blocks[3]);
821 if (bits > 65000 * 8) {
825 slice_bits[q] =
bits;
826 slice_score[q] = error;
828 if (slice_bits[max_quant] <= ctx->
bits_per_mb * mbs_per_slice) {
829 slice_bits[max_quant + 1] = slice_bits[
max_quant];
830 slice_score[max_quant + 1] = slice_score[
max_quant] + 1;
833 for (q = max_quant + 1; q < 128; q++) {
840 for (i = 0; i < 64; i++)
847 num_cblocks[i], plane_factor[i],
852 mbs_per_slice, q, td->
blocks[3]);
853 if (bits <= ctx->bits_per_mb * mbs_per_slice)
857 slice_bits[max_quant + 1] =
bits;
858 slice_score[max_quant + 1] = error;
861 td->
nodes[trellis_node + max_quant + 1].
quant = overquant;
864 for (pq = min_quant; pq < max_quant + 2; pq++) {
867 for (q = min_quant; q < max_quant + 2; q++) {
868 cur = trellis_node + q;
870 bits = td->
nodes[prev].
bits + slice_bits[q];
871 error = slice_score[q];
872 if (bits > bits_limit)
891 for (q = min_quant + 1; q < max_quant + 2; q++) {
892 if (td->
nodes[trellis_node + q].
score <= error) {
894 pq = trellis_node + q;
902 int jobnr,
int threadnr)
907 int x,
y = jobnr,
mb, q = 0;
909 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
910 while (ctx->
mb_width - x < mbs_per_slice)
926 const AVFrame *pic,
int *got_packet)
929 uint8_t *orig_buf, *
buf, *slice_hdr, *slice_sizes, *tmp;
932 int x,
y, i,
mb, q = 0;
933 int sizes[4] = { 0 };
934 int slice_hdr_size = 2 + 2 * (ctx->
num_planes - 1);
948 orig_buf = pkt->
data;
952 bytestream_put_be32 (&orig_buf,
FRAME_ID);
958 bytestream_put_be16 (&buf, 0);
960 bytestream_put_be16 (&buf, avctx->
width);
961 bytestream_put_be16 (&buf, avctx->
height);
966 bytestream_put_byte (&buf, frame_flags);
968 bytestream_put_byte (&buf, 0);
970 bytestream_put_byte (&buf, avctx->
color_trc);
971 bytestream_put_byte (&buf, avctx->
colorspace);
972 bytestream_put_byte (&buf, 0x40 | (ctx->
alpha_bits >> 3));
973 bytestream_put_byte (&buf, 0);
975 bytestream_put_byte (&buf, 0x03);
977 for (i = 0; i < 64; i++)
978 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
980 for (i = 0; i < 64; i++)
981 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
983 bytestream_put_byte (&buf, 0x00);
985 bytestream_put_be16 (&tmp, buf - orig_buf);
991 picture_size_pos = buf + 1;
992 bytestream_put_byte (&buf, 0x40);
1011 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
1015 while (ctx->
mb_width - x < mbs_per_slice)
1016 mbs_per_slice >>= 1;
1018 bytestream_put_byte(&buf, slice_hdr_size << 3);
1020 buf += slice_hdr_size - 1;
1022 encode_slice(avctx, pic, &pb, sizes, x, y, q, mbs_per_slice);
1024 bytestream_put_byte(&slice_hdr, q);
1025 slice_size = slice_hdr_size + sizes[ctx->
num_planes - 1];
1027 bytestream_put_be16(&slice_hdr, sizes[i]);
1028 slice_size += sizes[i];
1030 bytestream_put_be16(&slice_sizes, slice_size);
1031 buf += slice_size - slice_hdr_size;
1035 picture_size = buf - (picture_size_pos - 1);
1036 bytestream_put_be32(&picture_size_pos, picture_size);
1040 frame_size = buf - orig_buf;
1041 bytestream_put_be32(&orig_buf, frame_size);
1086 if (mps & (mps - 1)) {
1088 "there should be an integer power of two MBs per slice\n");
1123 if (strlen(ctx->
vendor) != 4) {
1144 for (j = 0; j < 64; j++)
1168 for (i = min_quant; i < max_quant + 2; i++) {
1182 for (j = 0; j < 64; j++) {
1203 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1212 #define OFFSET(x) offsetof(ProresContext, x)
1213 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1216 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1222 0, 0,
VE,
"profile" },
1224 0, 0,
VE,
"profile" },
1226 0, 0,
VE,
"profile" },
1228 0, 0,
VE,
"profile" },
1230 0, 0,
VE,
"profile" },
1231 {
"vendor",
"vendor ID",
OFFSET(vendor),
1233 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1238 0, 0,
VE,
"quant_mat" },
1240 0, 0,
VE,
"quant_mat" },
1242 0, 0,
VE,
"quant_mat" },
1244 0, 0,
VE,
"quant_mat" },
1246 0, 0,
VE,
"quant_mat" },
1248 0, 0,
VE,
"quant_mat" },
1250 { .i64 = 16 }, 0, 16,
VE },
1262 .
name =
"prores_ks",