1 /*
2 * Apple ProRes encoder
3 *
4 * Copyright (c) 2012 Konstantin Shishkov
5 *
6 * This encoder appears to be based on Anatoliy Wassermans considering
7 * similarities in the bugs.
8 *
9 * This file is part of FFmpeg.
10 *
11 * FFmpeg 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.
15 *
16 * FFmpeg 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.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
34
35 #define CFACTOR_Y422 2
36 #define CFACTOR_Y444 3
37
38 #define MAX_MBS_PER_SLICE 8
39
41
42 enum {
49 };
50
51 enum {
57 };
58
60 { // proxy
61 4, 7, 9, 11, 13, 14, 15, 63,
62 7, 7, 11, 12, 14, 15, 63, 63,
63 9, 11, 13, 14, 15, 63, 63, 63,
64 11, 11, 13, 14, 63, 63, 63, 63,
65 11, 13, 14, 63, 63, 63, 63, 63,
66 13, 14, 63, 63, 63, 63, 63, 63,
67 13, 63, 63, 63, 63, 63, 63, 63,
68 63, 63, 63, 63, 63, 63, 63, 63,
69 },
70 { // LT
71 4, 5, 6, 7, 9, 11, 13, 15,
72 5, 5, 7, 8, 11, 13, 15, 17,
73 6, 7, 9, 11, 13, 15, 15, 17,
74 7, 7, 9, 11, 13, 15, 17, 19,
75 7, 9, 11, 13, 14, 16, 19, 23,
76 9, 11, 13, 14, 16, 19, 23, 29,
77 9, 11, 13, 15, 17, 21, 28, 35,
78 11, 13, 16, 17, 21, 28, 35, 41,
79 },
80 { // standard
81 4, 4, 5, 5, 6, 7, 7, 9,
82 4, 4, 5, 6, 7, 7, 9, 9,
83 5, 5, 6, 7, 7, 9, 9, 10,
84 5, 5, 6, 7, 7, 9, 9, 10,
85 5, 6, 7, 7, 8, 9, 10, 12,
86 6, 7, 7, 8, 9, 10, 12, 15,
87 6, 7, 7, 9, 10, 11, 14, 17,
88 7, 7, 9, 10, 11, 14, 17, 21,
89 },
90 { // high quality
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,
99 },
100 { // codec default
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,
106 4, 4, 4, 4, 4, 4, 4, 4,
107 4, 4, 4, 4, 4, 4, 4, 4,
108 4, 4, 4, 4, 4, 4, 4, 4,
109 },
110 };
111
112 #define NUM_MB_LIMITS 4
114 1620, // up to 720x576
115 2700, // up to 960x720
116 6075, // up to 1440x1080
117 9216, // up to 2048x1152
118 };
119
128 {
130 .tag =
MKTAG(
'a',
'p',
'c',
'o'),
131 .min_quant = 4,
132 .max_quant = 8,
133 .br_tab = { 300, 242, 220, 194 },
135 },
136 {
137 .full_name = "LT",
138 .tag =
MKTAG(
'a',
'p',
'c',
's'),
139 .min_quant = 1,
140 .max_quant = 9,
141 .br_tab = { 720, 560, 490, 440 },
143 },
144 {
145 .full_name = "standard",
146 .tag =
MKTAG(
'a',
'p',
'c',
'n'),
147 .min_quant = 1,
148 .max_quant = 6,
149 .br_tab = { 1050, 808, 710, 632 },
151 },
152 {
153 .full_name = "high quality",
154 .tag =
MKTAG(
'a',
'p',
'c',
'h'),
155 .min_quant = 1,
156 .max_quant = 6,
157 .br_tab = { 1566, 1216, 1070, 950 },
159 },
160 {
161 .full_name = "4444",
162 .tag =
MKTAG(
'a',
'p',
'4',
'h'),
163 .min_quant = 1,
164 .max_quant = 6,
165 .br_tab = { 2350, 1828, 1600, 1425 },
167 }
168 };
169
170 #define TRELLIS_WIDTH 16
171 #define SCORE_LIMIT INT_MAX / 2
172
178 };
179
180 #define MAX_STORED_Q 16
181
188
197
199 int linesize, int16_t *
block);
201
214
217
219
222
224
227
229 int linesize,
int x,
int y,
int w,
int h,
230 int16_t *blocks, uint16_t *emu_buf,
231 int mbs_per_slice, int blocks_per_mb, int is_chroma)
232 {
233 const uint16_t *esrc;
234 const int mb_width = 4 * blocks_per_mb;
235 int elinesize;
236 int i, j, k;
237
238 for (i = 0; i < mbs_per_slice; i++, src += mb_width) {
239 if (x >= w) {
240 memset(blocks, 0, 64 * (mbs_per_slice - i) * blocks_per_mb
241 * sizeof(*blocks));
242 return;
243 }
244 if (x + mb_width <= w && y + 16 <= h) {
246 elinesize = linesize;
247 } else {
248 int bw, bh, pix;
249
250 esrc = emu_buf;
251 elinesize = 16 * sizeof(*emu_buf);
252
253 bw =
FFMIN(w - x, mb_width);
254 bh =
FFMIN(h - y, 16);
255
256 for (j = 0; j < bh; j++) {
257 memcpy(emu_buf + j * 16,
258 (
const uint8_t*)src + j * linesize,
259 bw * sizeof(*src));
260 pix = emu_buf[j * 16 + bw - 1];
261 for (k = bw; k < mb_width; k++)
262 emu_buf[j * 16 + k] = pix;
263 }
264 for (; j < 16; j++)
265 memcpy(emu_buf + j * 16,
266 emu_buf + (bh - 1) * 16,
267 mb_width * sizeof(*emu_buf));
268 }
269 if (!is_chroma) {
270 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
271 blocks += 64;
272 if (blocks_per_mb > 2) {
273 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
274 blocks += 64;
275 }
276 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
277 blocks += 64;
278 if (blocks_per_mb > 2) {
279 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
280 blocks += 64;
281 }
282 } else {
283 ctx->
fdct(&ctx->
fdsp, esrc, elinesize, blocks);
284 blocks += 64;
285 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4, elinesize, blocks);
286 blocks += 64;
287 if (blocks_per_mb > 2) {
288 ctx->
fdct(&ctx->
fdsp, esrc + 8, elinesize, blocks);
289 blocks += 64;
290 ctx->
fdct(&ctx->
fdsp, esrc + elinesize * 4 + 8, elinesize, blocks);
291 blocks += 64;
292 }
293 }
294
295 x += mb_width;
296 }
297 }
298
300 int linesize,
int x,
int y,
int w,
int h,
301 int16_t *blocks, int mbs_per_slice, int abits)
302 {
303 const int slice_width = 16 * mbs_per_slice;
304 int i, j, copy_w, copy_h;
305
306 copy_w =
FFMIN(w - x, slice_width);
307 copy_h =
FFMIN(h - y, 16);
308 for (i = 0; i < copy_h; i++) {
309 memcpy(blocks, src, copy_w * sizeof(*src));
310 if (abits == 8)
311 for (j = 0; j < copy_w; j++)
312 blocks[j] >>= 2;
313 else
314 for (j = 0; j < copy_w; j++)
315 blocks[j] = (blocks[j] << 6) | (blocks[j] >> 4);
316 for (j = copy_w; j < slice_width; j++)
317 blocks[j] = blocks[copy_w - 1];
318 blocks += slice_width;
319 src += linesize >> 1;
320 }
321 for (; i < 16; i++) {
322 memcpy(blocks, blocks - slice_width, slice_width * sizeof(*blocks));
323 blocks += slice_width;
324 }
325 }
326
327 /**
328 * Write an unsigned rice/exp golomb codeword.
329 */
331 {
332 unsigned int rice_order, exp_order, switch_bits, switch_val;
333 int exponent;
334
335 /* number of prefix bits to switch between Rice and expGolomb */
336 switch_bits = (codebook & 3) + 1;
337 rice_order = codebook >> 5; /* rice code order */
338 exp_order = (codebook >> 2) & 7; /* exp golomb code order */
339
340 switch_val = switch_bits << rice_order;
341
342 if (val >= switch_val) {
343 val -= switch_val - (1 << exp_order);
345
346 put_bits(pb, exponent - exp_order + switch_bits, 0);
348 } else {
349 exponent = val >> rice_order;
350
351 if (exponent)
354 if (rice_order)
356 }
357 }
358
359 #define GET_SIGN(x) ((x) >> 31)
360 #define MAKE_CODE(x) (((x) << 1) ^ GET_SIGN(x))
361
363 int blocks_per_slice, int scale)
364 {
365 int i;
366 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
367
368 prev_dc = (blocks[0] - 0x4000) / scale;
370 sign = 0;
371 codebook = 3;
372 blocks += 64;
373
374 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
375 dc = (blocks[0] - 0x4000) / scale;
376 delta = dc - prev_dc;
378 delta = (delta ^ sign) - sign;
381 codebook = (code + (code & 1)) >> 1;
382 codebook =
FFMIN(codebook, 3);
383 sign = new_sign;
385 }
386 }
387
389 int blocks_per_slice,
390 int plane_size_factor,
391 const uint8_t *scan,
const int16_t *qmat)
392 {
393 int idx, i;
395 int max_coeffs, abs_level;
396
397 max_coeffs = blocks_per_slice << 6;
400 run = 0;
401
402 for (i = 1; i < 64; i++) {
403 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
404 level = blocks[idx] / qmat[scan[i]];
405 if (level) {
406 abs_level =
FFABS(level);
409 abs_level - 1);
411
414 run = 0;
415 } else {
416 run++;
417 }
418 }
419 }
420 }
421
423 const uint16_t *
src,
int linesize,
424 int mbs_per_slice, int16_t *blocks,
425 int blocks_per_mb, int plane_size_factor,
426 const int16_t *qmat)
427 {
428 int blocks_per_slice, saved_pos;
429
431 blocks_per_slice = mbs_per_slice * blocks_per_mb;
432
433 encode_dcs(pb, blocks, blocks_per_slice, qmat[0]);
434 encode_acs(pb, blocks, blocks_per_slice, plane_size_factor,
437
439 }
440
442 {
443 const int mask = (1 << abits) - 1;
444 const int dbits = (abits == 8) ? 4 : 7;
445 const int dsize = 1 << dbits - 1;
446 int diff = cur - prev;
447
449 if (diff >= (1 << abits) - dsize)
450 diff -= 1 << abits;
451 if (diff < -dsize || diff > dsize || !diff) {
454 } else {
458 }
459 }
460
462 {
463 if (run) {
465 if (run < 0x10)
467 else
469 } else {
471 }
472 }
473
474 // todo alpha quantisation for high quants
476 int mbs_per_slice, uint16_t *blocks,
478 {
480 const int mask = (1 << abits) - 1;
481 const int num_coeffs = mbs_per_slice * 256;
483 int prev =
mask, cur;
484 int idx = 0;
486
487 cur = blocks[idx++];
489 prev = cur;
490 do {
491 cur = blocks[idx++];
492 if (cur != prev) {
495 prev = cur;
496 run = 0;
497 } else {
498 run++;
499 }
500 } while (idx < num_coeffs);
501 if (run)
505 }
506
510 int mbs_per_slice)
511 {
513 int i, xp, yp;
514 int total_size = 0;
516 int slice_width_factor =
av_log2(mbs_per_slice);
517 int num_cblocks, pwidth, linesize, line_add;
518 int plane_factor, is_chroma;
519 uint16_t *qmat;
520
522 line_add = 0;
523 else
525
530 } else {
532 for (i = 0; i < 64; i++)
534 }
535
537 is_chroma = (i == 1 || i == 2);
538 plane_factor = slice_width_factor + 2;
539 if (is_chroma)
542 xp = x << 4;
543 yp = y << 4;
544 num_cblocks = 4;
545 pwidth = avctx->
width;
546 } else {
547 xp = x << 3;
548 yp = y << 4;
549 num_cblocks = 2;
550 pwidth = avctx->
width >> 1;
551 }
552
554 src = (
const uint16_t*)(pic->
data[i] + yp * linesize +
556
557 if (i < 3) {
561 mbs_per_slice, num_cblocks, is_chroma);
563 mbs_per_slice, ctx->
blocks[0],
564 num_cblocks, plane_factor,
565 qmat);
566 } else {
572 }
573 total_size += sizes[i];
576 "Underestimated required buffer size.\n");
578 }
579 }
580 return total_size;
581 }
582
584 {
585 unsigned int rice_order, exp_order, switch_bits, switch_val;
586 int exponent;
587
588 /* number of prefix bits to switch between Rice and expGolomb */
589 switch_bits = (codebook & 3) + 1;
590 rice_order = codebook >> 5; /* rice code order */
591 exp_order = (codebook >> 2) & 7; /* exp golomb code order */
592
593 switch_val = switch_bits << rice_order;
594
595 if (val >= switch_val) {
596 val -= switch_val - (1 << exp_order);
598
599 return exponent * 2 - exp_order + switch_bits + 1;
600 } else {
601 return (val >> rice_order) + rice_order + 1;
602 }
603 }
604
605 static int estimate_dcs(
int *error, int16_t *blocks,
int blocks_per_slice,
606 int scale)
607 {
608 int i;
609 int codebook = 3, code,
dc, prev_dc,
delta, sign, new_sign;
611
612 prev_dc = (blocks[0] - 0x4000) / scale;
614 sign = 0;
615 codebook = 3;
616 blocks += 64;
617 *error +=
FFABS(blocks[0] - 0x4000) % scale;
618
619 for (i = 1; i < blocks_per_slice; i++, blocks += 64) {
620 dc = (blocks[0] - 0x4000) / scale;
621 *error +=
FFABS(blocks[0] - 0x4000) % scale;
622 delta = dc - prev_dc;
624 delta = (delta ^ sign) - sign;
627 codebook = (code + (code & 1)) >> 1;
628 codebook =
FFMIN(codebook, 3);
629 sign = new_sign;
631 }
632
634 }
635
636 static int estimate_acs(
int *error, int16_t *blocks,
int blocks_per_slice,
637 int plane_size_factor,
638 const uint8_t *scan,
const int16_t *qmat)
639 {
640 int idx, i;
642 int max_coeffs, abs_level;
644
645 max_coeffs = blocks_per_slice << 6;
648 run = 0;
649
650 for (i = 1; i < 64; i++) {
651 for (idx = scan[i]; idx < max_coeffs; idx += 64) {
652 level = blocks[idx] / qmat[scan[i]];
653 *error +=
FFABS(blocks[idx]) % qmat[scan[i]];
654 if (level) {
655 abs_level =
FFABS(level);
658 abs_level - 1) + 1;
659
662 run = 0;
663 } else {
664 run++;
665 }
666 }
667 }
668
670 }
671
673 const uint16_t *
src,
int linesize,
674 int mbs_per_slice,
675 int blocks_per_mb, int plane_size_factor,
677 {
678 int blocks_per_slice;
680
681 blocks_per_slice = mbs_per_slice * blocks_per_mb;
682
685 plane_size_factor, ctx->
scantable, qmat);
686
688 }
689
691 {
692 const int mask = (1 << abits) - 1;
693 const int dbits = (abits == 8) ? 4 : 7;
694 const int dsize = 1 << dbits - 1;
695 int diff = cur - prev;
696
698 if (diff >= (1 << abits) - dsize)
699 diff -= 1 << abits;
700 if (diff < -dsize || diff > dsize || !diff)
701 return abits + 1;
702 else
703 return dbits + 1;
704 }
705
707 const uint16_t *
src,
int linesize,
708 int mbs_per_slice,
int quant,
709 int16_t *blocks)
710 {
712 const int mask = (1 << abits) - 1;
713 const int num_coeffs = mbs_per_slice * 256;
714 int prev =
mask, cur;
715 int idx = 0;
718
719 *error = 0;
720 cur = blocks[idx++];
722 prev = cur;
723 do {
724 cur = blocks[idx++];
725 if (cur != prev) {
726 if (!run)
727 bits++;
728 else if (run < 0x10)
729 bits += 4;
730 else
731 bits += 15;
733 prev = cur;
734 run = 0;
735 } else {
736 run++;
737 }
738 } while (idx < num_coeffs);
739
740 if (run) {
741 if (run < 0x10)
742 bits += 4;
743 else
744 bits += 15;
745 }
746
748 }
749
751 int trellis_node,
int x,
int y,
int mbs_per_slice,
753 {
755 int i, q, pq, xp, yp;
757 int slice_width_factor =
av_log2(mbs_per_slice);
762 int error,
bits, bits_limit;
763 int mbs, prev, cur, new_score;
765 int overquant;
766 uint16_t *qmat;
767 int linesize[4], line_add;
768
770 line_add = 0;
771 else
773 mbs = x + mbs_per_slice;
774
776 is_chroma[i] = (i == 1 || i == 2);
777 plane_factor[i] = slice_width_factor + 2;
778 if (is_chroma[i])
781 xp = x << 4;
782 yp = y << 4;
783 num_cblocks[i] = 4;
784 pwidth = avctx->
width;
785 } else {
786 xp = x << 3;
787 yp = y << 4;
788 num_cblocks[i] = 2;
789 pwidth = avctx->
width >> 1;
790 }
791
793 src = (
const uint16_t*)(pic->
data[i] + yp * linesize[i] +
795
796 if (i < 3) {
800 mbs_per_slice, num_cblocks[i], is_chroma[i]);
801 } else {
805 }
806 }
807
808 for (q = min_quant; q < max_quant + 2; q++) {
811 }
812
813 // todo: maybe perform coarser quantising to fit into frame size when needed
814 for (q = min_quant; q <=
max_quant; q++) {
815 bits = 0;
816 error = 0;
819 src, linesize[i],
820 mbs_per_slice,
821 num_cblocks[i], plane_factor[i],
823 }
826 mbs_per_slice, q, td->
blocks[3]);
827 if (bits > 65000 * 8)
829
830 slice_bits[q] =
bits;
831 slice_score[q] = error;
832 }
833 if (slice_bits[max_quant] <= ctx->
bits_per_mb * mbs_per_slice) {
834 slice_bits[max_quant + 1] = slice_bits[
max_quant];
835 slice_score[max_quant + 1] = slice_score[
max_quant] + 1;
837 } else {
838 for (q = max_quant + 1; q < 128; q++) {
839 bits = 0;
840 error = 0;
843 } else {
845 for (i = 0; i < 64; i++)
847 }
850 src, linesize[i],
851 mbs_per_slice,
852 num_cblocks[i], plane_factor[i],
853 qmat, td);
854 }
857 mbs_per_slice, q, td->
blocks[3]);
858 if (bits <= ctx->bits_per_mb * mbs_per_slice)
859 break;
860 }
861
862 slice_bits[max_quant + 1] =
bits;
863 slice_score[max_quant + 1] = error;
864 overquant = q;
865 }
866 td->
nodes[trellis_node + max_quant + 1].
quant = overquant;
867
869 for (pq = min_quant; pq < max_quant + 2; pq++) {
871
872 for (q = min_quant; q < max_quant + 2; q++) {
873 cur = trellis_node + q;
874
875 bits = td->
nodes[prev].
bits + slice_bits[q];
876 error = slice_score[q];
877 if (bits > bits_limit)
879
882 else
886
890 }
891 }
892 }
893
896 for (q = min_quant + 1; q < max_quant + 2; q++) {
897 if (td->
nodes[trellis_node + q].
score <= error) {
899 pq = trellis_node + q;
900 }
901 }
902
903 return pq;
904 }
905
907 int jobnr, int threadnr)
908 {
912 int x,
y = jobnr,
mb, q = 0;
913
914 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
915 while (ctx->
mb_width - x < mbs_per_slice)
916 mbs_per_slice >>= 1;
919 mbs_per_slice, td);
920 }
921
925 }
926
927 return 0;
928 }
929
931 const AVFrame *pic,
int *got_packet)
932 {
934 uint8_t *orig_buf, *
buf, *slice_hdr, *slice_sizes, *tmp;
937 int x,
y, i,
mb, q = 0;
938 int sizes[4] = { 0 };
939 int slice_hdr_size = 2 + 2 * (ctx->
num_planes - 1);
944
946
949
950 orig_buf = pkt->
data;
951
952 // frame atom
953 orig_buf += 4; // frame size
954 bytestream_put_be32 (&orig_buf,
FRAME_ID);
// frame container ID
955 buf = orig_buf;
956
957 // frame header
959 buf += 2; // frame header size will be stored here
960 bytestream_put_be16 (&buf, 0); // version 1
962 bytestream_put_be16 (&buf, avctx->
width);
963 bytestream_put_be16 (&buf, avctx->
height);
964
968 bytestream_put_byte (&buf, frame_flags);
969
970 bytestream_put_byte (&buf, 0); // reserved
972 bytestream_put_byte (&buf, avctx->
color_trc);
973 bytestream_put_byte (&buf, avctx->
colorspace);
974 bytestream_put_byte (&buf, 0x40 | (ctx->
alpha_bits >> 3));
975 bytestream_put_byte (&buf, 0); // reserved
977 bytestream_put_byte (&buf, 0x03); // matrix flags - both matrices are present
978 // luma quantisation matrix
979 for (i = 0; i < 64; i++)
980 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
981 // chroma quantisation matrix
982 for (i = 0; i < 64; i++)
983 bytestream_put_byte(&buf, ctx->
quant_mat[i]);
984 } else {
985 bytestream_put_byte (&buf, 0x00); // matrix flags - default matrices are used
986 }
987 bytestream_put_be16 (&tmp, buf - orig_buf); // write back frame header size
988
992 // picture header
993 picture_size_pos = buf + 1;
994 bytestream_put_byte (&buf, 0x40); // picture header size (in bits)
995 buf += 4; // picture data size will be stored here
998
999 // seek table - will be filled during slice encoding
1002
1003 // slices
1007 if (ret)
1009 }
1010
1013 for (x = mb = 0; x < ctx->
mb_width; x += mbs_per_slice, mb++) {
1016
1017 while (ctx->
mb_width - x < mbs_per_slice)
1018 mbs_per_slice >>= 1;
1019
1020 bytestream_put_byte(&buf, slice_hdr_size << 3);
1022 buf += slice_hdr_size - 1;
1023 if (pkt_size <= buf - orig_buf + 2 * max_slice_size) {
1025 // Recompute new size according to max_slice_size
1026 // and deduce delta
1029 max_slice_size - pkt_size;
1030
1031 delta =
FFMAX(delta, 2 * max_slice_size);
1033
1036 "Packet too small: is %i,"
1037 " needs %i (slice: %i). "
1038 "Correct allocation",
1039 pkt_size, delta, max_slice_size);
1041 }
1042
1044 if (ret < 0)
1046
1048 // restore pointers
1049 orig_buf = pkt->
data + (orig_buf -
start);
1051 picture_size_pos = pkt->
data + (picture_size_pos -
start);
1052 slice_sizes = pkt->
data + (slice_sizes -
start);
1053 slice_hdr = pkt->
data + (slice_hdr -
start);
1055 }
1058 mbs_per_slice);
1059 if (ret < 0)
1061
1062 bytestream_put_byte(&slice_hdr, q);
1063 slice_size = slice_hdr_size + sizes[ctx->
num_planes - 1];
1065 bytestream_put_be16(&slice_hdr, sizes[i]);
1066 slice_size += sizes[i];
1067 }
1068 bytestream_put_be16(&slice_sizes, slice_size);
1069 buf += slice_size - slice_hdr_size;
1070 if (max_slice_size < slice_size)
1071 max_slice_size = slice_size;
1072 }
1073 }
1074
1075 picture_size = buf - (picture_size_pos - 1);
1076 bytestream_put_be32(&picture_size_pos, picture_size);
1077 }
1078
1079 orig_buf -= 8;
1080 frame_size = buf - orig_buf;
1081 bytestream_put_be32(&orig_buf, frame_size);
1082
1085 *got_packet = 1;
1086
1087 return 0;
1088 }
1089
1091 {
1093 int i;
1094
1096
1100 }
1103
1104 return 0;
1105 }
1106
1108 int linesize, int16_t *
block)
1109 {
1111 const uint16_t *tsrc =
src;
1112
1113 for (y = 0; y < 8; y++) {
1114 for (x = 0; x < 8; x++)
1115 block[y * 8 + x] = tsrc[x];
1116 tsrc += linesize >> 1;
1117 }
1119 }
1120
1122 {
1124 int mps;
1125 int i, j;
1128
1135
1140
1142 if (mps & (mps - 1)) {
1144 "there should be an integer power of two MBs per slice\n");
1146 }
1154 ? "4:4:4:4 profile because of the used input colorspace"
1155 : "HQ profile to keep best quality");
1156 }
1159 // force alpha and warn
1161 "encode alpha. Override with -profile if needed.\n");
1163 }
1167 }
1168 } else {
1170 }
1171
1177
1179
1180 if (interlaced)
1182 else
1184
1189
1192 else
1194
1195 if (strlen(ctx->
vendor) != 4) {
1198 }
1199
1206 break;
1211 }
1212
1216 for (j = 0; j < 64; j++)
1218 }
1219
1224 }
1225
1230 }
1231
1239 }
1240 for (i = min_quant; i < max_quant + 2; i++) {
1244 }
1245 }
1246 } else {
1247 int ls = 0;
1248
1252 }
1253
1254 for (j = 0; j < 64; j++) {
1257 }
1258
1262 }
1263
1268 + 200;
1269
1271 // The alpha plane is run-coded and might exceed the bit budget.
1275 /* bits per pixel */ (1 + ctx->
alpha_bits + 1) + 7 >> 3);
1276 }
1277
1279
1281 "profile %d, %d slices, interlacing: %s, %d bits per MB\n",
1286
1287 return 0;
1288 }
1289
1290 #define OFFSET(x) offsetof(ProresContext, x)
1291 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1292
1294 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(mbs_per_slice),
1300 0, 0,
VE,
"profile" },
1302 0, 0,
VE,
"profile" },
1304 0, 0,
VE,
"profile" },
1306 0, 0,
VE,
"profile" },
1308 0, 0,
VE,
"profile" },
1310 0, 0,
VE,
"profile" },
1311 {
"vendor",
"vendor ID",
OFFSET(vendor),
1313 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(bits_per_mb),
1318 0, 0,
VE,
"quant_mat" },
1320 0, 0,
VE,
"quant_mat" },
1322 0, 0,
VE,
"quant_mat" },
1324 0, 0,
VE,
"quant_mat" },
1326 0, 0,
VE,
"quant_mat" },
1328 0, 0,
VE,
"quant_mat" },
1330 { .i64 = 16 }, 0, 16,
VE },
1332 };
1333
1339 };
1340
1342 .
name =
"prores_ks",
1354 },
1356 };