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;
 
 1287                                                   * 
sizeof(*
ctx->tdata->nodes));
 
 1288             if (!
ctx->tdata[j].nodes)
 
 1291                 ctx->tdata[j].nodes[
i].prev_node = -1;
 
 1292                 ctx->tdata[j].nodes[
i].bits      = 0;
 
 1293                 ctx->tdata[j].nodes[
i].score     = 0;
 
 1300         if (
ctx->force_quant > 64) {
 
 1305         for (j = 0; j < 64; j++) {
 
 1306             ctx->quants[0][j] = 
ctx->quant_mat[j] * 
ctx->force_quant;
 
 1307             ctx->quants_chroma[0][j] = 
ctx->quant_chroma_mat[j] * 
ctx->force_quant;
 
 1308             ls += 
av_log2((1 << 11)  / 
ctx->quants[0][j]) * 2 + 1;
 
 1309             ls_chroma += 
av_log2((1 << 11)  / 
ctx->quants_chroma[0][j]) * 2 + 1;
 
 1312         ctx->bits_per_mb = ls * 4 + ls_chroma * 4;
 
 1314             ctx->bits_per_mb += ls_chroma * 4;
 
 1317     ctx->frame_size_upper_bound = (
ctx->pictures_per_frame *
 
 1318                                    ctx->slices_per_picture + 1) *
 
 1319                                   (2 + 2 * 
ctx->num_planes +
 
 1320                                    (mps * 
ctx->bits_per_mb) / 8)
 
 1323     if (
ctx->alpha_bits) {
 
 1325          ctx->frame_size_upper_bound += (
ctx->pictures_per_frame *
 
 1326                                          ctx->slices_per_picture + 1) *
 
 1327               (
ctx->mbs_per_slice * 256 *
 
 1328                      (1 + 
ctx->alpha_bits + 1) + 7 >> 3);
 
 1334            "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
 
 1335            ctx->profile, 
ctx->slices_per_picture * 
ctx->pictures_per_frame,
 
 1338            ctx->frame_size_upper_bound);
 
 1343 #define OFFSET(x) offsetof(ProresContext, x) 
 1344 #define VE     AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 
 1347     { 
"mbs_per_slice", 
"macroblocks per slice", 
OFFSET(mbs_per_slice),
 
 1353         0, 0, 
VE, 
"profile" },
 
 1355         0, 0, 
VE, 
"profile" },
 
 1357         0, 0, 
VE, 
"profile" },
 
 1359         0, 0, 
VE, 
"profile" },
 
 1361         0, 0, 
VE, 
"profile" },
 
 1363         0, 0, 
VE, 
"profile" },
 
 1365         0, 0, 
VE, 
"profile" },
 
 1366     { 
"vendor", 
"vendor ID", 
OFFSET(vendor),
 
 1368     { 
"bits_per_mb", 
"desired bits per macroblock", 
OFFSET(bits_per_mb),
 
 1373         0, 0, 
VE, 
"quant_mat" },
 
 1375         0, 0, 
VE, 
"quant_mat" },
 
 1377         0, 0, 
VE, 
"quant_mat" },
 
 1379         0, 0, 
VE, 
"quant_mat" },
 
 1381         0, 0, 
VE, 
"quant_mat" },
 
 1383         0, 0, 
VE, 
"quant_mat" },
 
 1385         { .i64 = 16 }, 0, 16, 
VE },
 
 1397     .
p.
name         = 
"prores_ks",