41 #define DEFAULT_SLICE_MB_WIDTH 8
55 static const int bitrate_table[] = { 1000, 2100, 3500, 5400, 7000, 10000};
66 4, 7, 9, 11, 13, 14, 15, 63,
67 7, 7, 11, 12, 14, 15, 63, 63,
68 9, 11, 13, 14, 15, 63, 63, 63,
69 11, 11, 13, 14, 63, 63, 63, 63,
70 11, 13, 14, 63, 63, 63, 63, 63,
71 13, 14, 63, 63, 63, 63, 63, 63,
72 13, 63, 63, 63, 63, 63, 63, 63,
73 63, 63, 63, 63, 63, 63, 63, 63
75 4, 5, 6, 7, 9, 11, 13, 15,
76 5, 5, 7, 8, 11, 13, 15, 17,
77 6, 7, 9, 11, 13, 15, 15, 17,
78 7, 7, 9, 11, 13, 15, 17, 19,
79 7, 9, 11, 13, 14, 16, 19, 23,
80 9, 11, 13, 14, 16, 19, 23, 29,
81 9, 11, 13, 15, 17, 21, 28, 35,
82 11, 13, 16, 17, 21, 28, 35, 41
84 4, 4, 5, 5, 6, 7, 7, 9,
85 4, 4, 5, 6, 7, 7, 9, 9,
86 5, 5, 6, 7, 7, 9, 9, 10,
87 5, 5, 6, 7, 7, 9, 9, 10,
88 5, 6, 7, 7, 8, 9, 10, 12,
89 6, 7, 7, 8, 9, 10, 12, 15,
90 6, 7, 7, 9, 10, 11, 14, 17,
91 7, 7, 9, 10, 11, 14, 17, 21
93 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 4,
95 4, 4, 4, 4, 4, 4, 4, 4,
96 4, 4, 4, 4, 4, 4, 4, 5,
97 4, 4, 4, 4, 4, 4, 5, 5,
98 4, 4, 4, 4, 4, 5, 5, 6,
99 4, 4, 4, 4, 5, 5, 6, 7,
100 4, 4, 4, 4, 5, 6, 7, 7
102 4, 4, 4, 4, 4, 4, 4, 4,
103 4, 4, 4, 4, 4, 4, 4, 4,
104 4, 4, 4, 4, 4, 4, 4, 4,
105 4, 4, 4, 4, 4, 4, 4, 5,
106 4, 4, 4, 4, 4, 4, 5, 5,
107 4, 4, 4, 4, 4, 5, 5, 6,
108 4, 4, 4, 4, 5, 5, 6, 7,
109 4, 4, 4, 4, 5, 6, 7, 7
111 2, 2, 2, 2, 2, 2, 2, 2,
112 2, 2, 2, 2, 2, 2, 2, 2,
113 2, 2, 2, 2, 2, 2, 2, 2,
114 2, 2, 2, 2, 2, 2, 2, 3,
115 2, 2, 2, 2, 2, 2, 3, 3,
116 2, 2, 2, 2, 2, 3, 3, 3,
117 2, 2, 2, 2, 3, 3, 3, 4,
118 2, 2, 2, 2, 3, 3, 4, 4,
124 4, 7, 9, 11, 13, 14, 63, 63,
125 7, 7, 11, 12, 14, 63, 63, 63,
126 9, 11, 13, 14, 63, 63, 63, 63,
127 11, 11, 13, 14, 63, 63, 63, 63,
128 11, 13, 14, 63, 63, 63, 63, 63,
129 13, 14, 63, 63, 63, 63, 63, 63,
130 13, 63, 63, 63, 63, 63, 63, 63,
131 63, 63, 63, 63, 63, 63, 63, 63
133 4, 5, 6, 7, 9, 11, 13, 15,
134 5, 5, 7, 8, 11, 13, 15, 17,
135 6, 7, 9, 11, 13, 15, 15, 17,
136 7, 7, 9, 11, 13, 15, 17, 19,
137 7, 9, 11, 13, 14, 16, 19, 23,
138 9, 11, 13, 14, 16, 19, 23, 29,
139 9, 11, 13, 15, 17, 21, 28, 35,
140 11, 13, 16, 17, 21, 28, 35, 41
142 4, 4, 5, 5, 6, 7, 7, 9,
143 4, 4, 5, 6, 7, 7, 9, 9,
144 5, 5, 6, 7, 7, 9, 9, 10,
145 5, 5, 6, 7, 7, 9, 9, 10,
146 5, 6, 7, 7, 8, 9, 10, 12,
147 6, 7, 7, 8, 9, 10, 12, 15,
148 6, 7, 7, 9, 10, 11, 14, 17,
149 7, 7, 9, 10, 11, 14, 17, 21
151 4, 4, 4, 4, 4, 4, 4, 4,
152 4, 4, 4, 4, 4, 4, 4, 4,
153 4, 4, 4, 4, 4, 4, 4, 4,
154 4, 4, 4, 4, 4, 4, 4, 5,
155 4, 4, 4, 4, 4, 4, 5, 5,
156 4, 4, 4, 4, 4, 5, 5, 6,
157 4, 4, 4, 4, 5, 5, 6, 7,
158 4, 4, 4, 4, 5, 6, 7, 7
160 4, 4, 4, 4, 4, 4, 4, 4,
161 4, 4, 4, 4, 4, 4, 4, 4,
162 4, 4, 4, 4, 4, 4, 4, 4,
163 4, 4, 4, 4, 4, 4, 4, 5,
164 4, 4, 4, 4, 4, 4, 5, 5,
165 4, 4, 4, 4, 4, 5, 5, 6,
166 4, 4, 4, 4, 5, 5, 6, 7,
167 4, 4, 4, 4, 5, 6, 7, 7
169 4, 4, 4, 4, 4, 4, 4, 4,
170 4, 4, 4, 4, 4, 4, 4, 4,
171 4, 4, 4, 4, 4, 4, 4, 4,
172 4, 4, 4, 4, 4, 4, 4, 5,
173 4, 4, 4, 4, 4, 4, 5, 5,
174 4, 4, 4, 4, 4, 5, 5, 6,
175 4, 4, 4, 4, 5, 5, 6, 7,
176 4, 4, 4, 4, 5, 6, 7, 7
189 int qmat_luma[16][64];
190 int qmat_chroma[16][64];
202 unsigned int rice_order, exp_order, switch_bits, first_exp,
exp, zeros;
209 first_exp = ((switch_bits + 1) << rice_order);
211 if (
val >= first_exp) {
213 val += (1 << exp_order);
215 zeros =
exp - exp_order + switch_bits + 1;
218 }
else if (rice_order) {
228 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind]))
229 #define TO_GOLOMB(val) (((val) * 2) ^ ((val) >> 31))
230 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign))
231 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1)
232 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign))
236 int sign = (
val >> 31);
237 return (
val ^ sign) - sign;
240 #define FIRST_DC_CB 0xB8
245 int blocks_per_slice,
int *qmat)
249 int new_dc,
delta, diff_sign, new_code;
251 prev_dc =
QSCALE(qmat, 0,
in[0] - 16384);
255 code = 5; sign = 0; idx = 64;
256 for (
i = 1;
i < blocks_per_slice;
i++, idx += 64) {
257 new_dc =
QSCALE(qmat, 0,
in[idx] - 16384);
258 delta = new_dc - prev_dc;
271 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
273 0x28, 0x28, 0x28, 0x4C };
276 int16_t *
in,
int blocks_per_slice,
int *qmat,
const uint8_t ff_prores_scan[64])
282 for (
i = 1;
i < 64;
i++) {
283 int indp = ff_prores_scan[
i];
284 for (j = 0; j < blocks_per_slice; j++) {
310 for (
i = 0;
i < 8;
i++) {
332 for (
i = 0;
i < mb_count;
i++) {
341 }
else if (
chroma && is_422){
342 for (
i = 0;
i < mb_count;
i++) {
349 for (
i = 0;
i < mb_count;
i++) {
362 const uint8_t ff_prores_scan[64])
364 int blocks_per_slice;
367 blocks_per_slice = mb_count << (2 - sub_sample_chroma);
378 int16_t * blocks_y, int16_t * blocks_u, int16_t * blocks_v,
379 unsigned mb_count,
uint8_t *buf,
unsigned data_size,
380 unsigned* y_data_size,
unsigned* u_data_size,
unsigned* v_data_size,
386 buf, data_size,
ctx->qmat_luma[qp - 1], 0,
ctx->scantable);
389 *u_data_size =
encode_slice_plane(blocks_u, mb_count, buf + *y_data_size, data_size - *y_data_size,
390 ctx->qmat_chroma[qp - 1],
ctx->is_422,
ctx->scantable);
392 *v_data_size =
encode_slice_plane(blocks_v, mb_count, buf + *y_data_size + *u_data_size,
393 data_size - *y_data_size - *u_data_size,
394 ctx->qmat_chroma[qp - 1],
ctx->is_422,
ctx->scantable);
397 return *y_data_size + *u_data_size + *v_data_size;
402 const int abits = 16;
404 const int dsize = 1 << dbits - 1;
405 int diff = cur - prev;
408 if (
diff >= (1 << abits) - dsize)
410 if (diff < -dsize || diff > dsize || !
diff) {
434 unsigned mb_count,
uint8_t *buf,
unsigned data_size,
unsigned* a_data_size)
436 const int abits = 16;
437 const int mask = (1 << abits) - 1;
438 const int num_coeffs = mb_count * 256;
439 int prev =
mask, cur;
442 int16_t * blocks = (int16_t *)src_a;
459 }
while (idx < num_coeffs);
467 "Underestimated required buffer size.\n");
476 unsigned dst_width,
unsigned dst_height,
int is_alpha_plane,
477 int is_interlaced,
int is_top_field)
480 int i, j, src_stride, box_height;
481 uint16_t last_pix, *last_line;
483 if (!is_interlaced) {
485 src += y * src_stride + x;
489 src += y * src_stride + x;
495 for (
i = 0;
i < box_height; ++
i) {
496 for (j = 0; j < box_width; ++j) {
497 if (!is_alpha_plane) {
500 dst[j] =
src[j] << 6;
503 if (!is_alpha_plane) {
504 last_pix = dst[j - 1];
506 last_pix = dst[j - 1] << 6;
508 for (; j < dst_width; j++)
513 last_line = dst - dst_width;
514 for (;
i < dst_height;
i++) {
515 for (j = 0; j < dst_width; ++j) {
516 dst[j] = last_line[j];
524 unsigned dst_width,
unsigned dst_height,
int is_interlaced,
int is_top_field)
526 subimage_with_fill_template(
src, x, y,
stride,
width,
height, dst, dst_width, dst_height, 0, is_interlaced, is_top_field);
532 unsigned dst_width,
unsigned dst_height,
int is_interlaced,
int is_top_field)
534 subimage_with_fill_template(
src, x, y,
stride,
width,
height, dst, dst_width, dst_height, 1, is_interlaced, is_top_field);
538 int mb_y,
unsigned mb_count,
uint8_t *buf,
unsigned data_size,
539 int unsafe,
int *qp,
int is_interlaced,
int is_top_field)
541 int luma_stride, chroma_stride, alpha_stride = 0;
543 int hdr_size = 6 + (
ctx->need_alpha * 2);
544 int ret = 0, slice_size;
545 uint8_t *dest_y, *dest_u, *dest_v;
546 unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0, a_data_size = 0;
549 int low_bytes = (tgt_bits - (tgt_bits >> 3)) >> 3;
550 int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
562 if (!is_interlaced) {
563 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride + (mb_x << 5);
564 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride + (mb_x << (5 -
ctx->is_422));
565 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride + (mb_x << (5 -
ctx->is_422));
567 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride * 2 + (mb_x << 5);
568 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 -
ctx->is_422));
569 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 -
ctx->is_422));
571 dest_y += luma_stride;
572 dest_u += chroma_stride;
573 dest_v += chroma_stride;
580 (uint16_t *)
ctx->fill_y, mb_count << 4, 16, is_interlaced, is_top_field);
583 (uint16_t *)
ctx->fill_u, mb_count << (4 -
ctx->is_422), 16, is_interlaced, is_top_field);
586 (uint16_t *)
ctx->fill_v, mb_count << (4 -
ctx->is_422), 16, is_interlaced, is_top_field);
594 mb_count, buf + hdr_size, data_size - hdr_size,
595 &y_data_size, &u_data_size, &v_data_size,
598 if (!is_interlaced) {
599 calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride, mb_count, 0, 0);
603 calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride * 2, mb_count, 0, 0);
604 calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride * 2, mb_count, 1,
ctx->is_422);
605 calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride * 2, mb_count, 1,
ctx->is_422);
609 mb_count, buf + hdr_size, data_size - hdr_size,
610 &y_data_size, &u_data_size, &v_data_size,
617 mb_count, buf + hdr_size, data_size - hdr_size,
618 &y_data_size, &u_data_size, &v_data_size,
621 }
else if (slice_size < low_bytes && *qp
626 mb_count, buf + hdr_size, data_size - hdr_size,
627 &y_data_size, &u_data_size, &v_data_size,
633 buf[0] = hdr_size << 3;
638 if (
ctx->need_alpha) {
643 (uint16_t *)
ctx->fill_a, mb_count << 4, 16, is_interlaced, is_top_field);
645 buf + hdr_size + slice_size,
646 data_size - hdr_size - slice_size, &a_data_size);
652 return hdr_size + y_data_size + u_data_size + v_data_size + a_data_size;
656 uint8_t *buf,
const int buf_size,
const int picture_index,
const int is_top_field)
659 int mb_width = (avctx->
width + 15) >> 4;
660 int hdr_size, sl_size,
i;
661 int mb_y, sl_data_size, qp, mb_height, picture_height, unsafe_mb_height_limit;
662 int unsafe_bot, unsafe_right;
663 uint8_t *sl_data, *sl_data_sizes;
664 int slice_per_line = 0, rem = mb_width;
666 if (!
ctx->is_interlaced) {
667 mb_height = (avctx->
height + 15) >> 4;
668 unsafe_mb_height_limit = mb_height;
671 picture_height = (avctx->
height + 1) / 2;
673 picture_height = avctx->
height / 2;
675 mb_height = (picture_height + 15) >> 4;
676 unsafe_mb_height_limit = mb_height;
680 slice_per_line += rem >>
i;
685 hdr_size = 8; sl_data_size = buf_size - hdr_size;
686 sl_data_sizes = buf + hdr_size;
687 sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
688 for (mb_y = 0; mb_y < mb_height; mb_y++) {
691 while (mb_x < mb_width) {
692 while (mb_width - mb_x < slice_mb_count)
693 slice_mb_count >>= 1;
695 unsafe_bot = (avctx->
height & 0xf) && (mb_y == unsafe_mb_height_limit - 1);
696 unsafe_right = (avctx->
width & 0xf) && (mb_x + slice_mb_count == mb_width);
698 sl_size =
encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
699 sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp,
ctx->is_interlaced, is_top_field);
704 bytestream_put_be16(&sl_data_sizes, sl_size);
706 sl_data_size -= sl_size;
707 mb_x += slice_mb_count;
711 buf[0] = hdr_size << 3;
712 AV_WB32(buf + 1, sl_data - buf);
713 AV_WB16(buf + 5, slice_per_line * mb_height);
716 return sl_data - buf;
720 const AVFrame *pict,
int *got_packet)
723 int header_size = 148;
725 int compress_frame_size, pic_size,
ret, is_top_field_first = 0;
734 compress_frame_size = 8 + header_size;
736 bytestream_put_be32(&buf, compress_frame_size);
739 bytestream_put_be16(&buf, header_size);
740 bytestream_put_be16(&buf, 0);
742 bytestream_put_be16(&buf, avctx->
width);
743 bytestream_put_be16(&buf, avctx->
height);
747 if (
ctx->is_interlaced) {
751 is_top_field_first = 1;
759 *buf++ = frame_flags;
781 pkt->
size - compress_frame_size, 0, is_top_field_first);
785 compress_frame_size += pic_size;
787 if (
ctx->is_interlaced) {
789 pkt->
size - compress_frame_size, 1, !is_top_field_first);
793 compress_frame_size += pic_size;
798 pkt->
size = compress_frame_size;
807 for (
i = 0;
i < 64;
i++)
808 dst[
i] =
src[
i] * scale;
819 if (
ctx->is_interlaced) {
825 if (avctx->
width & 0x1) {
827 "frame width needs to be multiple of 2\n");
831 if (avctx->
width > 65534 || avctx->
height > 65535) {
833 "The maximum dimensions are 65534x65535\n");
837 if (strlen(
ctx->vendor) != 4) {
846 "encoding with ProRes standard (apcn) profile\n");
850 "encoding with ProRes 4444 (ap4h) profile\n");
854 "encoding with ProRes 4444+ (ap4h) profile\n");
864 "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h, 5 - ap4x]\n",
869 "encoding with ProRes 444/Xq (ap4h/ap4x) profile, need YUV444P10 input\n");
874 "encoding with ProRes Proxy/LT/422/422 HQ (apco, apcs, apcn, ap4h) profile, need YUV422P10 input\n");
908 for (
i = 1;
i <= 16;
i++) {
925 #define OFFSET(x) offsetof(ProresContext, x)
926 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM