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,
138 #define NUM_MB_LIMITS 4
157 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
160 .br_tab = { 300, 242, 220, 194 },
166 .tag =
MKTAG(
'a',
'p',
'c',
's'),
169 .br_tab = { 720, 560, 490, 440 },
174 .full_name =
"standard",
175 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
178 .br_tab = { 1050, 808, 710, 632 },
183 .full_name =
"high quality",
184 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
187 .br_tab = { 1566, 1216, 1070, 950 },
193 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
196 .br_tab = { 2350, 1828, 1600, 1425 },
201 .full_name =
"4444XQ",
202 .tag =
MKTAG(
'a',
'p',
'4',
'x'),
205 .br_tab = { 3525, 2742, 2400, 2137 },
211 #define TRELLIS_WIDTH 16
212 #define SCORE_LIMIT INT_MAX / 2
221 #define MAX_STORED_Q 16
244 ptrdiff_t linesize, int16_t *
block);
275 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
276 int16_t *blocks, uint16_t *emu_buf,
277 int mbs_per_slice,
int blocks_per_mb,
int is_chroma)
279 const uint16_t *esrc;
280 const int mb_width = 4 * blocks_per_mb;
284 for (
i = 0;
i < mbs_per_slice;
i++,
src += mb_width) {
286 memset(blocks, 0, 64 * (mbs_per_slice -
i) * blocks_per_mb
290 if (x + mb_width <=
w && y + 16 <=
h) {
292 elinesize = linesize;
297 elinesize = 16 *
sizeof(*emu_buf);
299 bw =
FFMIN(
w - x, mb_width);
302 for (j = 0; j < bh; j++) {
303 memcpy(emu_buf + j * 16,
304 (
const uint8_t*)
src + j * linesize,
306 pix = emu_buf[j * 16 + bw - 1];
307 for (k = bw; k < mb_width; k++)
308 emu_buf[j * 16 + k] = pix;
311 memcpy(emu_buf + j * 16,
312 emu_buf + (bh - 1) * 16,
313 mb_width *
sizeof(*emu_buf));
316 ctx->fdct(&
ctx->fdsp, esrc, elinesize, blocks);
318 if (blocks_per_mb > 2) {
319 ctx->fdct(&
ctx->fdsp, esrc + 8, elinesize, blocks);
322 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
324 if (blocks_per_mb > 2) {
325 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
329 ctx->fdct(&
ctx->fdsp, esrc, elinesize, blocks);
331 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4, elinesize, blocks);
333 if (blocks_per_mb > 2) {
334 ctx->fdct(&
ctx->fdsp, esrc + 8, elinesize, blocks);
336 ctx->fdct(&
ctx->fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
346 ptrdiff_t linesize,
int x,
int y,
int w,
int h,
347 int16_t *blocks,
int mbs_per_slice,
int abits)
349 const int slice_width = 16 * mbs_per_slice;
350 int i, j, copy_w, copy_h;
352 copy_w =
FFMIN(
w - x, slice_width);
353 copy_h =
FFMIN(
h - y, 16);
354 for (
i = 0;
i < copy_h;
i++) {
355 memcpy(blocks,
src, copy_w *
sizeof(*
src));
357 for (j = 0; j < copy_w; j++)
360 for (j = 0; j < copy_w; j++)
361 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
362 for (j = copy_w; j < slice_width; j++)
363 blocks[j] = blocks[copy_w - 1];
364 blocks += slice_width;
365 src += linesize >> 1;
367 for (;
i < 16;
i++) {
368 memcpy(blocks, blocks - slice_width, slice_width *
sizeof(*blocks));
369 blocks += slice_width;
378 unsigned int rice_order, exp_order, switch_bits, switch_val;
386 switch_val = switch_bits << rice_order;
388 if (
val >= switch_val) {
389 val -= switch_val - (1 << exp_order);
392 put_bits(pb, exponent - exp_order + switch_bits, 0);
395 exponent =
val >> rice_order;
405 #define GET_SIGN(x) ((x) >> 31)
406 #define MAKE_CODE(x) ((((x)) * 2) ^ GET_SIGN(x))
409 int blocks_per_slice,
int scale)
414 prev_dc = (blocks[0] - 0x4000) /
scale;
420 for (
i = 1;
i < blocks_per_slice;
i++, blocks += 64) {
421 dc = (blocks[0] - 0x4000) /
scale;
435 int blocks_per_slice,
436 int plane_size_factor,
437 const uint8_t *scan,
const int16_t *qmat)
441 int max_coeffs, abs_level;
443 max_coeffs = blocks_per_slice << 6;
448 for (
i = 1;
i < 64;
i++) {
449 for (idx = scan[
i]; idx < max_coeffs; idx += 64) {
450 level = blocks[idx] / qmat[scan[
i]];
469 const uint16_t *
src, ptrdiff_t linesize,
470 int mbs_per_slice, int16_t *blocks,
471 int blocks_per_mb,
int plane_size_factor,
474 int blocks_per_slice = mbs_per_slice * blocks_per_mb;
476 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
477 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
478 ctx->scantable, qmat);
483 const int dbits = (abits == 8) ? 4 : 7;
484 const int dsize = 1 << dbits - 1;
485 int diff = cur - prev;
488 if (
diff >= (1 << abits) - dsize)
490 if (diff < -dsize || diff > dsize || !
diff) {
515 int mbs_per_slice, uint16_t *blocks,
518 const int abits =
ctx->alpha_bits;
519 const int mask = (1 << abits) - 1;
520 const int num_coeffs = mbs_per_slice * 256;
521 int prev =
mask, cur;
538 }
while (idx < num_coeffs);
552 int slice_width_factor =
av_log2(mbs_per_slice);
553 int num_cblocks, pwidth, line_add;
555 int plane_factor, is_chroma;
557 uint16_t *qmat_chroma;
559 if (
ctx->pictures_per_frame == 1)
564 if (
ctx->force_quant) {
565 qmat =
ctx->quants[0];
566 qmat_chroma =
ctx->quants_chroma[0];
569 qmat_chroma =
ctx->quants_chroma[
quant];
571 qmat =
ctx->custom_q;
572 qmat_chroma =
ctx->custom_chroma_q;
573 for (
i = 0;
i < 64;
i++) {
575 qmat_chroma[
i] =
ctx->quant_chroma_mat[
i] *
quant;
579 for (
i = 0;
i <
ctx->num_planes;
i++) {
580 is_chroma = (
i == 1 ||
i == 2);
581 plane_factor = slice_width_factor + 2;
583 plane_factor +=
ctx->chroma_factor - 3;
588 pwidth = avctx->
width;
593 pwidth = avctx->
width >> 1;
597 src = (
const uint16_t*)(pic->
data[
i] + yp * linesize +
602 pwidth, avctx->
height /
ctx->pictures_per_frame,
603 ctx->blocks[0],
ctx->emu_buf,
604 mbs_per_slice, num_cblocks, is_chroma);
607 mbs_per_slice,
ctx->blocks[0],
608 num_cblocks, plane_factor, qmat);
611 mbs_per_slice,
ctx->blocks[0],
612 num_cblocks, plane_factor, qmat_chroma);
616 pwidth, avctx->
height /
ctx->pictures_per_frame,
617 ctx->blocks[0], mbs_per_slice,
ctx->alpha_bits);
629 unsigned int rice_order, exp_order, switch_bits, switch_val;
637 switch_val = switch_bits << rice_order;
639 if (
val >= switch_val) {
640 val -= switch_val - (1 << exp_order);
643 return exponent * 2 - exp_order + switch_bits + 1;
645 return (
val >> rice_order) + rice_order + 1;
656 prev_dc = (blocks[0] - 0x4000) /
scale;
663 for (
i = 1;
i < blocks_per_slice;
i++, blocks += 64) {
664 dc = (blocks[0] - 0x4000) /
scale;
681 int plane_size_factor,
682 const uint8_t *scan,
const int16_t *qmat)
686 int max_coeffs, abs_level;
689 max_coeffs = blocks_per_slice << 6;
694 for (
i = 1;
i < 64;
i++) {
695 for (idx = scan[
i]; idx < max_coeffs; idx += 64) {
696 level = blocks[idx] / qmat[scan[
i]];
717 const uint16_t *
src, ptrdiff_t linesize,
719 int blocks_per_mb,
int plane_size_factor,
722 int blocks_per_slice;
725 blocks_per_slice = mbs_per_slice * blocks_per_mb;
729 plane_size_factor,
ctx->scantable, qmat);
736 const int dbits = (abits == 8) ? 4 : 7;
737 const int dsize = 1 << dbits - 1;
738 int diff = cur - prev;
741 if (
diff >= (1 << abits) - dsize)
743 if (diff < -dsize || diff > dsize || !
diff)
750 const uint16_t *
src, ptrdiff_t linesize,
751 int mbs_per_slice, int16_t *blocks)
753 const int abits =
ctx->alpha_bits;
754 const int mask = (1 << abits) - 1;
755 const int num_coeffs = mbs_per_slice * 256;
756 int prev =
mask, cur;
779 }
while (idx < num_coeffs);
792 int trellis_node,
int x,
int y,
int mbs_per_slice,
796 int i, q, pq, xp, yp;
798 int slice_width_factor =
av_log2(mbs_per_slice);
804 int mbs, prev, cur, new_score;
808 uint16_t *qmat_chroma;
809 int linesize[4], line_add;
812 if (
ctx->pictures_per_frame == 1)
815 line_add =
ctx->cur_picture_idx ^ !
ctx->pic->top_field_first;
816 mbs = x + mbs_per_slice;
818 for (
i = 0;
i <
ctx->num_planes;
i++) {
819 is_chroma[
i] = (
i == 1 ||
i == 2);
820 plane_factor[
i] = slice_width_factor + 2;
822 plane_factor[
i] +=
ctx->chroma_factor - 3;
827 pwidth = avctx->
width;
832 pwidth = avctx->
width >> 1;
835 linesize[
i] =
ctx->pic->linesize[
i] *
ctx->pictures_per_frame;
836 src = (
const uint16_t *)(
ctx->pic->data[
i] + yp * linesize[
i] +
837 line_add *
ctx->pic->linesize[
i]) + xp;
841 pwidth, avctx->
height /
ctx->pictures_per_frame,
842 td->blocks[
i],
td->emu_buf,
843 mbs_per_slice, num_cblocks[
i], is_chroma[
i]);
846 pwidth, avctx->
height /
ctx->pictures_per_frame,
847 td->blocks[
i], mbs_per_slice,
ctx->alpha_bits);
852 td->nodes[trellis_node + q].prev_node = -1;
853 td->nodes[trellis_node + q].quant = q;
858 mbs_per_slice,
td->blocks[3]);
866 num_cblocks[0], plane_factor[0],
868 for (
i = 1;
i <
ctx->num_planes - !!
ctx->alpha_bits;
i++) {
872 num_cblocks[
i], plane_factor[
i],
873 ctx->quants_chroma[q],
td);
875 if (
bits > 65000 * 8)
878 slice_bits[q] =
bits;
879 slice_score[q] =
error;
881 if (slice_bits[
max_quant] <=
ctx->bits_per_mb * mbs_per_slice) {
890 qmat =
ctx->quants[q];
891 qmat_chroma =
ctx->quants_chroma[q];
894 qmat_chroma =
td->custom_chroma_q;
895 for (
i = 0;
i < 64;
i++) {
896 qmat[
i] =
ctx->quant_mat[
i] * q;
897 qmat_chroma[
i] =
ctx->quant_chroma_mat[
i] * q;
903 num_cblocks[0], plane_factor[0],
905 for (
i = 1;
i <
ctx->num_planes - !!
ctx->alpha_bits;
i++) {
909 num_cblocks[
i], plane_factor[
i],
912 if (bits <= ctx->bits_per_mb * mbs_per_slice)
920 td->nodes[trellis_node +
max_quant + 1].quant = overquant;
922 bits_limit = mbs *
ctx->bits_per_mb;
927 cur = trellis_node + q;
929 bits =
td->nodes[prev].bits + slice_bits[q];
930 error = slice_score[q];
931 if (
bits > bits_limit)
935 new_score =
td->nodes[prev].score +
error;
938 if (
td->nodes[cur].prev_node == -1 ||
939 td->nodes[cur].score >= new_score) {
941 td->nodes[cur].bits =
bits;
942 td->nodes[cur].score = new_score;
943 td->nodes[cur].prev_node = prev;
951 if (
td->nodes[trellis_node + q].score <=
error) {
952 error =
td->nodes[trellis_node + q].score;
953 pq = trellis_node + q;
961 int jobnr,
int threadnr)
965 int mbs_per_slice =
ctx->mbs_per_slice;
966 int x, y = jobnr,
mb, q = 0;
968 for (x =
mb = 0; x <
ctx->mb_width; x += mbs_per_slice,
mb++) {
969 while (
ctx->mb_width - x < mbs_per_slice)
976 for (x =
ctx->slices_width - 1; x >= 0; x--) {
977 ctx->slice_q[x + y *
ctx->slices_width] =
td->nodes[q].quant;
978 q =
td->nodes[q].prev_node;
985 const AVFrame *pic,
int *got_packet)
988 uint8_t *orig_buf, *buf, *slice_hdr, *slice_sizes, *
tmp;
989 uint8_t *picture_size_pos;
991 int x, y,
i,
mb, q = 0;
992 int sizes[4] = { 0 };
993 int slice_hdr_size = 2 + 2 * (
ctx->num_planes - 1);
996 int max_slice_size = (
ctx->frame_size_upper_bound - 200) / (
ctx->pictures_per_frame *
ctx->slices_per_picture + 1);
1000 pkt_size =
ctx->frame_size_upper_bound;
1009 bytestream_put_be32 (&orig_buf,
FRAME_ID);
1015 bytestream_put_be16 (&buf, 0);
1017 bytestream_put_be16 (&buf, avctx->
width);
1018 bytestream_put_be16 (&buf, avctx->
height);
1020 frame_flags =
ctx->chroma_factor << 6;
1023 bytestream_put_byte (&buf, frame_flags);
1025 bytestream_put_byte (&buf, 0);
1027 bytestream_put_byte (&buf, pic->
color_trc);
1029 bytestream_put_byte (&buf, 0x40 | (
ctx->alpha_bits >> 3));
1030 bytestream_put_byte (&buf, 0);
1032 bytestream_put_byte (&buf, 0x03);
1034 for (
i = 0;
i < 64;
i++)
1035 bytestream_put_byte(&buf,
ctx->quant_mat[
i]);
1037 for (
i = 0;
i < 64;
i++)
1038 bytestream_put_byte(&buf,
ctx->quant_mat[
i]);
1040 bytestream_put_byte (&buf, 0x00);
1042 bytestream_put_be16 (&
tmp, buf - orig_buf);
1044 for (
ctx->cur_picture_idx = 0;
1045 ctx->cur_picture_idx <
ctx->pictures_per_frame;
1046 ctx->cur_picture_idx++) {
1048 picture_size_pos = buf + 1;
1049 bytestream_put_byte (&buf, 0x40);
1051 bytestream_put_be16 (&buf,
ctx->slices_per_picture);
1052 bytestream_put_byte (&buf,
av_log2(
ctx->mbs_per_slice) << 4);
1056 buf +=
ctx->slices_per_picture * 2;
1059 if (!
ctx->force_quant) {
1066 for (y = 0; y <
ctx->mb_height; y++) {
1067 int mbs_per_slice =
ctx->mbs_per_slice;
1068 for (x =
mb = 0; x <
ctx->mb_width; x += mbs_per_slice,
mb++) {
1069 q =
ctx->force_quant ?
ctx->force_quant
1070 :
ctx->slice_q[
mb + y *
ctx->slices_width];
1072 while (
ctx->mb_width - x < mbs_per_slice)
1073 mbs_per_slice >>= 1;
1075 bytestream_put_byte(&buf, slice_hdr_size << 3);
1077 buf += slice_hdr_size - 1;
1078 if (pkt_size <= buf - orig_buf + 2 * max_slice_size) {
1082 int delta = 200 + (
ctx->pictures_per_frame *
1083 ctx->slices_per_picture + 1) *
1084 max_slice_size - pkt_size;
1087 ctx->frame_size_upper_bound +=
delta;
1091 "Packet too small: is %i,"
1092 " needs %i (slice: %i). "
1093 "Correct allocation",
1094 pkt_size,
delta, max_slice_size);
1104 orig_buf =
pkt->
data + (orig_buf - start);
1105 buf =
pkt->
data + (buf - start);
1106 picture_size_pos =
pkt->
data + (picture_size_pos - start);
1107 slice_sizes =
pkt->
data + (slice_sizes - start);
1108 slice_hdr =
pkt->
data + (slice_hdr - start);
1117 bytestream_put_byte(&slice_hdr, q);
1118 slice_size = slice_hdr_size +
sizes[
ctx->num_planes - 1];
1119 for (
i = 0;
i <
ctx->num_planes - 1;
i++) {
1120 bytestream_put_be16(&slice_hdr,
sizes[
i]);
1123 bytestream_put_be16(&slice_sizes, slice_size);
1124 buf += slice_size - slice_hdr_size;
1125 if (max_slice_size < slice_size)
1126 max_slice_size = slice_size;
1130 picture_size = buf - (picture_size_pos - 1);
1131 bytestream_put_be32(&picture_size_pos, picture_size);
1160 ptrdiff_t linesize, int16_t *
block)
1163 const uint16_t *tsrc =
src;
1165 for (y = 0; y < 8; y++) {
1166 for (x = 0; x < 8; x++)
1167 block[y * 8 + x] = tsrc[x];
1168 tsrc += linesize >> 1;
1188 mps =
ctx->mbs_per_slice;
1189 if (mps & (mps - 1)) {
1191 "there should be an integer power of two MBs per slice\n");
1197 !(
desc->log2_chroma_w +
desc->log2_chroma_h))
1201 ?
"4:4:4:4 profile because of the used input colorspace"
1202 :
"HQ profile to keep best quality");
1209 "encode alpha. Override with -profile if needed.\n");
1210 ctx->alpha_bits = 0;
1212 if (
ctx->alpha_bits & 7) {
1218 ctx->alpha_bits = 0;
1225 ctx->num_planes = 3 + !!
ctx->alpha_bits;
1234 ctx->slices_width =
ctx->mb_width / mps;
1236 ctx->slices_per_picture =
ctx->mb_height *
ctx->slices_width;
1239 if (
ctx->quant_sel == -1) {
1247 if (strlen(
ctx->vendor) != 4) {
1253 if (!
ctx->force_quant) {
1254 if (!
ctx->bits_per_mb) {
1257 ctx->pictures_per_frame)
1259 ctx->bits_per_mb =
ctx->profile_info->br_tab[
i];
1260 if (
ctx->alpha_bits)
1261 ctx->bits_per_mb *= 20;
1262 }
else if (
ctx->bits_per_mb < 128) {
1270 for (j = 0; j < 64; j++) {
1271 ctx->quants[
i][j] =
ctx->quant_mat[j] *
i;
1272 ctx->quants_chroma[
i][j] =
ctx->quant_chroma_mat[j] *
i;
1277 if (!
ctx->slice_q) {
1291 *
sizeof(*
ctx->tdata->nodes));
1292 if (!
ctx->tdata[j].nodes) {
1297 ctx->tdata[j].nodes[
i].prev_node = -1;
1298 ctx->tdata[j].nodes[
i].bits = 0;
1299 ctx->tdata[j].nodes[
i].score = 0;
1306 if (
ctx->force_quant > 64) {
1311 for (j = 0; j < 64; j++) {
1312 ctx->quants[0][j] =
ctx->quant_mat[j] *
ctx->force_quant;
1313 ctx->quants_chroma[0][j] =
ctx->quant_chroma_mat[j] *
ctx->force_quant;
1314 ls +=
av_log2((1 << 11) /
ctx->quants[0][j]) * 2 + 1;
1315 ls_chroma +=
av_log2((1 << 11) /
ctx->quants_chroma[0][j]) * 2 + 1;
1318 ctx->bits_per_mb = ls * 4 + ls_chroma * 4;
1320 ctx->bits_per_mb += ls_chroma * 4;
1323 ctx->frame_size_upper_bound = (
ctx->pictures_per_frame *
1324 ctx->slices_per_picture + 1) *
1325 (2 + 2 *
ctx->num_planes +
1326 (mps *
ctx->bits_per_mb) / 8)
1329 if (
ctx->alpha_bits) {
1331 ctx->frame_size_upper_bound += (
ctx->pictures_per_frame *
1332 ctx->slices_per_picture + 1) *
1333 (
ctx->mbs_per_slice * 256 *
1334 (1 +
ctx->alpha_bits + 1) + 7 >> 3);
1340 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1341 ctx->profile,
ctx->slices_per_picture *
ctx->pictures_per_frame,
1344 ctx->frame_size_upper_bound);
1349 #define OFFSET(x) offsetof(ProresContext, x)
1350 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1353 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1359 0, 0,
VE,
"profile" },
1361 0, 0,
VE,
"profile" },
1363 0, 0,
VE,
"profile" },
1365 0, 0,
VE,
"profile" },
1367 0, 0,
VE,
"profile" },
1369 0, 0,
VE,
"profile" },
1371 0, 0,
VE,
"profile" },
1372 {
"vendor",
"vendor ID",
OFFSET(vendor),
1374 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1379 0, 0,
VE,
"quant_mat" },
1381 0, 0,
VE,
"quant_mat" },
1383 0, 0,
VE,
"quant_mat" },
1385 0, 0,
VE,
"quant_mat" },
1387 0, 0,
VE,
"quant_mat" },
1389 0, 0,
VE,
"quant_mat" },
1391 { .i64 = 16 }, 0, 16,
VE },
1403 .
name =
"prores_ks",