38 #define CFACTOR_Y422 2
39 #define CFACTOR_Y444 3
41 #define MAX_MBS_PER_SLICE 8
67 4, 7, 9, 11, 13, 14, 15, 63,
68 7, 7, 11, 12, 14, 15, 63, 63,
69 9, 11, 13, 14, 15, 63, 63, 63,
70 11, 11, 13, 14, 63, 63, 63, 63,
71 11, 13, 14, 63, 63, 63, 63, 63,
72 13, 14, 63, 63, 63, 63, 63, 63,
73 13, 63, 63, 63, 63, 63, 63, 63,
74 63, 63, 63, 63, 63, 63, 63, 63,
77 4, 7, 9, 11, 13, 14, 63, 63,
78 7, 7, 11, 12, 14, 63, 63, 63,
79 9, 11, 13, 14, 63, 63, 63, 63,
80 11, 11, 13, 14, 63, 63, 63, 63,
81 11, 13, 14, 63, 63, 63, 63, 63,
82 13, 14, 63, 63, 63, 63, 63, 63,
83 13, 63, 63, 63, 63, 63, 63, 63,
84 63, 63, 63, 63, 63, 63, 63, 63
87 4, 5, 6, 7, 9, 11, 13, 15,
88 5, 5, 7, 8, 11, 13, 15, 17,
89 6, 7, 9, 11, 13, 15, 15, 17,
90 7, 7, 9, 11, 13, 15, 17, 19,
91 7, 9, 11, 13, 14, 16, 19, 23,
92 9, 11, 13, 14, 16, 19, 23, 29,
93 9, 11, 13, 15, 17, 21, 28, 35,
94 11, 13, 16, 17, 21, 28, 35, 41,
97 4, 4, 5, 5, 6, 7, 7, 9,
98 4, 4, 5, 6, 7, 7, 9, 9,
99 5, 5, 6, 7, 7, 9, 9, 10,
100 5, 5, 6, 7, 7, 9, 9, 10,
101 5, 6, 7, 7, 8, 9, 10, 12,
102 6, 7, 7, 8, 9, 10, 12, 15,
103 6, 7, 7, 9, 10, 11, 14, 17,
104 7, 7, 9, 10, 11, 14, 17, 21,
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,
110 4, 4, 4, 4, 4, 4, 4, 5,
111 4, 4, 4, 4, 4, 4, 5, 5,
112 4, 4, 4, 4, 4, 5, 5, 6,
113 4, 4, 4, 4, 5, 5, 6, 7,
114 4, 4, 4, 4, 5, 6, 7, 7,
117 2, 2, 2, 2, 2, 2, 2, 2,
118 2, 2, 2, 2, 2, 2, 2, 2,
119 2, 2, 2, 2, 2, 2, 2, 2,
120 2, 2, 2, 2, 2, 2, 2, 3,
121 2, 2, 2, 2, 2, 2, 3, 3,
122 2, 2, 2, 2, 2, 3, 3, 3,
123 2, 2, 2, 2, 3, 3, 3, 4,
124 2, 2, 2, 2, 3, 3, 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 4, 4, 4, 4, 4, 4, 4, 4,
133 4, 4, 4, 4, 4, 4, 4, 4,
134 4, 4, 4, 4, 4, 4, 4, 4,
160 { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 };
164 #define NUM_MB_LIMITS 4
183 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
186 .br_tab = { 300, 242, 220, 194 },
192 .tag =
MKTAG(
'a',
'p',
'c',
's'),
195 .br_tab = { 720, 560, 490, 440 },
200 .full_name =
"standard",
201 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
204 .br_tab = { 1050, 808, 710, 632 },
209 .full_name =
"high quality",
210 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
213 .br_tab = { 1566, 1216, 1070, 950 },
219 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
222 .br_tab = { 2350, 1828, 1600, 1425 },
227 .full_name =
"4444XQ",
228 .tag =
MKTAG(
'a',
'p',
'4',
'x'),
231 .br_tab = { 3525, 2742, 2400, 2137 },
237 #define TRELLIS_WIDTH 16
238 #define SCORE_LIMIT INT_MAX / 2
247 #define MAX_STORED_Q 16
270 ptrdiff_t linesize, int16_t *
block);
301 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
302 int16_t *blocks, uint16_t *emu_buf,
303 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
305 const uint16_t *esrc;
306 const int mb_width = 4 * blocks_per_mb;
310 for (
i = 0;
i < mbs_per_slice;
i++,
src += mb_width) {
312 memset(blocks, 0, 64 * (mbs_per_slice -
i) * blocks_per_mb
316 if (x + mb_width <=
w && y + 16 <=
h) {
318 elinesize = linesize;
323 elinesize = 16 *
sizeof(*emu_buf);
325 bw =
FFMIN(
w - x, mb_width);
328 for (j = 0; j < bh; j++) {
329 memcpy(emu_buf + j * 16,
330 (
const uint8_t*)
src + j * linesize,
332 pix = emu_buf[j * 16 + bw - 1];
333 for (k = bw; k < mb_width; k++)
334 emu_buf[j * 16 + k] = pix;
337 memcpy(emu_buf + j * 16,
338 emu_buf + (bh - 1) * 16,
339 mb_width *
sizeof(*emu_buf));
342 ctx->fdct(&
ctx->fdsp, esrc, elinesize, blocks);
344 if (blocks_per_mb > 2) {
345 ctx->fdct(&
ctx->fdsp, esrc + 8, elinesize, blocks);
348 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
350 if (blocks_per_mb > 2) {
351 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
355 ctx->fdct(&
ctx->fdsp, esrc, elinesize, blocks);
357 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
359 if (blocks_per_mb > 2) {
360 ctx->fdct(&
ctx->fdsp, esrc + 8, elinesize, blocks);
362 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
372 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
373 int16_t *blocks,
int mbs_per_slice,
int abits)
375 const int slice_width = 16 * mbs_per_slice;
376 int i, j, copy_w, copy_h;
378 copy_w =
FFMIN(
w - x, slice_width);
379 copy_h =
FFMIN(
h - y, 16);
380 for (
i = 0;
i < copy_h;
i++) {
381 memcpy(blocks,
src, copy_w *
sizeof(*
src));
383 for (j = 0; j < copy_w; j++)
386 for (j = 0; j < copy_w; j++)
387 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
388 for (j = copy_w; j < slice_width; j++)
389 blocks[j] = blocks[copy_w - 1];
390 blocks += slice_width;
391 src += linesize >> 1;
393 for (;
i < 16;
i++) {
394 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
395 blocks += slice_width;
404 unsigned int rice_order, exp_order, switch_bits, switch_val;
412 switch_val = switch_bits << rice_order;
414 if (
val >= switch_val) {
415 val -= switch_val - (1 << exp_order);
418 put_bits(pb, exponent - exp_order + switch_bits, 0);
421 exponent =
val >> rice_order;
431 #define GET_SIGN(x) ((x) >> 31)
432 #define MAKE_CODE(x) ((((x)) * 2) ^ GET_SIGN(x))
435 int blocks_per_slice,
int scale)
440 prev_dc = (blocks[0] - 0x4000) /
scale;
446 for (
i = 1;
i < blocks_per_slice;
i++, blocks += 64) {
447 dc = (blocks[0] - 0x4000) /
scale;
461 int blocks_per_slice,
462 int plane_size_factor,
463 const uint8_t *scan,
const int16_t *qmat)
467 int max_coeffs, abs_level;
469 max_coeffs = blocks_per_slice << 6;
474 for (
i = 1;
i < 64;
i++) {
475 for (idx = scan[
i]; idx < max_coeffs; idx += 64) {
476 level = blocks[idx] / qmat[scan[
i]];
495 const uint16_t *
src, ptrdiff_t linesize,
496 int mbs_per_slice, int16_t *blocks,
497 int blocks_per_mb,
int plane_size_factor,
500 int blocks_per_slice = mbs_per_slice * blocks_per_mb;
502 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
503 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
504 ctx->scantable, qmat);
509 const int dbits = (abits == 8) ? 4 : 7;
510 const int dsize = 1 << dbits - 1;
511 int diff = cur - prev;
514 if (
diff >= (1 << abits) - dsize)
516 if (diff < -dsize || diff > dsize || !
diff) {
541 int mbs_per_slice, uint16_t *blocks,
544 const int abits =
ctx->alpha_bits;
545 const int mask = (1 << abits) - 1;
546 const int num_coeffs = mbs_per_slice * 256;
547 int prev =
mask, cur;
564 }
while (idx < num_coeffs);
578 int slice_width_factor =
av_log2(mbs_per_slice);
579 int num_cblocks, pwidth, line_add;
581 int plane_factor, is_chroma;
583 uint16_t *qmat_chroma;
585 if (
ctx->pictures_per_frame == 1)
590 if (
ctx->force_quant) {
591 qmat =
ctx->quants[0];
592 qmat_chroma =
ctx->quants_chroma[0];
595 qmat_chroma =
ctx->quants_chroma[
quant];
597 qmat =
ctx->custom_q;
598 qmat_chroma =
ctx->custom_chroma_q;
599 for (
i = 0;
i < 64;
i++) {
601 qmat_chroma[
i] =
ctx->quant_chroma_mat[
i] *
quant;
605 for (
i = 0;
i <
ctx->num_planes;
i++) {
606 is_chroma = (
i == 1 ||
i == 2);
607 plane_factor = slice_width_factor + 2;
609 plane_factor +=
ctx->chroma_factor - 3;
614 pwidth = avctx->
width;
619 pwidth = avctx->
width >> 1;
623 src = (
const uint16_t*)(pic->
data[
i] + yp * linesize +
628 pwidth, avctx->
height /
ctx->pictures_per_frame,
629 ctx->blocks[0],
ctx->emu_buf,
630 mbs_per_slice, num_cblocks, is_chroma);
633 mbs_per_slice,
ctx->blocks[0],
634 num_cblocks, plane_factor, qmat);
637 mbs_per_slice,
ctx->blocks[0],
638 num_cblocks, plane_factor, qmat_chroma);
642 pwidth, avctx->
height /
ctx->pictures_per_frame,
643 ctx->blocks[0], mbs_per_slice,
ctx->alpha_bits);
655 unsigned int rice_order, exp_order, switch_bits, switch_val;
663 switch_val = switch_bits << rice_order;
665 if (
val >= switch_val) {
666 val -= switch_val - (1 << exp_order);
669 return exponent * 2 - exp_order + switch_bits + 1;
671 return (
val >> rice_order) + rice_order + 1;
682 prev_dc = (blocks[0] - 0x4000) /
scale;
689 for (
i = 1;
i < blocks_per_slice;
i++, blocks += 64) {
690 dc = (blocks[0] - 0x4000) /
scale;
707 int plane_size_factor,
708 const uint8_t *scan,
const int16_t *qmat)
712 int max_coeffs, abs_level;
715 max_coeffs = blocks_per_slice << 6;
720 for (
i = 1;
i < 64;
i++) {
721 for (idx = scan[
i]; idx < max_coeffs; idx += 64) {
722 level = blocks[idx] / qmat[scan[
i]];
743 const uint16_t *
src, ptrdiff_t linesize,
745 int blocks_per_mb,
int plane_size_factor,
748 int blocks_per_slice;
751 blocks_per_slice = mbs_per_slice * blocks_per_mb;
755 plane_size_factor,
ctx->scantable, qmat);
762 const int dbits = (abits == 8) ? 4 : 7;
763 const int dsize = 1 << dbits - 1;
764 int diff = cur - prev;
767 if (
diff >= (1 << abits) - dsize)
769 if (diff < -dsize || diff > dsize || !
diff)
776 const uint16_t *
src, ptrdiff_t linesize,
777 int mbs_per_slice, int16_t *blocks)
779 const int abits =
ctx->alpha_bits;
780 const int mask = (1 << abits) - 1;
781 const int num_coeffs = mbs_per_slice * 256;
782 int prev =
mask, cur;
805 }
while (idx < num_coeffs);
818 int trellis_node,
int x,
int y,
int mbs_per_slice,
822 int i, q, pq, xp, yp;
824 int slice_width_factor =
av_log2(mbs_per_slice);
830 int mbs, prev, cur, new_score;
834 uint16_t *qmat_chroma;
835 int linesize[4], line_add;
838 if (
ctx->pictures_per_frame == 1)
841 line_add =
ctx->cur_picture_idx ^ !
ctx->pic->top_field_first;
842 mbs = x + mbs_per_slice;
844 for (
i = 0;
i <
ctx->num_planes;
i++) {
845 is_chroma[
i] = (
i == 1 ||
i == 2);
846 plane_factor[
i] = slice_width_factor + 2;
848 plane_factor[
i] +=
ctx->chroma_factor - 3;
853 pwidth = avctx->
width;
858 pwidth = avctx->
width >> 1;
861 linesize[
i] =
ctx->pic->linesize[
i] *
ctx->pictures_per_frame;
862 src = (
const uint16_t *)(
ctx->pic->data[
i] + yp * linesize[
i] +
863 line_add *
ctx->pic->linesize[
i]) + xp;
867 pwidth, avctx->
height /
ctx->pictures_per_frame,
868 td->blocks[
i],
td->emu_buf,
869 mbs_per_slice, num_cblocks[
i], is_chroma[
i]);
872 pwidth, avctx->
height /
ctx->pictures_per_frame,
873 td->blocks[
i], mbs_per_slice,
ctx->alpha_bits);
878 td->nodes[trellis_node + q].prev_node = -1;
879 td->nodes[trellis_node + q].quant = q;
884 mbs_per_slice,
td->blocks[3]);
892 num_cblocks[0], plane_factor[0],
894 for (
i = 1;
i <
ctx->num_planes - !!
ctx->alpha_bits;
i++) {
898 num_cblocks[
i], plane_factor[
i],
899 ctx->quants_chroma[q],
td);
901 if (
bits > 65000 * 8)
904 slice_bits[q] =
bits;
905 slice_score[q] =
error;
907 if (slice_bits[
max_quant] <=
ctx->bits_per_mb * mbs_per_slice) {
916 qmat =
ctx->quants[q];
917 qmat_chroma =
ctx->quants_chroma[q];
920 qmat_chroma =
td->custom_chroma_q;
921 for (
i = 0;
i < 64;
i++) {
922 qmat[
i] =
ctx->quant_mat[
i] * q;
923 qmat_chroma[
i] =
ctx->quant_chroma_mat[
i] * q;
929 num_cblocks[0], plane_factor[0],
931 for (
i = 1;
i <
ctx->num_planes - !!
ctx->alpha_bits;
i++) {
935 num_cblocks[
i], plane_factor[
i],
938 if (bits <= ctx->bits_per_mb * mbs_per_slice)
946 td->nodes[trellis_node +
max_quant + 1].quant = overquant;
948 bits_limit = mbs *
ctx->bits_per_mb;
953 cur = trellis_node + q;
955 bits =
td->nodes[prev].bits + slice_bits[q];
956 error = slice_score[q];
957 if (
bits > bits_limit)
961 new_score =
td->nodes[prev].score +
error;
964 if (
td->nodes[cur].prev_node == -1 ||
965 td->nodes[cur].score >= new_score) {
967 td->nodes[cur].bits =
bits;
968 td->nodes[cur].score = new_score;
969 td->nodes[cur].prev_node = prev;
977 if (
td->nodes[trellis_node + q].score <=
error) {
978 error =
td->nodes[trellis_node + q].score;
979 pq = trellis_node + q;
987 int jobnr,
int threadnr)
991 int mbs_per_slice =
ctx->mbs_per_slice;
992 int x, y = jobnr,
mb, q = 0;
994 for (x =
mb = 0; x <
ctx->mb_width; x += mbs_per_slice,
mb++) {
995 while (
ctx->mb_width - x < mbs_per_slice)
1002 for (x =
ctx->slices_width - 1; x >= 0; x--) {
1003 ctx->slice_q[x + y *
ctx->slices_width] =
td->nodes[q].quant;
1004 q =
td->nodes[q].prev_node;
1011 const AVFrame *pic,
int *got_packet)
1014 uint8_t *orig_buf, *buf, *slice_hdr, *slice_sizes, *
tmp;
1015 uint8_t *picture_size_pos;
1017 int x, y,
i,
mb, q = 0;
1018 int sizes[4] = { 0 };
1019 int slice_hdr_size = 2 + 2 * (
ctx->num_planes - 1);
1022 int max_slice_size = (
ctx->frame_size_upper_bound - 200) / (
ctx->pictures_per_frame *
ctx->slices_per_picture + 1);
1023 uint8_t frame_flags;
1026 pkt_size =
ctx->frame_size_upper_bound;
1035 bytestream_put_be32 (&orig_buf,
FRAME_ID);
1041 bytestream_put_be16 (&buf, 0);
1043 bytestream_put_be16 (&buf, avctx->
width);
1044 bytestream_put_be16 (&buf, avctx->
height);
1046 frame_flags =
ctx->chroma_factor << 6;
1049 bytestream_put_byte (&buf, frame_flags);
1051 bytestream_put_byte (&buf, 0);
1053 bytestream_put_byte (&buf, pic->
color_trc);
1055 bytestream_put_byte (&buf, 0x40 | (
ctx->alpha_bits >> 3));
1056 bytestream_put_byte (&buf, 0);
1058 bytestream_put_byte (&buf, 0x03);
1060 for (
i = 0;
i < 64;
i++)
1061 bytestream_put_byte(&buf,
ctx->quant_mat[
i]);
1063 for (
i = 0;
i < 64;
i++)
1064 bytestream_put_byte(&buf,
ctx->quant_mat[
i]);
1066 bytestream_put_byte (&buf, 0x00);
1068 bytestream_put_be16 (&
tmp, buf - orig_buf);
1070 for (
ctx->cur_picture_idx = 0;
1071 ctx->cur_picture_idx <
ctx->pictures_per_frame;
1072 ctx->cur_picture_idx++) {
1074 picture_size_pos = buf + 1;
1075 bytestream_put_byte (&buf, 0x40);
1077 bytestream_put_be16 (&buf,
ctx->slices_per_picture);
1078 bytestream_put_byte (&buf,
av_log2(
ctx->mbs_per_slice) << 4);
1082 buf +=
ctx->slices_per_picture * 2;
1085 if (!
ctx->force_quant) {
1092 for (y = 0; y <
ctx->mb_height; y++) {
1093 int mbs_per_slice =
ctx->mbs_per_slice;
1094 for (x =
mb = 0; x <
ctx->mb_width; x += mbs_per_slice,
mb++) {
1095 q =
ctx->force_quant ?
ctx->force_quant
1096 :
ctx->slice_q[
mb + y *
ctx->slices_width];
1098 while (
ctx->mb_width - x < mbs_per_slice)
1099 mbs_per_slice >>= 1;
1101 bytestream_put_byte(&buf, slice_hdr_size << 3);
1103 buf += slice_hdr_size - 1;
1104 if (pkt_size <= buf - orig_buf + 2 * max_slice_size) {
1108 int delta = 200 + (
ctx->pictures_per_frame *
1109 ctx->slices_per_picture + 1) *
1110 max_slice_size - pkt_size;
1113 ctx->frame_size_upper_bound +=
delta;
1117 "Packet too small: is %i,"
1118 " needs %i (slice: %i). "
1119 "Correct allocation",
1120 pkt_size,
delta, max_slice_size);
1130 orig_buf =
pkt->
data + (orig_buf - start);
1131 buf =
pkt->
data + (buf - start);
1132 picture_size_pos =
pkt->
data + (picture_size_pos - start);
1133 slice_sizes =
pkt->
data + (slice_sizes - start);
1134 slice_hdr =
pkt->
data + (slice_hdr - start);
1143 bytestream_put_byte(&slice_hdr, q);
1144 slice_size = slice_hdr_size +
sizes[
ctx->num_planes - 1];
1145 for (
i = 0;
i <
ctx->num_planes - 1;
i++) {
1146 bytestream_put_be16(&slice_hdr,
sizes[
i]);
1149 bytestream_put_be16(&slice_sizes, slice_size);
1150 buf += slice_size - slice_hdr_size;
1151 if (max_slice_size < slice_size)
1152 max_slice_size = slice_size;
1156 picture_size = buf - (picture_size_pos - 1);
1157 bytestream_put_be32(&picture_size_pos, picture_size);
1186 ptrdiff_t linesize, int16_t *
block)
1189 const uint16_t *tsrc =
src;
1191 for (y = 0; y < 8; y++) {
1192 for (x = 0; x < 8; x++)
1193 block[y * 8 + x] = tsrc[x];
1194 tsrc += linesize >> 1;
1214 mps =
ctx->mbs_per_slice;
1215 if (mps & (mps - 1)) {
1217 "there should be an integer power of two MBs per slice\n");
1223 !(
desc->log2_chroma_w +
desc->log2_chroma_h))
1227 ?
"4:4:4:4 profile because of the used input colorspace"
1228 :
"HQ profile to keep best quality");
1235 "encode alpha. Override with -profile if needed.\n");
1236 ctx->alpha_bits = 0;
1238 if (
ctx->alpha_bits & 7) {
1244 ctx->alpha_bits = 0;
1251 ctx->num_planes = 3 + !!
ctx->alpha_bits;
1260 ctx->slices_width =
ctx->mb_width / mps;
1262 ctx->slices_per_picture =
ctx->mb_height *
ctx->slices_width;
1265 if (
ctx->quant_sel == -1) {
1273 if (strlen(
ctx->vendor) != 4) {
1279 if (!
ctx->force_quant) {
1280 if (!
ctx->bits_per_mb) {
1283 ctx->pictures_per_frame)
1285 ctx->bits_per_mb =
ctx->profile_info->br_tab[
i];
1286 if (
ctx->alpha_bits)
1287 ctx->bits_per_mb *= 20;
1288 }
else if (
ctx->bits_per_mb < 128) {
1296 for (j = 0; j < 64; j++) {
1297 ctx->quants[
i][j] =
ctx->quant_mat[j] *
i;
1298 ctx->quants_chroma[
i][j] =
ctx->quant_chroma_mat[j] *
i;
1313 *
sizeof(*
ctx->tdata->nodes));
1314 if (!
ctx->tdata[j].nodes)
1317 ctx->tdata[j].nodes[
i].prev_node = -1;
1318 ctx->tdata[j].nodes[
i].bits = 0;
1319 ctx->tdata[j].nodes[
i].score = 0;
1326 if (
ctx->force_quant > 64) {
1331 for (j = 0; j < 64; j++) {
1332 ctx->quants[0][j] =
ctx->quant_mat[j] *
ctx->force_quant;
1333 ctx->quants_chroma[0][j] =
ctx->quant_chroma_mat[j] *
ctx->force_quant;
1334 ls +=
av_log2((1 << 11) /
ctx->quants[0][j]) * 2 + 1;
1335 ls_chroma +=
av_log2((1 << 11) /
ctx->quants_chroma[0][j]) * 2 + 1;
1338 ctx->bits_per_mb = ls * 4 + ls_chroma * 4;
1340 ctx->bits_per_mb += ls_chroma * 4;
1343 ctx->frame_size_upper_bound = (
ctx->pictures_per_frame *
1344 ctx->slices_per_picture + 1) *
1345 (2 + 2 *
ctx->num_planes +
1346 (mps *
ctx->bits_per_mb) / 8)
1349 if (
ctx->alpha_bits) {
1351 ctx->frame_size_upper_bound += (
ctx->pictures_per_frame *
1352 ctx->slices_per_picture + 1) *
1353 (
ctx->mbs_per_slice * 256 *
1354 (1 +
ctx->alpha_bits + 1) + 7 >> 3);
1360 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1361 ctx->profile,
ctx->slices_per_picture *
ctx->pictures_per_frame,
1364 ctx->frame_size_upper_bound);
1369 #define OFFSET(x) offsetof(ProresContext, x)
1370 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1373 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1379 0, 0,
VE,
"profile" },
1381 0, 0,
VE,
"profile" },
1383 0, 0,
VE,
"profile" },
1385 0, 0,
VE,
"profile" },
1387 0, 0,
VE,
"profile" },
1389 0, 0,
VE,
"profile" },
1391 0, 0,
VE,
"profile" },
1392 {
"vendor",
"vendor ID",
OFFSET(vendor),
1394 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1399 0, 0,
VE,
"quant_mat" },
1401 0, 0,
VE,
"quant_mat" },
1403 0, 0,
VE,
"quant_mat" },
1405 0, 0,
VE,
"quant_mat" },
1407 0, 0,
VE,
"quant_mat" },
1409 0, 0,
VE,
"quant_mat" },
1411 { .i64 = 16 }, 0, 16,
VE },
1423 .
p.
name =
"prores_ks",