37 #define DEFAULT_SLICE_MB_WIDTH 8 
   39 #define FF_PROFILE_PRORES_PROXY     0 
   40 #define FF_PROFILE_PRORES_LT        1 
   41 #define FF_PROFILE_PRORES_STANDARD  2 
   42 #define FF_PROFILE_PRORES_HQ        3 
   57      0,  1,  8,  9,  2,  3, 10, 11,
 
   58     16, 17, 24, 25, 18, 19, 26, 27,
 
   59      4,  5, 12, 20, 13,  6,  7, 14,
 
   60     21, 28, 29, 22, 15, 23, 30, 31,
 
   61     32, 33, 40, 48, 41, 34, 35, 42,
 
   62     49, 56, 57, 50, 43, 36, 37, 44,
 
   63     51, 58, 59, 52, 45, 38, 39, 46,
 
   64     53, 60, 61, 54, 47, 55, 62, 63
 
   69          4,  7,  9, 11, 13, 14, 15, 63,
 
   70          7,  7, 11, 12, 14, 15, 63, 63,
 
   71          9, 11, 13, 14, 15, 63, 63, 63,
 
   72         11, 11, 13, 14, 63, 63, 63, 63,
 
   73         11, 13, 14, 63, 63, 63, 63, 63,
 
   74         13, 14, 63, 63, 63, 63, 63, 63,
 
   75         13, 63, 63, 63, 63, 63, 63, 63,
 
   76         63, 63, 63, 63, 63, 63, 63, 63
 
   78          4,  5,  6,  7,  9, 11, 13, 15,
 
   79          5,  5,  7,  8, 11, 13, 15, 17,
 
   80          6,  7,  9, 11, 13, 15, 15, 17,
 
   81          7,  7,  9, 11, 13, 15, 17, 19,
 
   82          7,  9, 11, 13, 14, 16, 19, 23,
 
   83          9, 11, 13, 14, 16, 19, 23, 29,
 
   84          9, 11, 13, 15, 17, 21, 28, 35,
 
   85         11, 13, 16, 17, 21, 28, 35, 41
 
   87          4,  4,  5,  5,  6,  7,  7,  9,
 
   88          4,  4,  5,  6,  7,  7,  9,  9,
 
   89          5,  5,  6,  7,  7,  9,  9, 10,
 
   90          5,  5,  6,  7,  7,  9,  9, 10,
 
   91          5,  6,  7,  7,  8,  9, 10, 12,
 
   92          6,  7,  7,  8,  9, 10, 12, 15,
 
   93          6,  7,  7,  9, 10, 11, 14, 17,
 
   94          7,  7,  9, 10, 11, 14, 17, 21
 
   96          4,  4,  4,  4,  4,  4,  4,  4,
 
   97          4,  4,  4,  4,  4,  4,  4,  4,
 
   98          4,  4,  4,  4,  4,  4,  4,  4,
 
   99          4,  4,  4,  4,  4,  4,  4,  5,
 
  100          4,  4,  4,  4,  4,  4,  5,  5,
 
  101          4,  4,  4,  4,  4,  5,  5,  6,
 
  102          4,  4,  4,  4,  5,  5,  6,  7,
 
  103          4,  4,  4,  4,  5,  6,  7,  7
 
  109          4,  7,  9, 11, 13, 14, 63, 63,
 
  110          7,  7, 11, 12, 14, 63, 63, 63,
 
  111          9, 11, 13, 14, 63, 63, 63, 63,
 
  112         11, 11, 13, 14, 63, 63, 63, 63,
 
  113         11, 13, 14, 63, 63, 63, 63, 63,
 
  114         13, 14, 63, 63, 63, 63, 63, 63,
 
  115         13, 63, 63, 63, 63, 63, 63, 63,
 
  116         63, 63, 63, 63, 63, 63, 63, 63
 
  118          4,  5,  6,  7,  9, 11, 13, 15,
 
  119          5,  5,  7,  8, 11, 13, 15, 17,
 
  120          6,  7,  9, 11, 13, 15, 15, 17,
 
  121          7,  7,  9, 11, 13, 15, 17, 19,
 
  122          7,  9, 11, 13, 14, 16, 19, 23,
 
  123          9, 11, 13, 14, 16, 19, 23, 29,
 
  124          9, 11, 13, 15, 17, 21, 28, 35,
 
  125         11, 13, 16, 17, 21, 28, 35, 41
 
  127          4,  4,  5,  5,  6,  7,  7,  9,
 
  128          4,  4,  5,  6,  7,  7,  9,  9,
 
  129          5,  5,  6,  7,  7,  9,  9, 10,
 
  130          5,  5,  6,  7,  7,  9,  9, 10,
 
  131          5,  6,  7,  7,  8,  9, 10, 12,
 
  132          6,  7,  7,  8,  9, 10, 12, 15,
 
  133          6,  7,  7,  9, 10, 11, 14, 17,
 
  134          7,  7,  9, 10, 11, 14, 17, 21
 
  136          4,  4,  4,  4,  4,  4,  4,  4,
 
  137          4,  4,  4,  4,  4,  4,  4,  4,
 
  138          4,  4,  4,  4,  4,  4,  4,  4,
 
  139          4,  4,  4,  4,  4,  4,  4,  5,
 
  140          4,  4,  4,  4,  4,  4,  5,  5,
 
  141          4,  4,  4,  4,  4,  5,  5,  6,
 
  142          4,  4,  4,  4,  5,  5,  6,  7,
 
  143          4,  4,  4,  4,  5,  6,  7,  7
 
  154     int qmat_luma[16][64];
 
  155     int qmat_chroma[16][64];
 
  160     unsigned int rice_order, exp_order, switch_bits, first_exp, exp, zeros,
 
  164     switch_bits = codebook & 3;
 
  165     rice_order  = codebook >> 5;
 
  166     exp_order   = (codebook >> 2) & 7;
 
  168     first_exp = ((switch_bits + 1) << rice_order);
 
  170     if (val >= first_exp) { 
 
  172         val += (1 << exp_order);
 
  174         zeros = exp - exp_order + switch_bits + 1;
 
  177     } 
