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
199 int linesize, int16_t *
block);
228 int linesize,
int x,
int y,
int w,
int h,
229 int16_t *blocks, uint16_t *emu_buf,
230 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
232 const uint16_t *esrc;
233 const int mb_width = 4 * blocks_per_mb;
237 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
239 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
243 if (x + mb_width <= w && y + 16 <= h) {
245 elinesize = linesize;
250 elinesize = 16 *
sizeof(*emu_buf);
252 bw =
FFMIN(w - x, mb_width);
253 bh =
FFMIN(h - y, 16);
255 for (j = 0; j < bh; j++) {
256 memcpy(emu_buf + j * 16,
257 (
const uint8_t*)src + j * linesize,
259 pix = emu_buf[j * 16 + bw - 1];
260 for (k = bw; k < mb_width; k++)
261 emu_buf[j * 16 + k] = pix;
264 memcpy(emu_buf + j * 16,
265 emu_buf + (bh - 1) * 16,
266 mb_width *
sizeof(*emu_buf));
269 ctx->
fdct(&ctx->
dsp, esrc, elinesize, blocks);
271 if (blocks_per_mb > 2) {
272 ctx->
fdct(&ctx->
dsp, esrc + 8, elinesize, blocks);
275 ctx->
fdct(&ctx->
dsp, esrc + elinesize * 4, elinesize, blocks);
277 if (blocks_per_mb > 2) {
278 ctx->
fdct(&ctx->
dsp, esrc + elinesize * 4 + 8, elinesize, blocks);
282 ctx->
fdct(&ctx->
dsp, esrc, elinesize, blocks);
284 ctx->
fdct(&ctx->
dsp, esrc + elinesize * 4, elinesize, blocks);
286 if (blocks_per_mb > 2) {
287 ctx->
fdct(&ctx->
dsp, esrc + 8, elinesize, blocks);
289 ctx->
fdct(&ctx->
dsp, esrc + elinesize * 4 + 8, elinesize, blocks);
299 int linesize,
int x,
int y,
int w,
int h,
300 int16_t *blocks,
int mbs_per_slice,
int abits)
302 const int slice_width = 16 * mbs_per_slice;
303 int i, j, copy_w, copy_h;
305 copy_w =
FFMIN(w - x, slice_width);
306 copy_h =
FFMIN(h - y, 16);
307 for (i = 0; i < copy_h; i++) {
308 memcpy(blocks, src, copy_w *
sizeof(*src));
310 for (j = 0; j < copy_w; j++)
313 for (j = 0; j < copy_w; j++)
314 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
315 for (j = copy_w; j < slice_width; j++)
316 blocks[j] = blocks[copy_w - 1];
317 blocks += slice_width;
318 src += linesize >> 1;
320 for (; i < 16; i++) {
321 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
322 blocks += slice_width;
331 unsigned int rice_order, exp_order, switch_bits, switch_val;
335 switch_bits = (codebook & 3) + 1;
336 rice_order = codebook >> 5;
337 exp_order = (codebook >> 2) & 7;
339 switch_val = switch_bits << rice_order;
341 if (val >= switch_val) {
342 val -= switch_val - (1 << exp_order);
345 put_bits(pb, exponent - exp_order + switch_bits, 0);
348 exponent = val >> rice_order;
358 #define GET_SIGN(x) ((x) >> 31)
359 #define MAKE_CODE(x) (((x) << 1) ^ GET_SIGN(x))
362 int blocks_per_slice,
int scale)
365 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
367 prev_dc = (blocks[0] - 0x4000) / scale;
373 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
374 dc = (blocks[0] - 0x4000) / scale;
375 delta = dc - prev_dc;
377 delta = (delta ^ sign) - sign;
380 codebook = (code + (code & 1)) >> 1;
381 codebook =
FFMIN(codebook, 3);
388 int blocks_per_slice,
389 int plane_size_factor,
390 const uint8_t *scan,
const int16_t *qmat)
394 int max_coeffs, abs_level;
396 max_coeffs = blocks_per_slice << 6;
401 for (i = 1; i < 64; i++) {
402 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
403 level = blocks[idx] / qmat[scan[i]];
405 abs_level =
FFABS(level);
422 const uint16_t *
src,
int linesize,
423 int mbs_per_slice, int16_t *blocks,
424 int blocks_per_mb,
int plane_size_factor,
427 int blocks_per_slice, saved_pos;
430 blocks_per_slice = mbs_per_slice * blocks_per_mb;
432 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
433 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
442 const int mask = (1 << abits) - 1;
443 const int dbits = (abits == 8) ? 4 : 7;
444 const int dsize = 1 << dbits - 1;
445 int diff = cur - prev;
448 if (diff >= (1 << abits) - dsize)
450 if (diff < -dsize || diff > dsize || !diff) {
475 const uint16_t *
src,
int linesize,
476 int mbs_per_slice, uint16_t *blocks,
480 const int mask = (1 << abits) - 1;
481 const int num_coeffs = mbs_per_slice * 256;
483 int prev =
mask, cur;
500 }
while (idx < num_coeffs);
516 int slice_width_factor =
av_log2(mbs_per_slice);
517 int num_cblocks, pwidth, linesize, line_add;
518 int plane_factor, is_chroma;
532 for (i = 0; i < 64; i++)
537 is_chroma = (i == 1 || i == 2);
538 plane_factor = slice_width_factor + 2;
545 pwidth = avctx->
width;
550 pwidth = avctx->
width >> 1;
554 src = (
const uint16_t*)(pic->
data[i] + yp * linesize +
561 mbs_per_slice, num_cblocks, is_chroma);
563 mbs_per_slice, ctx->
blocks[0],
564 num_cblocks, plane_factor,
571 mbs_per_slice, ctx->
blocks[0],
574 total_size += sizes[i];
581 unsigned int rice_order, exp_order, switch_bits, switch_val;
585 switch_bits = (codebook & 3) + 1;
586 rice_order = codebook >> 5;
587 exp_order = (codebook >> 2) & 7;
589 switch_val = switch_bits << rice_order;
591 if (val >= switch_val) {
592 val -= switch_val - (1 << exp_order);
595 return exponent * 2 - exp_order + switch_bits + 1;
597 return (val >> rice_order) + rice_order + 1;
601 static int estimate_dcs(
int *error, int16_t *blocks,
int blocks_per_slice,
605 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
608 prev_dc = (blocks[0] - 0x4000) / scale;
615 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
616 dc = (blocks[0] - 0x4000) / scale;
618 delta = dc - prev_dc;
620 delta = (delta ^ sign) - sign;
623 codebook = (code + (code & 1)) >> 1;
624 codebook =
FFMIN(codebook, 3);
632 static int estimate_acs(
int *error, int16_t *blocks,
int blocks_per_slice,
633 int plane_size_factor,
634 const uint8_t *scan,
const int16_t *qmat)
638 int max_coeffs, abs_level;
641 max_coeffs = blocks_per_slice << 6;
646 for (i = 1; i < 64; i++) {
647 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
648 level = blocks[idx] / qmat[scan[i]];
649 *error +=
FFABS(blocks[idx]) % qmat[scan[i]];
651 abs_level =
FFABS(level);
669 const uint16_t *
src,
int linesize,
671 int blocks_per_mb,
int plane_size_factor,
674 int blocks_per_slice;
677 blocks_per_slice = mbs_per_slice * blocks_per_mb;
681 plane_size_factor, ctx->
scantable, qmat);
688 const int mask = (1 << abits) - 1;
689 const int dbits = (abits == 8) ? 4 : 7;
690 const int dsize = 1 << dbits - 1;
691 int diff = cur - prev;
694 if (diff >= (1 << abits) - dsize)
696 if (diff < -dsize || diff > dsize || !diff)
703 const uint16_t *
src,
int linesize,
704 int mbs_per_slice,
int quant,
708 const int mask = (1 << abits) - 1;
709 const int num_coeffs = mbs_per_slice * 256;
710 int prev =
mask, cur;
734 }
while (idx < num_coeffs);
747 int trellis_node,
int x,
int y,
int mbs_per_slice,
751 int i, q, pq, xp, yp;
753 int slice_width_factor =
av_log2(mbs_per_slice);
758 int error,
bits, bits_limit;
759 int mbs, prev, cur, new_score;
763 int linesize[4], line_add;
769 mbs = x + mbs_per_slice;
772 is_chroma[i] = (i == 1 || i == 2);
773 plane_factor[i] = slice_width_factor + 2;
780 pwidth = avctx->
width;
785 pwidth = avctx->
width >> 1;
789 src = (
const uint16_t*)(pic->
data[i] + yp * linesize[i] +
796 mbs_per_slice, num_cblocks[i], is_chroma[i]);
804 for (q = min_quant; q < max_quant + 2; q++) {
810 for (q = min_quant; q <=
max_quant; q++) {
817 num_cblocks[i], plane_factor[i],
822 mbs_per_slice, q, td->
blocks[3]);
823 if (bits > 65000 * 8) {
827 slice_bits[q] =
bits;
828 slice_score[q] = error;
830 if (slice_bits[max_quant] <= ctx->
bits_per_mb * mbs_per_slice) {
831 slice_bits[max_quant + 1] = slice_bits[
max_quant];
832 slice_score[max_quant + 1] = slice_score[
max_quant] + 1;
835 for (q = max_quant + 1; q < 128; q++) {
842 for (i = 0; i < 64; i++)
849 num_cblocks[i], plane_factor[i],
854 mbs_per_slice, q, td->
blocks[3]);
855 if (bits <= ctx->bits_per_mb * mbs_per_slice)
859 slice_bits[max_quant + 1] =
bits;
860 slice_score[max_quant + 1] = error;
863 td->
nodes[trellis_node + max_quant + 1].
quant = overquant;
866 for (pq = min_quant; pq < max_quant + 2; pq++) {
869 for (q = min_quant; q < max_quant + 2; q++) {
870 cur = trellis_node + q;
872 bits = td->
nodes[prev].
bits + slice_bits[q];
873 error = slice_score[q];
874 if (bits > bits_limit)
893 for (q = min_quant + 1; q < max_quant + 2; q++) {
894 if (td->
nodes[trellis_node + q].
score <= error) {
896 pq = trellis_node + q;
904 int jobnr,
int threadnr)
909 int x,
y = jobnr,
mb, q = 0;
911 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
912 while (ctx->
mb_width - x < mbs_per_slice)
928 const AVFrame *pic,
int *got_packet)
931 uint8_t *orig_buf, *
buf, *slice_hdr, *slice_sizes, *tmp;
934 int x,
y, i,
mb, q = 0;
935 int sizes[4] = { 0 };
936 int slice_hdr_size = 2 + 2 * (ctx->
num_planes - 1);
950 orig_buf = pkt->
data;
954 bytestream_put_be32 (&orig_buf,
FRAME_ID);
960 bytestream_put_be16 (&buf, 0);
962 bytestream_put_be16 (&buf, avctx->
width);
963 bytestream_put_be16 (&buf, avctx->
height);
968 bytestream_put_byte (&buf, frame_flags);
970 bytestream_put_byte (&buf, 0);
972 bytestream_put_byte (&buf, avctx->
color_trc);
973 bytestream_put_byte (&buf, avctx->
colorspace);
974 bytestream_put_byte (&buf, 0x40 | (ctx->
alpha_bits >> 3));
975 bytestream_put_byte (&buf, 0);
977 bytestream_put_byte (&buf, 0x03);
979 for (i = 0; i < 64; i++)
980 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
982 for (i = 0; i < 64; i++)
983 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
985 bytestream_put_byte (&buf, 0x00);
987 bytestream_put_be16 (&tmp, buf - orig_buf);
993 picture_size_pos = buf + 1;
994 bytestream_put_byte (&buf, 0x40);
1013 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
1017 while (ctx->
mb_width - x < mbs_per_slice)
1018 mbs_per_slice >>= 1;
1020 bytestream_put_byte(&buf, slice_hdr_size << 3);
1022 buf += slice_hdr_size - 1;
1024 encode_slice(avctx, pic, &pb, sizes, x, y, q, mbs_per_slice);
1026 bytestream_put_byte(&slice_hdr, q);
1027 slice_size = slice_hdr_size + sizes[ctx->
num_planes - 1];
1029 bytestream_put_be16(&slice_hdr, sizes[i]);
1030 slice_size += sizes[i];
1032 bytestream_put_be16(&slice_sizes, slice_size);
1033 buf += slice_size - slice_hdr_size;
1037 picture_size = buf - (picture_size_pos - 1);
1038 bytestream_put_be32(&picture_size_pos, picture_size);
1042 frame_size = buf - orig_buf;
1043 bytestream_put_be32(&orig_buf, frame_size);
1070 int linesize, int16_t *
block)
1073 const uint16_t *tsrc =
src;
1075 for (y = 0; y < 8; y++) {
1076 for (x = 0; x < 8; x++)
1077 block[y * 8 + x] = tsrc[x];
1078 tsrc += linesize >> 1;
1102 if (mps & (mps - 1)) {
1104 "there should be an integer power of two MBs per slice\n");
1139 if (strlen(ctx->
vendor) != 4) {
1160 for (j = 0; j < 64; j++)
1184 for (i = min_quant; i < max_quant + 2; i++) {
1198 for (j = 0; j < 64; j++) {
1219 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1228 #define OFFSET(x) offsetof(ProresContext, x)
1229 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1232 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1238 0, 0,
VE,
"profile" },
1240 0, 0,
VE,
"profile" },
1242 0, 0,
VE,
"profile" },
1244 0, 0,
VE,
"profile" },
1246 0, 0,
VE,
"profile" },
1247 {
"vendor",
"vendor ID",
OFFSET(vendor),
1249 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1254 0, 0,
VE,
"quant_mat" },
1256 0, 0,
VE,
"quant_mat" },
1258 0, 0,
VE,
"quant_mat" },
1260 0, 0,
VE,
"quant_mat" },
1262 0, 0,
VE,
"quant_mat" },
1264 0, 0,
VE,
"quant_mat" },
1266 { .i64 = 16 }, 0, 16,
VE },
1278 .
name =
"prores_ks",