35 #define CFACTOR_Y422 2
36 #define CFACTOR_Y444 3
38 #define MAX_MBS_PER_SLICE 8
60 4, 7, 9, 11, 13, 14, 15, 63,
61 7, 7, 11, 12, 14, 15, 63, 63,
62 9, 11, 13, 14, 15, 63, 63, 63,
63 11, 11, 13, 14, 63, 63, 63, 63,
64 11, 13, 14, 63, 63, 63, 63, 63,
65 13, 14, 63, 63, 63, 63, 63, 63,
66 13, 63, 63, 63, 63, 63, 63, 63,
67 63, 63, 63, 63, 63, 63, 63, 63,
70 4, 5, 6, 7, 9, 11, 13, 15,
71 5, 5, 7, 8, 11, 13, 15, 17,
72 6, 7, 9, 11, 13, 15, 15, 17,
73 7, 7, 9, 11, 13, 15, 17, 19,
74 7, 9, 11, 13, 14, 16, 19, 23,
75 9, 11, 13, 14, 16, 19, 23, 29,
76 9, 11, 13, 15, 17, 21, 28, 35,
77 11, 13, 16, 17, 21, 28, 35, 41,
80 4, 4, 5, 5, 6, 7, 7, 9,
81 4, 4, 5, 6, 7, 7, 9, 9,
82 5, 5, 6, 7, 7, 9, 9, 10,
83 5, 5, 6, 7, 7, 9, 9, 10,
84 5, 6, 7, 7, 8, 9, 10, 12,
85 6, 7, 7, 8, 9, 10, 12, 15,
86 6, 7, 7, 9, 10, 11, 14, 17,
87 7, 7, 9, 10, 11, 14, 17, 21,
90 4, 4, 4, 4, 4, 4, 4, 4,
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, 5,
94 4, 4, 4, 4, 4, 4, 5, 5,
95 4, 4, 4, 4, 4, 5, 5, 6,
96 4, 4, 4, 4, 5, 5, 6, 7,
97 4, 4, 4, 4, 5, 6, 7, 7,
100 4, 4, 4, 4, 4, 4, 4, 4,
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,
111 #define NUM_MB_LIMITS 4
129 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
132 .br_tab = { 300, 242, 220, 194 },
137 .tag =
MKTAG(
'a',
'p',
'c',
's'),
140 .br_tab = { 720, 560, 490, 440 },
144 .full_name =
"standard",
145 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
148 .br_tab = { 1050, 808, 710, 632 },
152 .full_name =
"high quality",
153 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
156 .br_tab = { 1566, 1216, 1070, 950 },
161 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
164 .br_tab = { 2350, 1828, 1600, 1425 },
169 #define TRELLIS_WIDTH 16
170 #define SCORE_LIMIT INT_MAX / 2
179 #define MAX_STORED_Q 16
198 int linesize, int16_t *
block);
227 int linesize,
int x,
int y,
int w,
int h,
228 int16_t *blocks, uint16_t *emu_buf,
229 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
231 const uint16_t *esrc;
232 const int mb_width = 4 * blocks_per_mb;
236 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
238 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
242 if (x + mb_width <= w && y + 16 <= h) {
244 elinesize = linesize;
249 elinesize = 16 *
sizeof(*emu_buf);
251 bw =
FFMIN(w - x, mb_width);
252 bh =
FFMIN(h - y, 16);
254 for (j = 0; j < bh; j++) {
255 memcpy(emu_buf + j * 16,
256 (
const uint8_t*)src + j * linesize,
258 pix = emu_buf[j * 16 + bw - 1];
259 for (k = bw; k < mb_width; k++)
260 emu_buf[j * 16 + k] = pix;
263 memcpy(emu_buf + j * 16,
264 emu_buf + (bh - 1) * 16,
265 mb_width *
sizeof(*emu_buf));
268 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
270 if (blocks_per_mb > 2) {
271 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
274 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
276 if (blocks_per_mb > 2) {
277 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
281 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
283 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
285 if (blocks_per_mb > 2) {
286 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
288 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
298 int linesize,
int x,
int y,
int w,
int h,
299 int16_t *blocks,
int mbs_per_slice,
int abits)
301 const int slice_width = 16 * mbs_per_slice;
302 int i, j, copy_w, copy_h;
304 copy_w =
FFMIN(w - x, slice_width);
305 copy_h =
FFMIN(h - y, 16);
306 for (i = 0; i < copy_h; i++) {
307 memcpy(blocks, src, copy_w *
sizeof(*src));
309 for (j = 0; j < copy_w; j++)
312 for (j = 0; j < copy_w; j++)
313 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
314 for (j = copy_w; j < slice_width; j++)
315 blocks[j] = blocks[copy_w - 1];
316 blocks += slice_width;
317 src += linesize >> 1;
319 for (; i < 16; i++) {
320 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
321 blocks += slice_width;
330 unsigned int rice_order, exp_order, switch_bits, switch_val;
334 switch_bits = (codebook & 3) + 1;
335 rice_order = codebook >> 5;
336 exp_order = (codebook >> 2) & 7;
338 switch_val = switch_bits << rice_order;
340 if (val >= switch_val) {
341 val -= switch_val - (1 << exp_order);
344 put_bits(pb, exponent - exp_order + switch_bits, 0);
347 exponent = val >> rice_order;
357 #define GET_SIGN(x) ((x) >> 31)
358 #define MAKE_CODE(x) (((x) << 1) ^ GET_SIGN(x))
361 int blocks_per_slice,
int scale)
364 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
366 prev_dc = (blocks[0] - 0x4000) / scale;
372 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
373 dc = (blocks[0] - 0x4000) / scale;
374 delta = dc - prev_dc;
376 delta = (delta ^ sign) - sign;
379 codebook = (code + (code & 1)) >> 1;
380 codebook =
FFMIN(codebook, 3);
387 int blocks_per_slice,
388 int plane_size_factor,
389 const uint8_t *scan,
const int16_t *qmat)
393 int max_coeffs, abs_level;
395 max_coeffs = blocks_per_slice << 6;
400 for (i = 1; i < 64; i++) {
401 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
402 level = blocks[idx] / qmat[scan[i]];
404 abs_level =
FFABS(level);
421 const uint16_t *
src,
int linesize,
422 int mbs_per_slice, int16_t *blocks,
423 int blocks_per_mb,
int plane_size_factor,
426 int blocks_per_slice, saved_pos;
429 blocks_per_slice = mbs_per_slice * blocks_per_mb;
431 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
432 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
441 const int mask = (1 << abits) - 1;
442 const int dbits = (abits == 8) ? 4 : 7;
443 const int dsize = 1 << dbits - 1;
444 int diff = cur - prev;
447 if (diff >= (1 << abits) - dsize)
449 if (diff < -dsize || diff > dsize || !diff) {
474 const uint16_t *
src,
int linesize,
475 int mbs_per_slice, uint16_t *blocks,
479 const int mask = (1 << abits) - 1;
480 const int num_coeffs = mbs_per_slice * 256;
482 int prev =
mask, cur;
499 }
while (idx < num_coeffs);
515 int slice_width_factor =
av_log2(mbs_per_slice);
516 int num_cblocks, pwidth, linesize, line_add;
517 int plane_factor, is_chroma;
531 for (i = 0; i < 64; i++)
536 is_chroma = (i == 1 || i == 2);
537 plane_factor = slice_width_factor + 2;
544 pwidth = avctx->
width;
549 pwidth = avctx->
width >> 1;
553 src = (
const uint16_t*)(pic->
data[i] + yp * linesize +
560 mbs_per_slice, num_cblocks, is_chroma);
562 mbs_per_slice, ctx->
blocks[0],
563 num_cblocks, plane_factor,
570 mbs_per_slice, ctx->
blocks[0],
573 total_size += sizes[i];
580 unsigned int rice_order, exp_order, switch_bits, switch_val;
584 switch_bits = (codebook & 3) + 1;
585 rice_order = codebook >> 5;
586 exp_order = (codebook >> 2) & 7;
588 switch_val = switch_bits << rice_order;
590 if (val >= switch_val) {
591 val -= switch_val - (1 << exp_order);
594 return exponent * 2 - exp_order + switch_bits + 1;
596 return (val >> rice_order) + rice_order + 1;
600 static int estimate_dcs(
int *error, int16_t *blocks,
int blocks_per_slice,
604 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
607 prev_dc = (blocks[0] - 0x4000) / scale;
612 *error +=
FFABS(blocks[0] - 0x4000) % scale;
614 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
615 dc = (blocks[0] - 0x4000) / scale;
616 *error +=
FFABS(blocks[0] - 0x4000) % scale;
617 delta = dc - prev_dc;
619 delta = (delta ^ sign) - sign;
622 codebook = (code + (code & 1)) >> 1;
623 codebook =
FFMIN(codebook, 3);
631 static int estimate_acs(
int *error, int16_t *blocks,
int blocks_per_slice,
632 int plane_size_factor,
633 const uint8_t *scan,
const int16_t *qmat)
637 int max_coeffs, abs_level;
640 max_coeffs = blocks_per_slice << 6;
645 for (i = 1; i < 64; i++) {
646 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
647 level = blocks[idx] / qmat[scan[i]];
648 *error +=
FFABS(blocks[idx]) % qmat[scan[i]];
650 abs_level =
FFABS(level);
668 const uint16_t *
src,
int linesize,
670 int blocks_per_mb,
int plane_size_factor,
673 int blocks_per_slice;
676 blocks_per_slice = mbs_per_slice * blocks_per_mb;
680 plane_size_factor, ctx->
scantable, qmat);
687 const int mask = (1 << abits) - 1;
688 const int dbits = (abits == 8) ? 4 : 7;
689 const int dsize = 1 << dbits - 1;
690 int diff = cur - prev;
693 if (diff >= (1 << abits) - dsize)
695 if (diff < -dsize || diff > dsize || !diff)
702 const uint16_t *
src,
int linesize,
703 int mbs_per_slice,
int quant,
707 const int mask = (1 << abits) - 1;
708 const int num_coeffs = mbs_per_slice * 256;
709 int prev =
mask, cur;
733 }
while (idx < num_coeffs);
746 int trellis_node,
int x,
int y,
int mbs_per_slice,
750 int i, q, pq, xp, yp;
752 int slice_width_factor =
av_log2(mbs_per_slice);
757 int error,
bits, bits_limit;
758 int mbs, prev, cur, new_score;
762 int linesize[4], line_add;
768 mbs = x + mbs_per_slice;
771 is_chroma[i] = (i == 1 || i == 2);
772 plane_factor[i] = slice_width_factor + 2;
779 pwidth = avctx->
width;
784 pwidth = avctx->
width >> 1;
788 src = (
const uint16_t*)(pic->
data[i] + yp * linesize[i] +
795 mbs_per_slice, num_cblocks[i], is_chroma[i]);
803 for (q = min_quant; q < max_quant + 2; q++) {
809 for (q = min_quant; q <=
max_quant; q++) {
816 num_cblocks[i], plane_factor[i],
821 mbs_per_slice, q, td->
blocks[3]);
822 if (bits > 65000 * 8) {
826 slice_bits[q] =
bits;
827 slice_score[q] = error;
829 if (slice_bits[max_quant] <= ctx->
bits_per_mb * mbs_per_slice) {
830 slice_bits[max_quant + 1] = slice_bits[
max_quant];
831 slice_score[max_quant + 1] = slice_score[
max_quant] + 1;
834 for (q = max_quant + 1; q < 128; q++) {
841 for (i = 0; i < 64; i++)
848 num_cblocks[i], plane_factor[i],
853 mbs_per_slice, q, td->
blocks[3]);
854 if (bits <= ctx->bits_per_mb * mbs_per_slice)
858 slice_bits[max_quant + 1] =
bits;
859 slice_score[max_quant + 1] = error;
862 td->
nodes[trellis_node + max_quant + 1].
quant = overquant;
865 for (pq = min_quant; pq < max_quant + 2; pq++) {
868 for (q = min_quant; q < max_quant + 2; q++) {
869 cur = trellis_node + q;
871 bits = td->
nodes[prev].
bits + slice_bits[q];
872 error = slice_score[q];
873 if (bits > bits_limit)
892 for (q = min_quant + 1; q < max_quant + 2; q++) {
893 if (td->
nodes[trellis_node + q].
score <= error) {
895 pq = trellis_node + q;
903 int jobnr,
int threadnr)
908 int x,
y = jobnr,
mb, q = 0;
910 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
911 while (ctx->
mb_width - x < mbs_per_slice)
927 const AVFrame *pic,
int *got_packet)
930 uint8_t *orig_buf, *
buf, *slice_hdr, *slice_sizes, *tmp;
933 int x,
y, i,
mb, q = 0;
934 int sizes[4] = { 0 };
935 int slice_hdr_size = 2 + 2 * (ctx->
num_planes - 1);
949 orig_buf = pkt->
data;
953 bytestream_put_be32 (&orig_buf,
FRAME_ID);
959 bytestream_put_be16 (&buf, 0);
961 bytestream_put_be16 (&buf, avctx->
width);
962 bytestream_put_be16 (&buf, avctx->
height);
967 bytestream_put_byte (&buf, frame_flags);
969 bytestream_put_byte (&buf, 0);
971 bytestream_put_byte (&buf, avctx->
color_trc);
972 bytestream_put_byte (&buf, avctx->
colorspace);
973 bytestream_put_byte (&buf, 0x40 | (ctx->
alpha_bits >> 3));
974 bytestream_put_byte (&buf, 0);
976 bytestream_put_byte (&buf, 0x03);
978 for (i = 0; i < 64; i++)
979 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
981 for (i = 0; i < 64; i++)
982 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
984 bytestream_put_byte (&buf, 0x00);
986 bytestream_put_be16 (&tmp, buf - orig_buf);
992 picture_size_pos = buf + 1;
993 bytestream_put_byte (&buf, 0x40);
1012 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
1016 while (ctx->
mb_width - x < mbs_per_slice)
1017 mbs_per_slice >>= 1;
1019 bytestream_put_byte(&buf, slice_hdr_size << 3);
1021 buf += slice_hdr_size - 1;
1023 encode_slice(avctx, pic, &pb, sizes, x, y, q, mbs_per_slice);
1025 bytestream_put_byte(&slice_hdr, q);
1026 slice_size = slice_hdr_size + sizes[ctx->
num_planes - 1];
1028 bytestream_put_be16(&slice_hdr, sizes[i]);
1029 slice_size += sizes[i];
1031 bytestream_put_be16(&slice_sizes, slice_size);
1032 buf += slice_size - slice_hdr_size;
1036 picture_size = buf - (picture_size_pos - 1);
1037 bytestream_put_be32(&picture_size_pos, picture_size);
1041 frame_size = buf - orig_buf;
1042 bytestream_put_be32(&orig_buf, frame_size);
1069 int linesize, int16_t *
block)
1072 const uint16_t *tsrc =
src;
1074 for (y = 0; y < 8; y++) {
1075 for (x = 0; x < 8; x++)
1076 block[y * 8 + x] = tsrc[x];
1077 tsrc += linesize >> 1;
1101 if (mps & (mps - 1)) {
1103 "there should be an integer power of two MBs per slice\n");
1138 if (strlen(ctx->
vendor) != 4) {
1159 for (j = 0; j < 64; j++)
1183 for (i = min_quant; i < max_quant + 2; i++) {
1197 for (j = 0; j < 64; j++) {
1218 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1227 #define OFFSET(x) offsetof(ProresContext, x)
1228 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1231 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1237 0, 0,
VE,
"profile" },
1239 0, 0,
VE,
"profile" },
1241 0, 0,
VE,
"profile" },
1243 0, 0,
VE,
"profile" },
1245 0, 0,
VE,
"profile" },
1246 {
"vendor",
"vendor ID",
OFFSET(vendor),
1248 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1253 0, 0,
VE,
"quant_mat" },
1255 0, 0,
VE,
"quant_mat" },
1257 0, 0,
VE,
"quant_mat" },
1259 0, 0,
VE,
"quant_mat" },
1261 0, 0,
VE,
"quant_mat" },
1263 0, 0,
VE,
"quant_mat" },
1265 { .i64 = 16 }, 0, 16,
VE },
1277 .
name =
"prores_ks",