else if (rice_order) {
 
  178         mask = (1 << rice_order) - 1;
 
  179         put_bits(pb, (val >> rice_order), 0);
 
  181         put_bits(pb, rice_order, val & mask);
 
  188 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind])) 
  189 #define TO_GOLOMB(val) (((val) << 1) ^ ((val) >> 31)) 
  190 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign)) 
  191 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1) 
  192 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign)) 
  196     int sign = (val >> 31);
 
  197     return (val ^ sign) - sign;
 
  200 #define FIRST_DC_CB 0xB8 
  205         int blocks_per_slice, 
int *qmat)
 
  209     int new_dc, 
delta, diff_sign, new_code;
 
  211     prev_dc = 
QSCALE(qmat, 0, in[0] - 16384);
 
  215     code = 5; sign = 0; idx = 64;
 
  216     for (i = 1; i < blocks_per_slice; i++, idx += 64) {
 
  217         new_dc    = 
QSCALE(qmat, 0, in[idx] - 16384);
 
  218         delta     = new_dc - prev_dc;
 
  231         0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
 
  233         0x28, 0x28, 0x28, 0x4C };
 
  236         int16_t *
in, 
int blocks_per_slice, 
int *qmat)
 
  242     for (i = 1; i < 64; i++) {
 
  244         for (j = 0; j < blocks_per_slice; j++) {
 
  245             int val = 
QSCALE(qmat, indp, in[(j << 6) + indp]);
 
  270     for (i = 0; i < 8; i++) {
 
  280     get(pixels, stride, 
block);
 
  286         int *qmat, 
int chroma)
 
  291     int i, blocks_per_slice;
 
  295     for (i = 0; i < mb_count; i++) {
 
  297         fdct_get(fdsp, src + 8 * src_stride, src_stride, 
block + ((2 - chroma) << 6));
 
  300             fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, 
block + (3 << 6));
 
  303         block += (256 >> chroma);
 
  304         src   += (32  >> chroma);
 
  307     blocks_per_slice = mb_count << (2 - chroma);
 
  319         int chroma_stride, 
unsigned mb_count, 
uint8_t *
buf, 
unsigned data_size,
 
  320         unsigned* y_data_size, 
unsigned* u_data_size, 
unsigned* v_data_size,
 
  326             buf, data_size, ctx->
qmat_luma[qp - 1], 0);
 
  330                 chroma_stride, buf + *y_data_size, data_size - *y_data_size,
 
  334                 chroma_stride, buf + *y_data_size + *u_data_size,
 
  335                 data_size - *y_data_size - *u_data_size,
 
  339     return *y_data_size + *u_data_size + *v_data_size;
 
  344         unsigned dst_width, 
unsigned dst_height)
 
  347     int box_width = 
FFMIN(width - x, dst_width);
 
  348     int box_height = 
