36 #define DEFAULT_SLICE_MB_WIDTH 8
38 #define FF_PROFILE_PRORES_PROXY 0
39 #define FF_PROFILE_PRORES_LT 1
40 #define FF_PROFILE_PRORES_STANDARD 2
41 #define FF_PROFILE_PRORES_HQ 3
56 0, 1, 8, 9, 2, 3, 10, 11,
57 16, 17, 24, 25, 18, 19, 26, 27,
58 4, 5, 12, 20, 13, 6, 7, 14,
59 21, 28, 29, 22, 15, 23, 30, 31,
60 32, 33, 40, 48, 41, 34, 35, 42,
61 49, 56, 57, 50, 43, 36, 37, 44,
62 51, 58, 59, 52, 45, 38, 39, 46,
63 53, 60, 61, 54, 47, 55, 62, 63
68 4, 7, 9, 11, 13, 14, 15, 63,
69 7, 7, 11, 12, 14, 15, 63, 63,
70 9, 11, 13, 14, 15, 63, 63, 63,
71 11, 11, 13, 14, 63, 63, 63, 63,
72 11, 13, 14, 63, 63, 63, 63, 63,
73 13, 14, 63, 63, 63, 63, 63, 63,
74 13, 63, 63, 63, 63, 63, 63, 63,
75 63, 63, 63, 63, 63, 63, 63, 63
77 4, 5, 6, 7, 9, 11, 13, 15,
78 5, 5, 7, 8, 11, 13, 15, 17,
79 6, 7, 9, 11, 13, 15, 15, 17,
80 7, 7, 9, 11, 13, 15, 17, 19,
81 7, 9, 11, 13, 14, 16, 19, 23,
82 9, 11, 13, 14, 16, 19, 23, 29,
83 9, 11, 13, 15, 17, 21, 28, 35,
84 11, 13, 16, 17, 21, 28, 35, 41
86 4, 4, 5, 5, 6, 7, 7, 9,
87 4, 4, 5, 6, 7, 7, 9, 9,
88 5, 5, 6, 7, 7, 9, 9, 10,
89 5, 5, 6, 7, 7, 9, 9, 10,
90 5, 6, 7, 7, 8, 9, 10, 12,
91 6, 7, 7, 8, 9, 10, 12, 15,
92 6, 7, 7, 9, 10, 11, 14, 17,
93 7, 7, 9, 10, 11, 14, 17, 21
95 4, 4, 4, 4, 4, 4, 4, 4,
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, 5,
99 4, 4, 4, 4, 4, 4, 5, 5,
100 4, 4, 4, 4, 4, 5, 5, 6,
101 4, 4, 4, 4, 5, 5, 6, 7,
102 4, 4, 4, 4, 5, 6, 7, 7
108 4, 7, 9, 11, 13, 14, 63, 63,
109 7, 7, 11, 12, 14, 63, 63, 63,
110 9, 11, 13, 14, 63, 63, 63, 63,
111 11, 11, 13, 14, 63, 63, 63, 63,
112 11, 13, 14, 63, 63, 63, 63, 63,
113 13, 14, 63, 63, 63, 63, 63, 63,
114 13, 63, 63, 63, 63, 63, 63, 63,
115 63, 63, 63, 63, 63, 63, 63, 63
117 4, 5, 6, 7, 9, 11, 13, 15,
118 5, 5, 7, 8, 11, 13, 15, 17,
119 6, 7, 9, 11, 13, 15, 15, 17,
120 7, 7, 9, 11, 13, 15, 17, 19,
121 7, 9, 11, 13, 14, 16, 19, 23,
122 9, 11, 13, 14, 16, 19, 23, 29,
123 9, 11, 13, 15, 17, 21, 28, 35,
124 11, 13, 16, 17, 21, 28, 35, 41
126 4, 4, 5, 5, 6, 7, 7, 9,
127 4, 4, 5, 6, 7, 7, 9, 9,
128 5, 5, 6, 7, 7, 9, 9, 10,
129 5, 5, 6, 7, 7, 9, 9, 10,
130 5, 6, 7, 7, 8, 9, 10, 12,
131 6, 7, 7, 8, 9, 10, 12, 15,
132 6, 7, 7, 9, 10, 11, 14, 17,
133 7, 7, 9, 10, 11, 14, 17, 21
135 4, 4, 4, 4, 4, 4, 4, 4,
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, 5,
139 4, 4, 4, 4, 4, 4, 5, 5,
140 4, 4, 4, 4, 4, 5, 5, 6,
141 4, 4, 4, 4, 5, 5, 6, 7,
142 4, 4, 4, 4, 5, 6, 7, 7
153 int qmat_luma[16][64];
154 int qmat_chroma[16][64];
159 unsigned int rice_order, exp_order, switch_bits, first_exp, exp, zeros,
163 switch_bits = codebook & 3;
164 rice_order = codebook >> 5;
165 exp_order = (codebook >> 2) & 7;
167 first_exp = ((switch_bits + 1) << rice_order);
169 if (val >= first_exp) {
171 val += (1 << exp_order);
173 zeros = exp - exp_order + switch_bits + 1;
176 }
else if (rice_order) {
177 mask = (1 << rice_order) - 1;
178 put_bits(pb, (val >> rice_order), 0);
180 put_bits(pb, rice_order, val & mask);
187 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind]))
188 #define TO_GOLOMB(val) (((val) << 1) ^ ((val) >> 31))
189 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign))
190 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1)
191 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign))
195 int sign = (val >> 31);
196 return (val ^ sign) - sign;
199 #define FIRST_DC_CB 0xB8
204 int blocks_per_slice,
int *qmat)
208 int new_dc,
delta, diff_sign, new_code;
210 prev_dc =
QSCALE(qmat, 0, in[0] - 16384);
214 code = 5; sign = 0; idx = 64;
215 for (i = 1; i < blocks_per_slice; i++, idx += 64) {
216 new_dc =
QSCALE(qmat, 0, in[idx] - 16384);
217 delta = new_dc - prev_dc;
230 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
232 0x28, 0x28, 0x28, 0x4C };
235 int16_t *
in,
int blocks_per_slice,
int *qmat)
241 for (i = 1; i < 64; i++) {
243 for (j = 0; j < blocks_per_slice; j++) {
244 int val =
QSCALE(qmat, indp, in[(j << 6) + indp]);
269 for (i = 0; i < 8; i++) {
279 get(pixels, stride,
block);
285 int *qmat,
int chroma)
290 int i, blocks_per_slice;
294 for (i = 0; i < mb_count; i++) {
296 fdct_get(fdsp, src + 8 * src_stride, src_stride,
block + ((2 - chroma) << 6));
299 fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride,
block + (3 << 6));
302 block += (256 >> chroma);
303 src += (32 >> chroma);
306 blocks_per_slice = mb_count << (2 - chroma);
318 int chroma_stride,
unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
319 unsigned* y_data_size,
unsigned* u_data_size,
unsigned* v_data_size,
325 buf, data_size, ctx->
qmat_luma[qp - 1], 0);
329 chroma_stride, buf + *y_data_size, data_size - *y_data_size,
333 chroma_stride, buf + *y_data_size + *u_data_size,
334 data_size - *y_data_size - *u_data_size,
338 return *y_data_size + *u_data_size + *v_data_size;
343 unsigned dst_width,
unsigned dst_height)
346 int box_width =
FFMIN(width - x, dst_width);
347 int box_height =
FFMIN(height - y, dst_height);
348 int i, j, src_stride = stride >> 1;
349 uint16_t last_pix, *last_line;
351 src += y * src_stride + x;
352 for (i = 0; i < box_height; ++i) {
353 for (j = 0; j < box_width; ++j) {
356 last_pix = dst[j - 1];
357 for (; j < dst_width; j++)
362 last_line = dst - dst_width;
363 for (; i < dst_height; i++) {
364 for (j = 0; j < dst_width; ++j) {
365 dst[j] = last_line[j];
372 int mb_y,
unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
375 int luma_stride, chroma_stride;
376 int hdr_size = 6, slice_size;
377 uint8_t *dest_y, *dest_u, *dest_v;
378 unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0;
381 int low_bytes = (tgt_bits - (tgt_bits >> 3)) >> 3;
382 int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
387 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride + (mb_x << 5);
388 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride + (mb_x << 4);
389 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride + (mb_x << 4);
395 (uint16_t *) ctx->
fill_y, mb_count << 4, 16);
398 (uint16_t *) ctx->
fill_u, mb_count << 3, 16);
401 (uint16_t *) ctx->
fill_v, mb_count << 3, 16);
404 mb_count << 5, mb_count << 4, mb_count, buf + hdr_size,
405 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
409 luma_stride, chroma_stride, mb_count, buf + hdr_size,
410 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
417 luma_stride, chroma_stride, mb_count, buf + hdr_size,
418 data_size - hdr_size, &y_data_size, &u_data_size,
421 }
else if (slice_size < low_bytes && *qp
426 luma_stride, chroma_stride, mb_count, buf + hdr_size,
427 data_size - hdr_size, &y_data_size, &u_data_size,
433 buf[0] = hdr_size << 3;
438 return hdr_size + y_data_size + u_data_size + v_data_size;
444 int mb_width = (avctx->
width + 15) >> 4;
445 int mb_height = (avctx->
height + 15) >> 4;
446 int hdr_size, sl_size, i;
447 int mb_y, sl_data_size, qp;
448 int unsafe_bot, unsafe_right;
449 uint8_t *sl_data, *sl_data_sizes;
450 int slice_per_line = 0, rem = mb_width;
453 slice_per_line += rem >> i;
458 hdr_size = 8; sl_data_size = buf_size - hdr_size;
459 sl_data_sizes = buf + hdr_size;
460 sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
461 for (mb_y = 0; mb_y < mb_height; mb_y++) {
464 while (mb_x < mb_width) {
465 while (mb_width - mb_x < slice_mb_count)
466 slice_mb_count >>= 1;
468 unsafe_bot = (avctx->
height & 0xf) && (mb_y == mb_height - 1);
469 unsafe_right = (avctx->
width & 0xf) && (mb_x + slice_mb_count == mb_width);
471 sl_size =
encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
472 sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp);
474 bytestream_put_be16(&sl_data_sizes, sl_size);
476 sl_data_size -= sl_size;
477 mb_x += slice_mb_count;
481 buf[0] = hdr_size << 3;
482 AV_WB32(buf + 1, sl_data - buf);
483 AV_WB16(buf + 5, slice_per_line * mb_height);
486 return sl_data -
buf;
490 const AVFrame *pict,
int *got_packet)
492 int header_size = 148;
503 pkt->
size - header_size - 8);
505 bytestream_put_be32(&buf, pic_size + 8 + header_size);
508 bytestream_put_be16(&buf, header_size);
509 bytestream_put_be16(&buf, 0);
511 bytestream_put_be16(&buf, avctx->
width);
512 bytestream_put_be16(&buf, avctx->
height);
526 pkt->
size = pic_size + 8 + header_size;
535 for (i = 0; i < 64; i++)
536 dst[i] = src[i] * scale;
550 if (avctx->
width & 0x1) {
552 "frame width needs to be multiple of 2\n");
556 if (avctx->
width > 65534 || avctx->
height > 65535) {
558 "The maximum dimensions are 65534x65535\n");
562 if ((avctx->
height & 0xf) || (avctx->
width & 0xf)) {
573 "encoding with ProRes standard (apcn) profile\n");
580 "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch]\n",
589 for (i = 1; i <= 16; i++) {