40 #define DEFAULT_SLICE_MB_WIDTH 8
54 static const int bitrate_table[6] = { 1000, 2100, 3500, 5400, 7000, 10000};
64 4, 7, 9, 11, 13, 14, 15, 63,
65 7, 7, 11, 12, 14, 15, 63, 63,
66 9, 11, 13, 14, 15, 63, 63, 63,
67 11, 11, 13, 14, 63, 63, 63, 63,
68 11, 13, 14, 63, 63, 63, 63, 63,
69 13, 14, 63, 63, 63, 63, 63, 63,
70 13, 63, 63, 63, 63, 63, 63, 63,
71 63, 63, 63, 63, 63, 63, 63, 63
73 4, 5, 6, 7, 9, 11, 13, 15,
74 5, 5, 7, 8, 11, 13, 15, 17,
75 6, 7, 9, 11, 13, 15, 15, 17,
76 7, 7, 9, 11, 13, 15, 17, 19,
77 7, 9, 11, 13, 14, 16, 19, 23,
78 9, 11, 13, 14, 16, 19, 23, 29,
79 9, 11, 13, 15, 17, 21, 28, 35,
80 11, 13, 16, 17, 21, 28, 35, 41
82 4, 4, 5, 5, 6, 7, 7, 9,
83 4, 4, 5, 6, 7, 7, 9, 9,
84 5, 5, 6, 7, 7, 9, 9, 10,
85 5, 5, 6, 7, 7, 9, 9, 10,
86 5, 6, 7, 7, 8, 9, 10, 12,
87 6, 7, 7, 8, 9, 10, 12, 15,
88 6, 7, 7, 9, 10, 11, 14, 17,
89 7, 7, 9, 10, 11, 14, 17, 21
91 4, 4, 4, 4, 4, 4, 4, 4,
92 4, 4, 4, 4, 4, 4, 4, 4,
93 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 5,
95 4, 4, 4, 4, 4, 4, 5, 5,
96 4, 4, 4, 4, 4, 5, 5, 6,
97 4, 4, 4, 4, 5, 5, 6, 7,
98 4, 4, 4, 4, 5, 6, 7, 7
100 4, 4, 4, 4, 4, 4, 4, 4,
101 4, 4, 4, 4, 4, 4, 4, 4,
102 4, 4, 4, 4, 4, 4, 4, 4,
103 4, 4, 4, 4, 4, 4, 4, 5,
104 4, 4, 4, 4, 4, 4, 5, 5,
105 4, 4, 4, 4, 4, 5, 5, 6,
106 4, 4, 4, 4, 5, 5, 6, 7,
107 4, 4, 4, 4, 5, 6, 7, 7
109 2, 2, 2, 2, 2, 2, 2, 2,
110 2, 2, 2, 2, 2, 2, 2, 2,
111 2, 2, 2, 2, 2, 2, 2, 2,
112 2, 2, 2, 2, 2, 2, 2, 3,
113 2, 2, 2, 2, 2, 2, 3, 3,
114 2, 2, 2, 2, 2, 3, 3, 3,
115 2, 2, 2, 2, 3, 3, 3, 4,
116 2, 2, 2, 2, 3, 3, 4, 4,
122 4, 7, 9, 11, 13, 14, 63, 63,
123 7, 7, 11, 12, 14, 63, 63, 63,
124 9, 11, 13, 14, 63, 63, 63, 63,
125 11, 11, 13, 14, 63, 63, 63, 63,
126 11, 13, 14, 63, 63, 63, 63, 63,
127 13, 14, 63, 63, 63, 63, 63, 63,
128 13, 63, 63, 63, 63, 63, 63, 63,
129 63, 63, 63, 63, 63, 63, 63, 63
131 4, 5, 6, 7, 9, 11, 13, 15,
132 5, 5, 7, 8, 11, 13, 15, 17,
133 6, 7, 9, 11, 13, 15, 15, 17,
134 7, 7, 9, 11, 13, 15, 17, 19,
135 7, 9, 11, 13, 14, 16, 19, 23,
136 9, 11, 13, 14, 16, 19, 23, 29,
137 9, 11, 13, 15, 17, 21, 28, 35,
138 11, 13, 16, 17, 21, 28, 35, 41
140 4, 4, 5, 5, 6, 7, 7, 9,
141 4, 4, 5, 6, 7, 7, 9, 9,
142 5, 5, 6, 7, 7, 9, 9, 10,
143 5, 5, 6, 7, 7, 9, 9, 10,
144 5, 6, 7, 7, 8, 9, 10, 12,
145 6, 7, 7, 8, 9, 10, 12, 15,
146 6, 7, 7, 9, 10, 11, 14, 17,
147 7, 7, 9, 10, 11, 14, 17, 21
149 4, 4, 4, 4, 4, 4, 4, 4,
150 4, 4, 4, 4, 4, 4, 4, 4,
151 4, 4, 4, 4, 4, 4, 4, 4,
152 4, 4, 4, 4, 4, 4, 4, 5,
153 4, 4, 4, 4, 4, 4, 5, 5,
154 4, 4, 4, 4, 4, 5, 5, 6,
155 4, 4, 4, 4, 5, 5, 6, 7,
156 4, 4, 4, 4, 5, 6, 7, 7
158 4, 4, 4, 4, 4, 4, 4, 4,
159 4, 4, 4, 4, 4, 4, 4, 4,
160 4, 4, 4, 4, 4, 4, 4, 4,
161 4, 4, 4, 4, 4, 4, 4, 5,
162 4, 4, 4, 4, 4, 4, 5, 5,
163 4, 4, 4, 4, 4, 5, 5, 6,
164 4, 4, 4, 4, 5, 5, 6, 7,
165 4, 4, 4, 4, 5, 6, 7, 7
167 4, 4, 4, 4, 4, 4, 4, 4,
168 4, 4, 4, 4, 4, 4, 4, 4,
169 4, 4, 4, 4, 4, 4, 4, 4,
170 4, 4, 4, 4, 4, 4, 4, 5,
171 4, 4, 4, 4, 4, 4, 5, 5,
172 4, 4, 4, 4, 4, 5, 5, 6,
173 4, 4, 4, 4, 5, 5, 6, 7,
174 4, 4, 4, 4, 5, 6, 7, 7
187 int qmat_luma[16][64];
188 int qmat_chroma[16][64];
200 unsigned int rice_order, exp_order, switch_bits, first_exp,
exp, zeros;
203 switch_bits = codebook & 3;
204 rice_order = codebook >> 5;
205 exp_order = (codebook >> 2) & 7;
207 first_exp = ((switch_bits + 1) << rice_order);
209 if (
val >= first_exp) {
211 val += (1 << exp_order);
213 zeros =
exp - exp_order + switch_bits + 1;
216 }
else if (rice_order) {
226 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind]))
227 #define TO_GOLOMB(val) (((val) * 2) ^ ((val) >> 31))
228 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign))
229 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1)
230 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign))
234 int sign = (
val >> 31);
235 return (
val ^ sign) - sign;
238 #define FIRST_DC_CB 0xB8
243 int blocks_per_slice,
int *qmat)
247 int new_dc,
delta, diff_sign, new_code;
249 prev_dc =
QSCALE(qmat, 0,
in[0] - 16384);
253 code = 5; sign = 0; idx = 64;
254 for (
i = 1;
i < blocks_per_slice;
i++, idx += 64) {
255 new_dc =
QSCALE(qmat, 0,
in[idx] - 16384);
256 delta = new_dc - prev_dc;
269 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
271 0x28, 0x28, 0x28, 0x4C };
274 int16_t *
in,
int blocks_per_slice,
int *qmat,
const uint8_t ff_prores_scan[64])
280 for (
i = 1;
i < 64;
i++) {
281 int indp = ff_prores_scan[
i];
282 for (j = 0; j < blocks_per_slice; j++) {
308 for (
i = 0;
i < 8;
i++) {
330 for (
i = 0;
i < mb_count;
i++) {
339 }
else if (
chroma && is_422){
340 for (
i = 0;
i < mb_count;
i++) {
347 for (
i = 0;
i < mb_count;
i++) {
360 const uint8_t ff_prores_scan[64])
362 int blocks_per_slice;
365 blocks_per_slice = mb_count << (2 - sub_sample_chroma);
376 int16_t * blocks_y, int16_t * blocks_u, int16_t * blocks_v,
377 unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
378 unsigned* y_data_size,
unsigned* u_data_size,
unsigned* v_data_size,
384 buf, data_size,
ctx->qmat_luma[qp - 1], 0,
ctx->scantable);
388 ctx->qmat_chroma[qp - 1],
ctx->is_422,
ctx->scantable);
391 data_size - *y_data_size - *u_data_size,
392 ctx->qmat_chroma[qp - 1],
ctx->is_422,
ctx->scantable);
395 return *y_data_size + *u_data_size + *v_data_size;
400 const int abits = 16;
402 const int dsize = 1 << dbits - 1;
403 int diff = cur - prev;
406 if (
diff >= (1 << abits) - dsize)
408 if (diff < -dsize || diff > dsize || !
diff) {
432 unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
unsigned* a_data_size)
434 const int abits = 16;
435 const int mask = (1 << abits) - 1;
436 const int num_coeffs = mb_count * 256;
437 int prev =
mask, cur;
440 int16_t * blocks = (int16_t *)src_a;
457 }
while (idx < num_coeffs);
465 "Underestimated required buffer size.\n");
474 unsigned dst_width,
unsigned dst_height,
int is_alpha_plane,
475 int is_interlaced,
int is_top_field)
478 int i, j, src_stride, box_height;
479 uint16_t last_pix, *last_line;
481 if (!is_interlaced) {
483 src += y * src_stride + x;
487 src += y * src_stride + x;
493 for (
i = 0;
i < box_height; ++
i) {
494 for (j = 0; j < box_width; ++j) {
495 if (!is_alpha_plane) {
498 dst[j] =
src[j] << 6;
501 if (!is_alpha_plane) {
502 last_pix = dst[j - 1];
504 last_pix = dst[j - 1] << 6;
506 for (; j < dst_width; j++)
511 last_line = dst - dst_width;
512 for (;
i < dst_height;
i++) {
513 for (j = 0; j < dst_width; ++j) {
514 dst[j] = last_line[j];
522 unsigned dst_width,
unsigned dst_height,
int is_interlaced,
int is_top_field)
524 subimage_with_fill_template(
src, x, y,
stride,
width,
height, dst, dst_width, dst_height, 0, is_interlaced, is_top_field);
530 unsigned dst_width,
unsigned dst_height,
int is_interlaced,
int is_top_field)
532 subimage_with_fill_template(
src, x, y,
stride,
width,
height, dst, dst_width, dst_height, 1, is_interlaced, is_top_field);
536 int mb_y,
unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
537 int unsafe,
int *qp,
int is_interlaced,
int is_top_field)
539 int luma_stride, chroma_stride, alpha_stride = 0;
541 int hdr_size = 6 + (
ctx->need_alpha * 2);
542 int ret = 0, slice_size;
543 uint8_t *dest_y, *dest_u, *dest_v;
544 unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0, a_data_size = 0;
547 int low_bytes = (tgt_bits - (tgt_bits >> 3)) >> 3;
548 int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
560 if (!is_interlaced) {
561 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride + (mb_x << 5);
562 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride + (mb_x << (5 -
ctx->is_422));
563 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride + (mb_x << (5 -
ctx->is_422));
565 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride * 2 + (mb_x << 5);
566 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 -
ctx->is_422));
567 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 -
ctx->is_422));
569 dest_y += luma_stride;
570 dest_u += chroma_stride;
571 dest_v += chroma_stride;
578 (uint16_t *)
ctx->fill_y, mb_count << 4, 16, is_interlaced, is_top_field);
581 (uint16_t *)
ctx->fill_u, mb_count << (4 -
ctx->is_422), 16, is_interlaced, is_top_field);
584 (uint16_t *)
ctx->fill_v, mb_count << (4 -
ctx->is_422), 16, is_interlaced, is_top_field);
592 mb_count,
buf + hdr_size, data_size - hdr_size,
593 &y_data_size, &u_data_size, &v_data_size,
596 if (!is_interlaced) {
597 calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride, mb_count, 0, 0);
601 calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride * 2, mb_count, 0, 0);
602 calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride * 2, mb_count, 1,
ctx->is_422);
603 calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride * 2, mb_count, 1,
ctx->is_422);
607 mb_count,
buf + hdr_size, data_size - hdr_size,
608 &y_data_size, &u_data_size, &v_data_size,
615 mb_count,
buf + hdr_size, data_size - hdr_size,
616 &y_data_size, &u_data_size, &v_data_size,
619 }
else if (slice_size < low_bytes && *qp
624 mb_count,
buf + hdr_size, data_size - hdr_size,
625 &y_data_size, &u_data_size, &v_data_size,
631 buf[0] = hdr_size << 3;
636 if (
ctx->need_alpha) {
641 (uint16_t *)
ctx->fill_a, mb_count << 4, 16, is_interlaced, is_top_field);
643 buf + hdr_size + slice_size,
644 data_size - hdr_size - slice_size, &a_data_size);
650 return hdr_size + y_data_size + u_data_size + v_data_size + a_data_size;
654 uint8_t *
buf,
const int buf_size,
const int picture_index,
const int is_top_field)
657 int mb_width = (avctx->
width + 15) >> 4;
658 int hdr_size, sl_size,
i;
659 int mb_y, sl_data_size, qp, mb_height, picture_height, unsafe_mb_height_limit;
660 int unsafe_bot, unsafe_right;
661 uint8_t *sl_data, *sl_data_sizes;
662 int slice_per_line = 0, rem = mb_width;
664 if (!
ctx->is_interlaced) {
665 mb_height = (avctx->
height + 15) >> 4;
666 unsafe_mb_height_limit = mb_height;
669 picture_height = (avctx->
height + 1) / 2;
671 picture_height = avctx->
height / 2;
673 mb_height = (picture_height + 15) >> 4;
674 unsafe_mb_height_limit = mb_height;
678 slice_per_line += rem >>
i;
683 hdr_size = 8; sl_data_size = buf_size - hdr_size;
684 sl_data_sizes =
buf + hdr_size;
685 sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
686 for (mb_y = 0; mb_y < mb_height; mb_y++) {
689 while (mb_x < mb_width) {
690 while (mb_width - mb_x < slice_mb_count)
691 slice_mb_count >>= 1;
693 unsafe_bot = (avctx->
height & 0xf) && (mb_y == unsafe_mb_height_limit - 1);
694 unsafe_right = (avctx->
width & 0xf) && (mb_x + slice_mb_count == mb_width);
696 sl_size =
encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
697 sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp,
ctx->is_interlaced, is_top_field);
702 bytestream_put_be16(&sl_data_sizes, sl_size);
704 sl_data_size -= sl_size;
705 mb_x += slice_mb_count;
709 buf[0] = hdr_size << 3;
714 return sl_data -
buf;
718 const AVFrame *pict,
int *got_packet)
721 int header_size = 148;
723 int compress_frame_size, pic_size,
ret, is_top_field_first = 0;
732 compress_frame_size = 8 + header_size;
734 bytestream_put_be32(&
buf, compress_frame_size);
737 bytestream_put_be16(&
buf, header_size);
738 bytestream_put_be16(&
buf, 0);
740 bytestream_put_be16(&
buf, avctx->
width);
741 bytestream_put_be16(&
buf, avctx->
height);
745 if (
ctx->is_interlaced) {
749 is_top_field_first = 1;
757 *
buf++ = frame_flags;
779 pkt->
size - compress_frame_size, 0, is_top_field_first);
783 compress_frame_size += pic_size;
785 if (
ctx->is_interlaced) {
787 pkt->
size - compress_frame_size, 1, !is_top_field_first);
791 compress_frame_size += pic_size;
796 pkt->
size = compress_frame_size;
805 for (
i = 0;
i < 64;
i++)
806 dst[
i] =
src[
i] * scale;
817 if (
ctx->is_interlaced) {
823 if (avctx->
width & 0x1) {
825 "frame width needs to be multiple of 2\n");
829 if (avctx->
width > 65534 || avctx->
height > 65535) {
831 "The maximum dimensions are 65534x65535\n");
835 if (strlen(
ctx->vendor) != 4) {
844 "encoding with ProRes standard (apcn) profile\n");
848 "encoding with ProRes 4444 (ap4h) profile\n");
852 "encoding with ProRes 4444+ (ap4h) profile\n");
862 "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h, 5 - ap4x]\n",
867 "encoding with ProRes 444/Xq (ap4h/ap4x) profile, need YUV444P10 input\n");
872 "encoding with ProRes Proxy/LT/422/422 HQ (apco, apcs, apcn, ap4h) profile, need YUV422P10 input\n");
906 for (
i = 1;
i <= 16;
i++) {
923 #define OFFSET(x) offsetof(ProresContext, x)
924 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM