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++) {