4 * Copyright (c) 2012 Konstantin Shishkov
6 * This encoder appears to be based on Anatoliy Wassermans considering
7 * similarities in the bugs.
9 * This file is part of Libav.
11 * Libav is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * Libav is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with Libav; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/opt.h"
29 #include "bytestream.h"
31 #include "proresdsp.h"
32 #include "proresdata.h"
34 #define CFACTOR_Y422 2
35 #define CFACTOR_Y444 3
37 #define MAX_MBS_PER_SLICE 8
39 #define MAX_PLANES 3 // should be increased to 4 when there's PIX_FMT_YUV444AP10
42 PRORES_PROFILE_PROXY = 0,
44 PRORES_PROFILE_STANDARD,
56 static const uint8_t prores_quant_matrices[][64] = {
58 4, 7, 9, 11, 13, 14, 15, 63,
59 7, 7, 11, 12, 14, 15, 63, 63,
60 9, 11, 13, 14, 15, 63, 63, 63,
61 11, 11, 13, 14, 63, 63, 63, 63,
62 11, 13, 14, 63, 63, 63, 63, 63,
63 13, 14, 63, 63, 63, 63, 63, 63,
64 13, 63, 63, 63, 63, 63, 63, 63,
65 63, 63, 63, 63, 63, 63, 63, 63,
68 4, 5, 6, 7, 9, 11, 13, 15,
69 5, 5, 7, 8, 11, 13, 15, 17,
70 6, 7, 9, 11, 13, 15, 15, 17,
71 7, 7, 9, 11, 13, 15, 17, 19,
72 7, 9, 11, 13, 14, 16, 19, 23,
73 9, 11, 13, 14, 16, 19, 23, 29,
74 9, 11, 13, 15, 17, 21, 28, 35,
75 11, 13, 16, 17, 21, 28, 35, 41,
78 4, 4, 5, 5, 6, 7, 7, 9,
79 4, 4, 5, 6, 7, 7, 9, 9,
80 5, 5, 6, 7, 7, 9, 9, 10,
81 5, 5, 6, 7, 7, 9, 9, 10,
82 5, 6, 7, 7, 8, 9, 10, 12,
83 6, 7, 7, 8, 9, 10, 12, 15,
84 6, 7, 7, 9, 10, 11, 14, 17,
85 7, 7, 9, 10, 11, 14, 17, 21,
88 4, 4, 4, 4, 4, 4, 4, 4,
89 4, 4, 4, 4, 4, 4, 4, 4,
90 4, 4, 4, 4, 4, 4, 4, 4,
91 4, 4, 4, 4, 4, 4, 4, 5,
92 4, 4, 4, 4, 4, 4, 5, 5,
93 4, 4, 4, 4, 4, 5, 5, 6,
94 4, 4, 4, 4, 5, 5, 6, 7,
95 4, 4, 4, 4, 5, 6, 7, 7,
98 4, 4, 4, 4, 4, 4, 4, 4,
99 4, 4, 4, 4, 4, 4, 4, 4,
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, 4,
104 4, 4, 4, 4, 4, 4, 4, 4,
105 4, 4, 4, 4, 4, 4, 4, 4,
109 #define NUM_MB_LIMITS 4
110 static const int prores_mb_limits[NUM_MB_LIMITS] = {
111 1620, // up to 720x576
112 2700, // up to 960x720
113 6075, // up to 1440x1080
114 9216, // up to 2048x1152
117 static const struct prores_profile {
118 const char *full_name;
122 int br_tab[NUM_MB_LIMITS];
124 } prores_profile_info[4] = {
126 .full_name = "proxy",
127 .tag = MKTAG('a', 'p', 'c', 'o'),
130 .br_tab = { 300, 242, 220, 194 },
131 .quant = QUANT_MAT_PROXY,
135 .tag = MKTAG('a', 'p', 'c', 's'),
138 .br_tab = { 720, 560, 490, 440 },
139 .quant = QUANT_MAT_LT,
142 .full_name = "standard",
143 .tag = MKTAG('a', 'p', 'c', 'n'),
146 .br_tab = { 1050, 808, 710, 632 },
147 .quant = QUANT_MAT_STANDARD,
150 .full_name = "high quality",
151 .tag = MKTAG('a', 'p', 'c', 'h'),
154 .br_tab = { 1566, 1216, 1070, 950 },
155 .quant = QUANT_MAT_HQ,
157 // for 4444 profile bitrate numbers are { 2350, 1828, 1600, 1425 }
160 #define TRELLIS_WIDTH 16
161 #define SCORE_LIMIT INT_MAX / 2
170 #define MAX_STORED_Q 16
172 typedef struct ProresContext {
174 DECLARE_ALIGNED(16, DCTELEM, blocks)[MAX_PLANES][64 * 4 * MAX_MBS_PER_SLICE];
175 DECLARE_ALIGNED(16, uint16_t, emu_buf)[16*16];
176 int16_t quants[MAX_STORED_Q][64];
177 int16_t custom_q[64];
178 const uint8_t *quant_mat;
180 ProresDSPContext dsp;
183 int mb_width, mb_height;
185 int num_chroma_blocks, chroma_factor;
198 const struct prores_profile *profile_info;
200 struct TrellisNode *nodes;
204 static void get_slice_data(ProresContext *ctx, const uint16_t *src,
205 int linesize, int x, int y, int w, int h,
207 int mbs_per_slice, int blocks_per_mb, int is_chroma)
209 const uint16_t *esrc;
210 const int mb_width = 4 * blocks_per_mb;
214 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
216 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
220 if (x + mb_width <= w && y + 16 <= h) {
222 elinesize = linesize;
227 elinesize = 16 * sizeof(*ctx->emu_buf);
229 bw = FFMIN(w - x, mb_width);
230 bh = FFMIN(h - y, 16);
232 for (j = 0; j < bh; j++) {
233 memcpy(ctx->emu_buf + j * 16,
234 (const uint8_t*)src + j * linesize,
236 pix = ctx->emu_buf[j * 16 + bw - 1];
237 for (k = bw; k < mb_width; k++)
238 ctx->emu_buf[j * 16 + k] = pix;
241 memcpy(ctx->emu_buf + j * 16,
242 ctx->emu_buf + (bh - 1) * 16,
243 mb_width * sizeof(*ctx->emu_buf));
246 ctx->dsp.fdct(esrc, elinesize, blocks);
248 if (blocks_per_mb > 2) {
249 ctx->dsp.fdct(src + 8, linesize, blocks);
252 ctx->dsp.fdct(src + linesize * 4, linesize, blocks);
254 if (blocks_per_mb > 2) {
255 ctx->dsp.fdct(src + linesize * 4 + 8, linesize, blocks);
259 ctx->dsp.fdct(esrc, elinesize, blocks);
261 ctx->dsp.fdct(src + linesize * 4, linesize, blocks);
263 if (blocks_per_mb > 2) {
264 ctx->dsp.fdct(src + 8, linesize, blocks);
266 ctx->dsp.fdct(src + linesize * 4 + 8, linesize, blocks);
276 * Write an unsigned rice/exp golomb codeword.
278 static inline void encode_vlc_codeword(PutBitContext *pb, unsigned codebook, int val)
280 unsigned int rice_order, exp_order, switch_bits, switch_val;
283 /* number of prefix bits to switch between Rice and expGolomb */
284 switch_bits = (codebook & 3) + 1;
285 rice_order = codebook >> 5; /* rice code order */
286 exp_order = (codebook >> 2) & 7; /* exp golomb code order */
288 switch_val = switch_bits << rice_order;
290 if (val >= switch_val) {
291 val -= switch_val - (1 << exp_order);
292 exponent = av_log2(val);
294 put_bits(pb, exponent - exp_order + switch_bits, 0);
295 put_bits(pb, exponent + 1, val);
297 exponent = val >> rice_order;
300 put_bits(pb, exponent, 0);
303 put_sbits(pb, rice_order, val);
307 #define GET_SIGN(x) ((x) >> 31)
308 #define MAKE_CODE(x) (((x) << 1) ^ GET_SIGN(x))
310 static void encode_dcs(PutBitContext *pb, DCTELEM *blocks,
311 int blocks_per_slice, int scale)
314 int codebook = 3, code, dc, prev_dc, delta, sign, new_sign;
316 prev_dc = (blocks[0] - 0x4000) / scale;
317 encode_vlc_codeword(pb, FIRST_DC_CB, MAKE_CODE(prev_dc));
322 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
323 dc = (blocks[0] - 0x4000) / scale;
324 delta = dc - prev_dc;
325 new_sign = GET_SIGN(delta);
326 delta = (delta ^ sign) - sign;
327 code = MAKE_CODE(delta);
328 encode_vlc_codeword(pb, ff_prores_dc_codebook[codebook], code);
329 codebook = (code + (code & 1)) >> 1;
330 codebook = FFMIN(codebook, 3);
336 static void encode_acs(PutBitContext *pb, DCTELEM *blocks,
337 int blocks_per_slice,
338 int plane_size_factor,
339 const uint8_t *scan, const int16_t *qmat)
342 int run, level, run_cb, lev_cb;
343 int max_coeffs, abs_level;
345 max_coeffs = blocks_per_slice << 6;
346 run_cb = ff_prores_run_to_cb_index[4];
347 lev_cb = ff_prores_lev_to_cb_index[2];
350 for (i = 1; i < 64; i++) {
351 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
352 level = blocks[idx] / qmat[scan[i]];
354 abs_level = FFABS(level);
355 encode_vlc_codeword(pb, ff_prores_ac_codebook[run_cb], run);
356 encode_vlc_codeword(pb, ff_prores_ac_codebook[lev_cb],
358 put_sbits(pb, 1, GET_SIGN(level));
360 run_cb = ff_prores_run_to_cb_index[FFMIN(run, 15)];
361 lev_cb = ff_prores_lev_to_cb_index[FFMIN(abs_level, 9)];
370 static int encode_slice_plane(ProresContext *ctx, PutBitContext *pb,
371 const uint16_t *src, int linesize,
372 int mbs_per_slice, DCTELEM *blocks,
373 int blocks_per_mb, int plane_size_factor,
376 int blocks_per_slice, saved_pos;
378 saved_pos = put_bits_count(pb);
379 blocks_per_slice = mbs_per_slice * blocks_per_mb;
381 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
382 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
383 ctx->scantable.permutated, qmat);
386 return (put_bits_count(pb) - saved_pos) >> 3;
389 static int encode_slice(AVCodecContext *avctx, const AVFrame *pic,
391 int sizes[4], int x, int y, int quant,
394 ProresContext *ctx = avctx->priv_data;
398 int slice_width_factor = av_log2(mbs_per_slice);
399 int num_cblocks, pwidth;
400 int plane_factor, is_chroma;
403 if (ctx->force_quant) {
404 qmat = ctx->quants[0];
405 } else if (quant < MAX_STORED_Q) {
406 qmat = ctx->quants[quant];
408 qmat = ctx->custom_q;
409 for (i = 0; i < 64; i++)
410 qmat[i] = ctx->quant_mat[i] * quant;
413 for (i = 0; i < ctx->num_planes; i++) {
414 is_chroma = (i == 1 || i == 2);
415 plane_factor = slice_width_factor + 2;
417 plane_factor += ctx->chroma_factor - 3;
418 if (!is_chroma || ctx->chroma_factor == CFACTOR_Y444) {
422 pwidth = avctx->width;
427 pwidth = avctx->width >> 1;
429 src = (const uint16_t*)(pic->data[i] + yp * pic->linesize[i]) + xp;
431 get_slice_data(ctx, src, pic->linesize[i], xp, yp,
432 pwidth, avctx->height, ctx->blocks[0],
433 mbs_per_slice, num_cblocks, is_chroma);
434 sizes[i] = encode_slice_plane(ctx, pb, src, pic->linesize[i],
435 mbs_per_slice, ctx->blocks[0],
436 num_cblocks, plane_factor,
438 total_size += sizes[i];
443 static inline int estimate_vlc(unsigned codebook, int val)
445 unsigned int rice_order, exp_order, switch_bits, switch_val;
448 /* number of prefix bits to switch between Rice and expGolomb */
449 switch_bits = (codebook & 3) + 1;
450 rice_order = codebook >> 5; /* rice code order */
451 exp_order = (codebook >> 2) & 7; /* exp golomb code order */
453 switch_val = switch_bits << rice_order;
455 if (val >= switch_val) {
456 val -= switch_val - (1 << exp_order);
457 exponent = av_log2(val);
459 return exponent * 2 - exp_order + switch_bits + 1;
461 return (val >> rice_order) + rice_order + 1;
465 static int estimate_dcs(int *error, DCTELEM *blocks, int blocks_per_slice,
469 int codebook = 3, code, dc, prev_dc, delta, sign, new_sign;
472 prev_dc = (blocks[0] - 0x4000) / scale;
473 bits = estimate_vlc(FIRST_DC_CB, MAKE_CODE(prev_dc));
477 *error += FFABS(blocks[0] - 0x4000) % scale;
479 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
480 dc = (blocks[0] - 0x4000) / scale;
481 *error += FFABS(blocks[0] - 0x4000) % scale;
482 delta = dc - prev_dc;
483 new_sign = GET_SIGN(delta);
484 delta = (delta ^ sign) - sign;
485 code = MAKE_CODE(delta);
486 bits += estimate_vlc(ff_prores_dc_codebook[codebook], code);
487 codebook = (code + (code & 1)) >> 1;
488 codebook = FFMIN(codebook, 3);
496 static int estimate_acs(int *error, DCTELEM *blocks, int blocks_per_slice,
497 int plane_size_factor,
498 const uint8_t *scan, const int16_t *qmat)
501 int run, level, run_cb, lev_cb;
502 int max_coeffs, abs_level;
505 max_coeffs = blocks_per_slice << 6;
506 run_cb = ff_prores_run_to_cb_index[4];
507 lev_cb = ff_prores_lev_to_cb_index[2];
510 for (i = 1; i < 64; i++) {
511 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
512 level = blocks[idx] / qmat[scan[i]];
513 *error += FFABS(blocks[idx]) % qmat[scan[i]];
515 abs_level = FFABS(level);
516 bits += estimate_vlc(ff_prores_ac_codebook[run_cb], run);
517 bits += estimate_vlc(ff_prores_ac_codebook[lev_cb],
520 run_cb = ff_prores_run_to_cb_index[FFMIN(run, 15)];
521 lev_cb = ff_prores_lev_to_cb_index[FFMIN(abs_level, 9)];
532 static int estimate_slice_plane(ProresContext *ctx, int *error, int plane,
533 const uint16_t *src, int linesize,
535 int blocks_per_mb, int plane_size_factor,
538 int blocks_per_slice;
541 blocks_per_slice = mbs_per_slice * blocks_per_mb;
543 bits = estimate_dcs(error, ctx->blocks[plane], blocks_per_slice, qmat[0]);
544 bits += estimate_acs(error, ctx->blocks[plane], blocks_per_slice,
545 plane_size_factor, ctx->scantable.permutated, qmat);
547 return FFALIGN(bits, 8);
550 static int find_slice_quant(AVCodecContext *avctx, const AVFrame *pic,
551 int trellis_node, int x, int y, int mbs_per_slice)
553 ProresContext *ctx = avctx->priv_data;
554 int i, q, pq, xp, yp;
556 int slice_width_factor = av_log2(mbs_per_slice);
557 int num_cblocks[MAX_PLANES], pwidth;
558 int plane_factor[MAX_PLANES], is_chroma[MAX_PLANES];
559 const int min_quant = ctx->profile_info->min_quant;
560 const int max_quant = ctx->profile_info->max_quant;
561 int error, bits, bits_limit;
562 int mbs, prev, cur, new_score;
563 int slice_bits[TRELLIS_WIDTH], slice_score[TRELLIS_WIDTH];
567 mbs = x + mbs_per_slice;
569 for (i = 0; i < ctx->num_planes; i++) {
570 is_chroma[i] = (i == 1 || i == 2);
571 plane_factor[i] = slice_width_factor + 2;
573 plane_factor[i] += ctx->chroma_factor - 3;
574 if (!is_chroma[i] || ctx->chroma_factor == CFACTOR_Y444) {
578 pwidth = avctx->width;
583 pwidth = avctx->width >> 1;
585 src = (const uint16_t*)(pic->data[i] + yp * pic->linesize[i]) + xp;
587 get_slice_data(ctx, src, pic->linesize[i], xp, yp,
588 pwidth, avctx->height, ctx->blocks[i],
589 mbs_per_slice, num_cblocks[i], is_chroma[i]);
592 for (q = min_quant; q < max_quant + 2; q++) {
593 ctx->nodes[trellis_node + q].prev_node = -1;
594 ctx->nodes[trellis_node + q].quant = q;
597 // todo: maybe perform coarser quantising to fit into frame size when needed
598 for (q = min_quant; q <= max_quant; q++) {
601 for (i = 0; i < ctx->num_planes; i++) {
602 bits += estimate_slice_plane(ctx, &error, i,
603 src, pic->linesize[i],
605 num_cblocks[i], plane_factor[i],
608 if (bits > 65000 * 8) {
612 slice_bits[q] = bits;
613 slice_score[q] = error;
615 if (slice_bits[max_quant] <= ctx->bits_per_mb * mbs_per_slice) {
616 slice_bits[max_quant + 1] = slice_bits[max_quant];
617 slice_score[max_quant + 1] = slice_score[max_quant] + 1;
618 overquant = max_quant;
620 for (q = max_quant + 1; q < 128; q++) {
623 if (q < MAX_STORED_Q) {
624 qmat = ctx->quants[q];
626 qmat = ctx->custom_q;
627 for (i = 0; i < 64; i++)
628 qmat[i] = ctx->quant_mat[i] * q;
630 for (i = 0; i < ctx->num_planes; i++) {
631 bits += estimate_slice_plane(ctx, &error, i,
632 src, pic->linesize[i],
634 num_cblocks[i], plane_factor[i],
637 if (bits <= ctx->bits_per_mb * mbs_per_slice)
641 slice_bits[max_quant + 1] = bits;
642 slice_score[max_quant + 1] = error;
645 ctx->nodes[trellis_node + max_quant + 1].quant = overquant;
647 bits_limit = mbs * ctx->bits_per_mb;
648 for (pq = min_quant; pq < max_quant + 2; pq++) {
649 prev = trellis_node - TRELLIS_WIDTH + pq;
651 for (q = min_quant; q < max_quant + 2; q++) {
652 cur = trellis_node + q;
654 bits = ctx->nodes[prev].bits + slice_bits[q];
655 error = slice_score[q];
656 if (bits > bits_limit)
659 if (ctx->nodes[prev].score < SCORE_LIMIT && error < SCORE_LIMIT)
660 new_score = ctx->nodes[prev].score + error;
662 new_score = SCORE_LIMIT;
663 if (ctx->nodes[cur].prev_node == -1 ||
664 ctx->nodes[cur].score >= new_score) {
666 ctx->nodes[cur].bits = bits;
667 ctx->nodes[cur].score = new_score;
668 ctx->nodes[cur].prev_node = prev;
673 error = ctx->nodes[trellis_node + min_quant].score;
674 pq = trellis_node + min_quant;
675 for (q = min_quant + 1; q < max_quant + 2; q++) {
676 if (ctx->nodes[trellis_node + q].score <= error) {
677 error = ctx->nodes[trellis_node + q].score;
678 pq = trellis_node + q;
685 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
686 const AVFrame *pic, int *got_packet)
688 ProresContext *ctx = avctx->priv_data;
689 uint8_t *orig_buf, *buf, *slice_hdr, *slice_sizes, *tmp;
690 uint8_t *picture_size_pos;
692 int x, y, i, mb, q = 0;
693 int sizes[4] = { 0 };
694 int slice_hdr_size = 2 + 2 * (ctx->num_planes - 1);
695 int frame_size, picture_size, slice_size;
696 int mbs_per_slice = ctx->mbs_per_slice;
699 *avctx->coded_frame = *pic;
700 avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
701 avctx->coded_frame->key_frame = 1;
703 pkt_size = ctx->frame_size + FF_MIN_BUFFER_SIZE;
705 if ((ret = ff_alloc_packet2(avctx, pkt, pkt_size)) < 0)
708 orig_buf = pkt->data;
711 orig_buf += 4; // frame size
712 bytestream_put_be32 (&orig_buf, FRAME_ID); // frame container ID
717 buf += 2; // frame header size will be stored here
718 bytestream_put_be16 (&buf, 0); // version 1
719 bytestream_put_buffer(&buf, ctx->vendor, 4);
720 bytestream_put_be16 (&buf, avctx->width);
721 bytestream_put_be16 (&buf, avctx->height);
722 bytestream_put_byte (&buf, ctx->chroma_factor << 6); // frame flags
723 bytestream_put_byte (&buf, 0); // reserved
724 bytestream_put_byte (&buf, avctx->color_primaries);
725 bytestream_put_byte (&buf, avctx->color_trc);
726 bytestream_put_byte (&buf, avctx->colorspace);
727 bytestream_put_byte (&buf, 0x40); // source format and alpha information
728 bytestream_put_byte (&buf, 0); // reserved
729 if (ctx->quant_sel != QUANT_MAT_DEFAULT) {
730 bytestream_put_byte (&buf, 0x03); // matrix flags - both matrices are present
731 // luma quantisation matrix
732 for (i = 0; i < 64; i++)
733 bytestream_put_byte(&buf, ctx->quant_mat[i]);
734 // chroma quantisation matrix
735 for (i = 0; i < 64; i++)
736 bytestream_put_byte(&buf, ctx->quant_mat[i]);
738 bytestream_put_byte (&buf, 0x00); // matrix flags - default matrices are used
740 bytestream_put_be16 (&tmp, buf - orig_buf); // write back frame header size
743 picture_size_pos = buf + 1;
744 bytestream_put_byte (&buf, 0x40); // picture header size (in bits)
745 buf += 4; // picture data size will be stored here
746 bytestream_put_be16 (&buf, ctx->num_slices); // total number of slices
747 bytestream_put_byte (&buf, av_log2(ctx->mbs_per_slice) << 4); // slice width and height in MBs
749 // seek table - will be filled during slice encoding
751 buf += ctx->num_slices * 2;
754 for (y = 0; y < ctx->mb_height; y++) {
755 mbs_per_slice = ctx->mbs_per_slice;
756 if (!ctx->force_quant) {
757 for (x = mb = 0; x < ctx->mb_width; x += mbs_per_slice, mb++) {
758 while (ctx->mb_width - x < mbs_per_slice)
760 q = find_slice_quant(avctx, pic, (mb + 1) * TRELLIS_WIDTH, x, y,
764 for (x = ctx->slices_width - 1; x >= 0; x--) {
765 ctx->slice_q[x] = ctx->nodes[q].quant;
766 q = ctx->nodes[q].prev_node;
770 mbs_per_slice = ctx->mbs_per_slice;
771 for (x = mb = 0; x < ctx->mb_width; x += mbs_per_slice, mb++) {
772 q = ctx->force_quant ? ctx->force_quant : ctx->slice_q[mb];
774 while (ctx->mb_width - x < mbs_per_slice)
777 bytestream_put_byte(&buf, slice_hdr_size << 3);
779 buf += slice_hdr_size - 1;
780 init_put_bits(&pb, buf, (pkt_size - (buf - orig_buf)) * 8);
781 encode_slice(avctx, pic, &pb, sizes, x, y, q, mbs_per_slice);
783 bytestream_put_byte(&slice_hdr, q);
784 slice_size = slice_hdr_size + sizes[ctx->num_planes - 1];
785 for (i = 0; i < ctx->num_planes - 1; i++) {
786 bytestream_put_be16(&slice_hdr, sizes[i]);
787 slice_size += sizes[i];
789 bytestream_put_be16(&slice_sizes, slice_size);
790 buf += slice_size - slice_hdr_size;
795 frame_size = buf - orig_buf;
796 picture_size = buf - picture_size_pos - 6;
797 bytestream_put_be32(&orig_buf, frame_size);
798 bytestream_put_be32(&picture_size_pos, picture_size);
800 pkt->size = frame_size;
801 pkt->flags |= AV_PKT_FLAG_KEY;
807 static av_cold int encode_close(AVCodecContext *avctx)
809 ProresContext *ctx = avctx->priv_data;
811 if (avctx->coded_frame->data[0])
812 avctx->release_buffer(avctx, avctx->coded_frame);
814 av_freep(&avctx->coded_frame);
816 av_freep(&ctx->nodes);
817 av_freep(&ctx->slice_q);
822 static av_cold int encode_init(AVCodecContext *avctx)
824 ProresContext *ctx = avctx->priv_data;
827 int min_quant, max_quant;
829 avctx->bits_per_raw_sample = 10;
830 avctx->coded_frame = avcodec_alloc_frame();
831 if (!avctx->coded_frame)
832 return AVERROR(ENOMEM);
834 ff_proresdsp_init(&ctx->dsp, avctx);
835 ff_init_scantable(ctx->dsp.dct_permutation, &ctx->scantable,
836 ff_prores_progressive_scan);
838 mps = ctx->mbs_per_slice;
839 if (mps & (mps - 1)) {
840 av_log(avctx, AV_LOG_ERROR,
841 "there should be an integer power of two MBs per slice\n");
842 return AVERROR(EINVAL);
845 ctx->chroma_factor = avctx->pix_fmt == PIX_FMT_YUV422P10
848 ctx->profile_info = prores_profile_info + ctx->profile;
851 ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
852 ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
853 ctx->slices_width = ctx->mb_width / mps;
854 ctx->slices_width += av_popcount(ctx->mb_width - ctx->slices_width * mps);
855 ctx->num_slices = ctx->mb_height * ctx->slices_width;
857 if (ctx->quant_sel == -1)
858 ctx->quant_mat = prores_quant_matrices[ctx->profile_info->quant];
860 ctx->quant_mat = prores_quant_matrices[ctx->quant_sel];
862 if (strlen(ctx->vendor) != 4) {
863 av_log(avctx, AV_LOG_ERROR, "vendor ID should be 4 bytes\n");
864 return AVERROR_INVALIDDATA;
867 ctx->force_quant = avctx->global_quality / FF_QP2LAMBDA;
868 if (!ctx->force_quant) {
869 if (!ctx->bits_per_mb) {
870 for (i = 0; i < NUM_MB_LIMITS - 1; i++)
871 if (prores_mb_limits[i] >= ctx->mb_width * ctx->mb_height)
873 ctx->bits_per_mb = ctx->profile_info->br_tab[i];
874 } else if (ctx->bits_per_mb < 128) {
875 av_log(avctx, AV_LOG_ERROR, "too few bits per MB, please set at least 128\n");
876 return AVERROR_INVALIDDATA;
879 min_quant = ctx->profile_info->min_quant;
880 max_quant = ctx->profile_info->max_quant;
881 for (i = min_quant; i < MAX_STORED_Q; i++) {
882 for (j = 0; j < 64; j++)
883 ctx->quants[i][j] = ctx->quant_mat[j] * i;
886 ctx->nodes = av_malloc((ctx->slices_width + 1) * TRELLIS_WIDTH
887 * sizeof(*ctx->nodes));
890 return AVERROR(ENOMEM);
892 for (i = min_quant; i < max_quant + 2; i++) {
893 ctx->nodes[i].prev_node = -1;
894 ctx->nodes[i].bits = 0;
895 ctx->nodes[i].score = 0;
898 ctx->slice_q = av_malloc(ctx->slices_width * sizeof(*ctx->slice_q));
901 return AVERROR(ENOMEM);
906 if (ctx->force_quant > 64) {
907 av_log(avctx, AV_LOG_ERROR, "too large quantiser, maximum is 64\n");
908 return AVERROR_INVALIDDATA;
911 for (j = 0; j < 64; j++) {
912 ctx->quants[0][j] = ctx->quant_mat[j] * ctx->force_quant;
913 ls += av_log2((1 << 11) / ctx->quants[0][j]) * 2 + 1;
916 ctx->bits_per_mb = ls * 8;
917 if (ctx->chroma_factor == CFACTOR_Y444)
918 ctx->bits_per_mb += ls * 4;
919 if (ctx->num_planes == 4)
920 ctx->bits_per_mb += ls * 4;
923 ctx->frame_size = ctx->num_slices * (2 + 2 * ctx->num_planes
924 + (2 * mps * ctx->bits_per_mb) / 8)
927 avctx->codec_tag = ctx->profile_info->tag;
929 av_log(avctx, AV_LOG_DEBUG, "profile %d, %d slices, %d bits per MB\n",
930 ctx->profile, ctx->num_slices, ctx->bits_per_mb);
931 av_log(avctx, AV_LOG_DEBUG, "estimated frame size %d\n",
937 #define OFFSET(x) offsetof(ProresContext, x)
938 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
940 static const AVOption options[] = {
941 { "mbs_per_slice", "macroblocks per slice", OFFSET(mbs_per_slice),
942 AV_OPT_TYPE_INT, { 8 }, 1, MAX_MBS_PER_SLICE, VE },
943 { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT,
944 { PRORES_PROFILE_STANDARD },
945 PRORES_PROFILE_PROXY, PRORES_PROFILE_HQ, VE, "profile" },
946 { "proxy", NULL, 0, AV_OPT_TYPE_CONST, { PRORES_PROFILE_PROXY },
947 0, 0, VE, "profile" },
948 { "lt", NULL, 0, AV_OPT_TYPE_CONST, { PRORES_PROFILE_LT },
949 0, 0, VE, "profile" },
950 { "standard", NULL, 0, AV_OPT_TYPE_CONST, { PRORES_PROFILE_STANDARD },
951 0, 0, VE, "profile" },
952 { "hq", NULL, 0, AV_OPT_TYPE_CONST, { PRORES_PROFILE_HQ },
953 0, 0, VE, "profile" },
954 { "vendor", "vendor ID", OFFSET(vendor),
955 AV_OPT_TYPE_STRING, { .str = "Lavc" }, CHAR_MIN, CHAR_MAX, VE },
956 { "bits_per_mb", "desired bits per macroblock", OFFSET(bits_per_mb),
957 AV_OPT_TYPE_INT, { 0 }, 0, 8192, VE },
958 { "quant_mat", "quantiser matrix", OFFSET(quant_sel), AV_OPT_TYPE_INT,
959 { -1 }, -1, QUANT_MAT_DEFAULT, VE, "quant_mat" },
960 { "auto", NULL, 0, AV_OPT_TYPE_CONST, { -1 },
961 0, 0, VE, "quant_mat" },
962 { "proxy", NULL, 0, AV_OPT_TYPE_CONST, { QUANT_MAT_PROXY },
963 0, 0, VE, "quant_mat" },
964 { "lt", NULL, 0, AV_OPT_TYPE_CONST, { QUANT_MAT_LT },
965 0, 0, VE, "quant_mat" },
966 { "standard", NULL, 0, AV_OPT_TYPE_CONST, { QUANT_MAT_STANDARD },
967 0, 0, VE, "quant_mat" },
968 { "hq", NULL, 0, AV_OPT_TYPE_CONST, { QUANT_MAT_HQ },
969 0, 0, VE, "quant_mat" },
970 { "default", NULL, 0, AV_OPT_TYPE_CONST, { QUANT_MAT_DEFAULT },
971 0, 0, VE, "quant_mat" },
975 static const AVClass proresenc_class = {
976 .class_name = "ProRes encoder",
977 .item_name = av_default_item_name,
979 .version = LIBAVUTIL_VERSION_INT,
982 AVCodec ff_prores_kostya_encoder = {
983 .name = "prores_kostya",
984 .type = AVMEDIA_TYPE_VIDEO,
985 .id = CODEC_ID_PRORES,
986 .priv_data_size = sizeof(ProresContext),
988 .close = encode_close,
989 .encode2 = encode_frame,
990 .long_name = NULL_IF_CONFIG_SMALL("Apple ProRes (iCodec Pro)"),
991 .pix_fmts = (const enum PixelFormat[]) {
992 PIX_FMT_YUV422P10, PIX_FMT_YUV444P10, PIX_FMT_NONE
994 .priv_class = &proresenc_class,