FFMIN(height - y, dst_height);
 
  349     int i, j, src_stride = stride >> 1;
 
  350     uint16_t last_pix, *last_line;
 
  352     src += y * src_stride + x;
 
  353     for (i = 0; i < box_height; ++i) {
 
  354         for (j = 0; j < box_width; ++j) {
 
  357         last_pix = dst[j - 1];
 
  358         for (; j < dst_width; j++)
 
  363     last_line = dst - dst_width;
 
  364     for (; i < dst_height; i++) {
 
  365         for (j = 0; j < dst_width; ++j) {
 
  366             dst[j] = last_line[j];
 
  373         int mb_y, 
unsigned mb_count, 
uint8_t *
buf, 
unsigned data_size,
 
  376     int luma_stride, chroma_stride;
 
  377     int hdr_size = 6, slice_size;
 
  378     uint8_t *dest_y, *dest_u, *dest_v;
 
  379     unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0;
 
  382     int low_bytes  = (tgt_bits - (tgt_bits >> 3)) >> 3; 
 
  383     int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
 
  388     dest_y = pic->
data[0] + (mb_y << 4) * luma_stride   + (mb_x << 5);
 
  389     dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride + (mb_x << 4);
 
  390     dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride + (mb_x << 4);
 
  396                 (uint16_t *) ctx->
fill_y, mb_count << 4, 16);
 
  399                 (uint16_t *) ctx->
fill_u, mb_count << 3, 16);
 
  402                 (uint16_t *) ctx->
fill_v, mb_count << 3, 16);
 
  405                 mb_count << 5, mb_count << 4, mb_count, buf + hdr_size,
 
  406                 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
 
  410                 luma_stride, chroma_stride, mb_count, buf + hdr_size,
 
  411                 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
 
  418                         luma_stride, chroma_stride, mb_count, buf + hdr_size,
 
  419                         data_size - hdr_size, &y_data_size, &u_data_size,
 
  422         } 
else if (slice_size < low_bytes && *qp
 
  427                         luma_stride, chroma_stride, mb_count, buf + hdr_size,
 
  428                         data_size - hdr_size, &y_data_size, &u_data_size,
 
  434     buf[0] = hdr_size << 3;
 
  439     return hdr_size + y_data_size + u_data_size + v_data_size;
 
  445     int mb_width = (avctx->
width + 15) >> 4;
 
  446     int mb_height = (avctx->
height + 15) >> 4;
 
  447     int hdr_size, sl_size, i;
 
  448     int mb_y, sl_data_size, qp;
 
  449     int unsafe_bot, unsafe_right;
 
  450     uint8_t *sl_data, *sl_data_sizes;
 
  451     int slice_per_line = 0, rem = mb_width;
 
  454         slice_per_line += rem >> i;
 
  459     hdr_size = 8; sl_data_size = buf_size - hdr_size;
 
  460     sl_data_sizes = buf + hdr_size;
 
  461     sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
 
  462     for (mb_y = 0; mb_y < mb_height; mb_y++) {
 
  465         while (mb_x < mb_width) {
 
  466             while (mb_width - mb_x < slice_mb_count)
 
  467                 slice_mb_count >>= 1;
 
  469             unsafe_bot = (avctx->
height & 0xf) && (mb_y == mb_height - 1);
 
  470             unsafe_right = (avctx->
width & 0xf) && (mb_x + slice_mb_count == mb_width);
 
  472             sl_size = 
encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
 
  473                     sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp);
 
  475             bytestream_put_be16(&sl_data_sizes, sl_size);
 
  477             sl_data_size      -= sl_size;
 
  478             mb_x              += slice_mb_count;
 
  482     buf[0] = hdr_size << 3;
 
  483     AV_WB32(buf + 1, sl_data - buf);
 
  484     AV_WB16(buf + 5, slice_per_line * mb_height);
 
  487     return sl_data - 
buf;
 
  491                                const AVFrame *pict, 
int *got_packet)
 
  493     int header_size = 148;
 
  504             pkt->
size - header_size - 8);
 
  506     bytestream_put_be32(&buf, pic_size + 8 + header_size);
 
  509     bytestream_put_be16(&buf, header_size);
 
  510     bytestream_put_be16(&buf, 0);
 
  512     bytestream_put_be16(&buf, avctx->
width);
 
  513     bytestream_put_be16(&buf, avctx->
height);
 
  527     pkt->
size = pic_size + 8 + header_size;
 
  536     for (i = 0; i < 64; i++)
 
  537         dst[i] = src[i] * scale;
 
  551     if (avctx->
width & 0x1) {
 
  553                 "frame width needs to be multiple of 2\n");
 
  557     if (avctx->
width > 65534 || avctx->
height > 65535) {
 
  559                 "The maximum dimensions are 65534x65535\n");
 
  563     if ((avctx->
height & 0xf) || (avctx->
width & 0xf)) {
 
  574                 "encoding with ProRes standard (apcn) profile\n");
 
  581                 "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch]\n",
 
  590     for (i = 1; i <= 16; i++) {