33#include "config_components.h"
60#define VP3_MV_VLC_BITS 6
61#define VP4_MV_VLC_BITS 6
62#define SUPERBLOCK_VLC_BITS 6
64#define FRAGMENT_PIXELS 8
74#define SB_PARTIALLY_CODED 1
75#define SB_FULLY_CODED 2
80#define MAXIMUM_LONG_BIT_RUN 4129
82#define MODE_INTER_NO_MV 0
84#define MODE_INTER_PLUS_MV 2
85#define MODE_INTER_LAST_MV 3
86#define MODE_INTER_PRIOR_LAST 4
87#define MODE_USING_GOLDEN 5
88#define MODE_GOLDEN_MV 6
89#define MODE_INTER_FOURMV 7
90#define CODING_MODE_COUNT 8
139 { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 },
140 { 0, 2 }, { 0, 3 }, { 1, 3 }, { 1, 2 },
141 { 2, 2 }, { 2, 3 }, { 3, 3 }, { 3, 2 },
142 { 3, 1 }, { 2, 1 }, { 2, 0 }, { 3, 0 }
171#if CONFIG_VP4_DECODER
172static const VLCElem *vp4_mv_vlc_table[2][7];
173static const VLCElem *block_pattern_vlc[2];
181#define MIN_DEQUANT_VAL 2
279#define TOKEN_EOB(eob_run) ((eob_run) << 2)
280#define TOKEN_ZERO_RUN(coeff, zero_run) (((coeff) * 512) + ((zero_run) << 2) + 1)
281#define TOKEN_COEFF(coeff) (((coeff) * 4) + 2)
366 s->theora_tables = 0;
387 for (
int plane = 0; plane < 3; plane++) {
388 int sb_width = plane ?
s->c_superblock_width
389 :
s->y_superblock_width;
390 int sb_height = plane ?
s->c_superblock_height
391 :
s->y_superblock_height;
392 int frag_width =
s->fragment_width[!!plane];
393 int frag_height =
s->fragment_height[!!plane];
395 for (
int sb_y = 0; sb_y < sb_height; sb_y++)
396 for (
int sb_x = 0; sb_x < sb_width; sb_x++)
397 for (
int i = 0;
i < 16;
i++) {
401 if (x < frag_width && y < frag_height)
402 s->superblock_fragments[j++] =
s->fragment_start[plane] +
405 s->superblock_fragments[j++] = -1;
418 int ac_scale_factor =
s->coded_ac_scale_factor[
s->qps[qpi]];
420 for (
int inter = 0; inter < 2; inter++) {
421 for (
int plane = 0; plane < 3; plane++) {
422 int dc_scale_factor =
s->coded_dc_scale_factor[!!plane][
s->qps[qpi]];
423 int sum = 0, bmi, bmj, qistart, qri;
424 for (qri = 0; qri <
s->qr_count[inter][plane]; qri++) {
425 sum +=
s->qr_size[inter][plane][qri];
426 if (
s->qps[qpi] <= sum)
429 qistart = sum -
s->qr_size[inter][plane][qri];
430 bmi =
s->qr_base[inter][plane][qri];
431 bmj =
s->qr_base[inter][plane][qri + 1];
432 for (
int i = 0;
i < 64;
i++) {
433 int coeff = (2 * (sum -
s->qps[qpi]) *
s->base_matrix[bmi][
i] -
434 2 * (qistart -
s->qps[qpi]) *
s->base_matrix[bmj][
i] +
435 s->qr_size[inter][plane][qri]) /
436 (2 *
s->qr_size[inter][plane][qri]);
438 int qmin = 8 << (inter + !
i);
439 int qscale =
i ? ac_scale_factor : dc_scale_factor;
440 int qbias = (1 + inter) * 3;
441 s->qmat[qpi][inter][plane][
s->idct_permutation[
i]] =
442 (
i == 0 ||
s->version < 2) ?
av_clip((qscale *
coeff) / 100 * 4, qmin, 4096)
443 : (qscale * (
coeff - qbias) / 100 + qbias) * 4;
447 s->qmat[qpi][inter][plane][0] =
s->qmat[0][inter][plane][0];
469 const int superblock_starts[3] = {
470 0,
s->u_superblock_start,
s->v_superblock_start
473 int current_superblock = 0;
475 int num_partial_superblocks = 0;
477 int current_fragment;
478 int plane0_num_coded_frags = 0;
487 while (current_superblock < s->superblock_count &&
get_bits_left(gb) > 0) {
495 if (current_run == 34)
498 if (current_run >
s->superblock_count - current_superblock) {
500 "Invalid partially coded superblock run length\n");
504 memset(
s->superblock_coding + current_superblock,
bit, current_run);
506 current_superblock += current_run;
508 num_partial_superblocks += current_run;
513 if (num_partial_superblocks < s->superblock_count) {
514 int superblocks_decoded = 0;
516 current_superblock = 0;
520 while (superblocks_decoded < s->superblock_count - num_partial_superblocks &&
529 if (current_run == 34)
532 for (
int j = 0; j < current_run; current_superblock++) {
533 if (current_superblock >=
s->superblock_count) {
535 "Invalid fully coded superblock run length\n");
540 if (
s->superblock_coding[current_superblock] ==
SB_NOT_CODED) {
541 s->superblock_coding[current_superblock] = 2 *
bit;
545 superblocks_decoded += current_run;
551 if (num_partial_superblocks) {
562 s->total_num_coded_frags = 0;
563 memset(
s->macroblock_coding,
MODE_COPY,
s->macroblock_count);
565 s->coded_fragment_list[0] =
s->keyframe ?
s->kf_coded_fragment_list
566 :
s->nkf_coded_fragment_list;
568 for (
int plane = 0; plane < 3; plane++) {
569 int sb_start = superblock_starts[plane];
570 int sb_end = sb_start + (plane ?
s->c_superblock_count
571 :
s->y_superblock_count);
572 int num_coded_frags = 0;
575 if (
s->num_kf_coded_fragment[plane] == -1) {
576 for (
int i = sb_start;
i < sb_end;
i++) {
578 for (
int j = 0; j < 16; j++) {
580 current_fragment =
s->superblock_fragments[
i * 16 + j];
581 if (current_fragment != -1) {
582 s->coded_fragment_list[plane][num_coded_frags++] =
587 s->num_kf_coded_fragment[plane] = num_coded_frags;
589 num_coded_frags =
s->num_kf_coded_fragment[plane];
596 for (
int j = 0; j < 16; j++) {
598 current_fragment =
s->superblock_fragments[
i * 16 + j];
599 if (current_fragment != -1) {
600 int coded =
s->superblock_coding[
i];
605 if (current_run-- == 0) {
615 s->all_fragments[current_fragment].coding_method =
617 s->coded_fragment_list[plane][num_coded_frags++] =
621 s->all_fragments[current_fragment].coding_method =
629 plane0_num_coded_frags = num_coded_frags;
630 s->total_num_coded_frags += num_coded_frags;
631 for (
int i = 0;
i < 64;
i++)
632 s->num_coded_frags[plane][
i] = num_coded_frags;
634 s->coded_fragment_list[plane + 1] =
s->coded_fragment_list[plane] +
640#define BLOCK_X (2 * mb_x + (k & 1))
641#define BLOCK_Y (2 * mb_y + (k >> 1))
643#if CONFIG_VP4_DECODER
655 if (v >
s->yuv_macroblock_count) {
661 skip_bits(gb, 2 + n); \
662 v += (1 << n) + get_bits(gb, n); }
663#define thresh(n) (0x200 - (0x80 >> n))
664#define else_if(n) else if (bits < thresh(n)) body(n)
667 }
else if (
bits < thresh(0)) {
684static int vp4_get_block_pattern(
GetBitContext *gb,
int *next_block_pattern_table)
686 int v =
get_vlc2(gb, block_pattern_vlc[*next_block_pattern_table], 5, 1);
694 int next_block_pattern_table;
695 int bit, current_run, has_partial;
697 memset(
s->macroblock_coding,
MODE_COPY,
s->macroblock_count);
704 for (
int i = 0;
i <
s->yuv_macroblock_count;
i += current_run) {
707 current_run = vp4_get_mb_count(
s, gb);
708 if (current_run >
s->yuv_macroblock_count -
i)
710 memset(
s->superblock_coding +
i, 2 *
bit, current_run);
719 current_run = vp4_get_mb_count(
s, gb);
720 for (
int i = 0;
i <
s->yuv_macroblock_count;
i++) {
721 if (!
s->superblock_coding[
i]) {
724 current_run = vp4_get_mb_count(
s, gb);
726 s->superblock_coding[
i] =
bit;
734 next_block_pattern_table = 0;
735 for (
int plane = 0,
i = 0; plane < 3; plane++) {
736 int sb_width = plane ?
s->c_superblock_width :
s->y_superblock_width;
737 int sb_height = plane ?
s->c_superblock_height :
s->y_superblock_height;
738 int mb_width = plane ?
s->c_macroblock_width :
s->macroblock_width;
739 int mb_height = plane ?
s->c_macroblock_height :
s->macroblock_height;
740 int fragment_width =
s->fragment_width[!!plane];
741 int fragment_height =
s->fragment_height[!!plane];
743 for (
int sb_y = 0; sb_y < sb_height; sb_y++) {
744 for (
int sb_x = 0; sb_x < sb_width; sb_x++) {
745 for (
int j = 0; j < 4; j++) {
746 int mb_x = 2 * sb_x + (j >> 1);
747 int mb_y = 2 * sb_y + (j >> 1) ^ (j & 1);
748 int mb_coded, pattern, coded;
750 if (mb_x >= mb_width || mb_y >= mb_height)
753 mb_coded =
s->superblock_coding[
i++];
758 pattern = vp4_get_block_pattern(gb, &next_block_pattern_table);
762 for (
int k = 0; k < 4; k++) {
766 coded = pattern & (8 >> k);
786 int current_macroblock;
787 int current_fragment;
794 for (
int i = 0;
i <
s->fragment_count;
i++)
802 for (
int i = 0;
i < 8;
i++)
804 for (
int i = 0;
i < 8;
i++)
805 custom_mode_alphabet[
get_bits(gb, 3)] =
i;
806 alphabet = custom_mode_alphabet;
812 for (
int sb_y = 0; sb_y <
s->y_superblock_height; sb_y++) {
813 for (
int sb_x = 0; sb_x <
s->y_superblock_width; sb_x++) {
817 for (
int j = 0; j < 4; j++) {
819 int mb_x = 2 * sb_x + (j >> 1);
820 int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
821 current_macroblock = mb_y *
s->macroblock_width + mb_x;
823 if (mb_x >=
s->macroblock_width ||
824 mb_y >=
s->macroblock_height)
830 for (k = 0; k < 4; k++) {
833 if (
s->all_fragments[current_fragment].coding_method !=
MODE_COPY)
847 s->macroblock_coding[current_macroblock] = coding_mode;
848 for (k = 0; k < 4; k++) {
854#define SET_CHROMA_MODES \
855 if (frag[s->fragment_start[1]].coding_method != MODE_COPY) \
856 frag[s->fragment_start[1]].coding_method = coding_mode; \
857 if (frag[s->fragment_start[2]].coding_method != MODE_COPY) \
858 frag[s->fragment_start[2]].coding_method = coding_mode;
860 if (
s->chroma_y_shift) {
861 frag =
s->all_fragments + mb_y *
862 s->fragment_width[1] + mb_x;
864 }
else if (
s->chroma_x_shift) {
865 frag =
s->all_fragments +
866 2 * mb_y *
s->fragment_width[1] + mb_x;
867 for (k = 0; k < 2; k++) {
869 frag +=
s->fragment_width[1];
872 for (k = 0; k < 4; k++) {
873 frag =
s->all_fragments +
888#if CONFIG_VP4_DECODER
891 return last_motion < 0 ? -v : v;
906 int last_motion_x = 0;
907 int last_motion_y = 0;
908 int prior_last_motion_x = 0;
909 int prior_last_motion_y = 0;
910 int last_gold_motion_x = 0;
911 int last_gold_motion_y = 0;
912 int current_macroblock;
913 int current_fragment;
920 coding_mode =
s->version < 2 ?
get_bits1(gb) : 2;
924 for (
int sb_y = 0; sb_y <
s->y_superblock_height; sb_y++) {
925 for (
int sb_x = 0; sb_x <
s->y_superblock_width; sb_x++) {
929 for (
int j = 0; j < 4; j++) {
930 int mb_x = 2 * sb_x + (j >> 1);
931 int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
932 current_macroblock = mb_y *
s->macroblock_width + mb_x;
934 if (mb_x >=
s->macroblock_width ||
935 mb_y >=
s->macroblock_height ||
936 s->macroblock_coding[current_macroblock] ==
MODE_COPY)
939 switch (
s->macroblock_coding[current_macroblock]) {
941 if (coding_mode == 2) {
942 last_gold_motion_x = motion_x[0] =
vp4_get_mv(gb, 0, last_gold_motion_x);
943 last_gold_motion_y = motion_y[0] =
vp4_get_mv(gb, 1, last_gold_motion_y);
949 if (coding_mode == 0) {
954 }
else if (coding_mode == 1) {
958 motion_x[0] =
vp4_get_mv(gb, 0, last_motion_x);
959 motion_y[0] =
vp4_get_mv(gb, 1, last_motion_y);
964 prior_last_motion_x = last_motion_x;
965 prior_last_motion_y = last_motion_y;
966 last_motion_x = motion_x[0];
967 last_motion_y = motion_y[0];
973 prior_last_motion_x = last_motion_x;
974 prior_last_motion_y = last_motion_y;
978 for (
int k = 0; k < 4; k++) {
980 if (
s->all_fragments[current_fragment].coding_method !=
MODE_COPY) {
981 if (coding_mode == 0) {
986 }
else if (coding_mode == 1) {
990 motion_x[k] =
vp4_get_mv(gb, 0, prior_last_motion_x);
991 motion_y[k] =
vp4_get_mv(gb, 1, prior_last_motion_y);
993 last_motion_x = motion_x[k];
994 last_motion_y = motion_y[k];
1004 motion_x[0] = last_motion_x;
1005 motion_y[0] = last_motion_y;
1014 motion_x[0] = prior_last_motion_x;
1015 motion_y[0] = prior_last_motion_y;
1018 prior_last_motion_x = last_motion_x;
1019 prior_last_motion_y = last_motion_y;
1020 last_motion_x = motion_x[0];
1021 last_motion_y = motion_y[0];
1034 for (
int k = 0; k < 4; k++) {
1038 s->motion_val[0][current_fragment][0] = motion_x[k];
1039 s->motion_val[0][current_fragment][1] = motion_y[k];
1041 s->motion_val[0][current_fragment][0] = motion_x[0];
1042 s->motion_val[0][current_fragment][1] = motion_y[0];
1046 if (
s->chroma_y_shift) {
1048 motion_x[0] =
RSHIFT(motion_x[0] + motion_x[1] +
1049 motion_x[2] + motion_x[3], 2);
1050 motion_y[0] =
RSHIFT(motion_y[0] + motion_y[1] +
1051 motion_y[2] + motion_y[3], 2);
1053 if (
s->version <= 2) {
1054 motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
1055 motion_y[0] = (motion_y[0] >> 1) | (motion_y[0] & 1);
1057 frag = mb_y *
s->fragment_width[1] + mb_x;
1058 s->motion_val[1][frag][0] = motion_x[0];
1059 s->motion_val[1][frag][1] = motion_y[0];
1060 }
else if (
s->chroma_x_shift) {
1062 motion_x[0] =
RSHIFT(motion_x[0] + motion_x[1], 1);
1063 motion_y[0] =
RSHIFT(motion_y[0] + motion_y[1], 1);
1064 motion_x[1] =
RSHIFT(motion_x[2] + motion_x[3], 1);
1065 motion_y[1] =
RSHIFT(motion_y[2] + motion_y[3], 1);
1067 motion_x[1] = motion_x[0];
1068 motion_y[1] = motion_y[0];
1070 if (
s->version <= 2) {
1071 motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
1072 motion_x[1] = (motion_x[1] >> 1) | (motion_x[1] & 1);
1074 frag = 2 * mb_y *
s->fragment_width[1] + mb_x;
1075 for (
int k = 0; k < 2; k++) {
1076 s->motion_val[1][frag][0] = motion_x[k];
1077 s->motion_val[1][frag][1] = motion_y[k];
1078 frag +=
s->fragment_width[1];
1081 for (
int k = 0; k < 4; k++) {
1084 s->motion_val[1][frag][0] = motion_x[k];
1085 s->motion_val[1][frag][1] = motion_y[k];
1087 s->motion_val[1][frag][0] = motion_x[0];
1088 s->motion_val[1][frag][1] = motion_y[0];
1101 int num_blocks =
s->total_num_coded_frags;
1103 for (
int qpi = 0; qpi <
s->nqps - 1 && num_blocks > 0; qpi++) {
1104 int i = 0, blocks_decoded = 0, num_blocks_at_qpi = 0;
1105 int bit, run_length;
1118 if (run_length == 34)
1120 blocks_decoded += run_length;
1123 num_blocks_at_qpi += run_length;
1125 for (
int j = 0; j < run_length;
i++) {
1126 if (
i >=
s->total_num_coded_frags)
1129 if (
s->all_fragments[
s->coded_fragment_list[0][
i]].qpi == qpi) {
1130 s->all_fragments[
s->coded_fragment_list[0][
i]].qpi +=
bit;
1134 }
while (blocks_decoded < num_blocks &&
get_bits_left(gb) > 0);
1136 num_blocks -= num_blocks_at_qpi;
1152 int bits_to_get, zero_run;
1156 bits_to_get =
get_bits(gb, bits_to_get);
1179 const VLCElem *vlc_table,
int coeff_index,
1189 int num_coeffs =
s->num_coded_frags[plane][coeff_index];
1190 int16_t *dct_tokens =
s->dct_tokens[plane][coeff_index];
1193 const int *coded_fragment_list =
s->coded_fragment_list[plane];
1196 if (num_coeffs < 0) {
1198 "Invalid number of coefficients at level %d\n", coeff_index);
1202 if (eob_run > num_coeffs) {
1204 blocks_ended = num_coeffs;
1205 eob_run -= num_coeffs;
1208 blocks_ended = eob_run;
1214 dct_tokens[j++] = blocks_ended << 2;
1218 token =
get_vlc2(gb, vlc_table, 11, 3);
1220 if ((
unsigned) token <= 6U) {
1227 if (eob_run > num_coeffs - coeff_i) {
1228 dct_tokens[j++] =
TOKEN_EOB(num_coeffs - coeff_i);
1229 blocks_ended += num_coeffs - coeff_i;
1230 eob_run -= num_coeffs - coeff_i;
1231 coeff_i = num_coeffs;
1234 blocks_ended += eob_run;
1238 }
else if (token >= 0) {
1249 all_fragments[coded_fragment_list[coeff_i]].
dc =
coeff;
1254 if (coeff_index + zero_run > 64) {
1256 "Invalid zero run of %d with %d coeffs left\n",
1257 zero_run, 64 - coeff_index);
1258 zero_run = 64 - coeff_index;
1263 for (
int i = coeff_index + 1;
i <= coeff_index + zero_run;
i++)
1264 s->num_coded_frags[plane][
i]--;
1272 if (blocks_ended >
s->num_coded_frags[plane][coeff_index])
1278 for (
int i = coeff_index + 1;
i < 64;
i++)
1279 s->num_coded_frags[plane][
i] -= blocks_ended;
1283 s->dct_tokens[plane + 1][coeff_index] = dct_tokens + j;
1284 else if (coeff_index < 63)
1285 s->dct_tokens[0][coeff_index + 1] = dct_tokens + j;
1293 int fragment_height);
1305 int residual_eob_run = 0;
1306 const VLCElem *y_tables[64], *c_tables[64];
1308 s->dct_tokens[0][0] =
s->dct_tokens_base;
1319 0, residual_eob_run);
1320 if (residual_eob_run < 0)
1321 return residual_eob_run;
1330 1, residual_eob_run);
1331 if (residual_eob_run < 0)
1332 return residual_eob_run;
1334 2, residual_eob_run);
1335 if (residual_eob_run < 0)
1336 return residual_eob_run;
1341 s->fragment_width[1],
s->fragment_height[1]);
1343 s->fragment_width[1],
s->fragment_height[1]);
1353 for (
int i = 1;
i <= 5;
i++) {
1358 for (
int i = 6;
i <= 14;
i++) {
1363 for (
int i = 15;
i <= 27;
i++) {
1368 for (
int i = 28;
i <= 63;
i++) {
1375 for (
int i = 1;
i <= 63;
i++) {
1377 0, residual_eob_run);
1378 if (residual_eob_run < 0)
1379 return residual_eob_run;
1382 1, residual_eob_run);
1383 if (residual_eob_run < 0)
1384 return residual_eob_run;
1386 2, residual_eob_run);
1387 if (residual_eob_run < 0)
1388 return residual_eob_run;
1394#if CONFIG_VP4_DECODER
1403 int plane,
int eob_tracker[64],
int fragment)
1411 while (!eob_tracker[coeff_i]) {
1418 if ((
unsigned) token <= 6U) {
1420 *
s->dct_tokens[plane][coeff_i]++ =
TOKEN_EOB(0);
1421 eob_tracker[coeff_i] = eob_run - 1;
1423 }
else if (token >= 0) {
1427 if (coeff_i + zero_run > 64) {
1429 "Invalid zero run of %d with %d coeffs left\n",
1430 zero_run, 64 - coeff_i);
1431 zero_run = 64 - coeff_i;
1434 coeff_i += zero_run;
1449 *
s->dct_tokens[plane][coeff_i]++ =
TOKEN_EOB(0);
1450 eob_tracker[coeff_i]--;
1462 for (
int i = 0;
i < 4;
i++)
1463 dc_pred[0][
i + 1] =
s->dc_pred_row[sb_x * 4 +
i];
1465 for (
int j = 1; j < 5; j++)
1466 for (
int i = 0;
i < 4;
i++)
1467 vp4_dc_predictor_reset(&dc_pred[j][
i + 1]);
1472 for (
int i = 0;
i < 4;
i++)
1473 s->dc_pred_row[sb_x * 4 +
i] = dc_pred[4][
i + 1];
1475 for (
int i = 1;
i < 5;
i++)
1476 dc_pred[
i][0] = dc_pred[
i][4];
1486 dc += dc_pred[-6].
dc;
1491 dc += dc_pred[6].
dc;
1495 if (count != 2 && dc_pred[-1].
type ==
type) {
1496 dc += dc_pred[-1].
dc;
1500 if (count != 2 && dc_pred[1].
type ==
type) {
1501 dc += dc_pred[1].
dc;
1506 return count == 2 ? dc / 2 : last_dc[
type];
1511 int16_t *
base =
s->dct_tokens_base;
1512 for (
int plane = 0; plane < 3; plane++) {
1513 for (
int i = 0;
i < 64;
i++) {
1514 s->dct_tokens[plane][
i] =
base;
1515 base +=
s->fragment_width[!!plane] *
s->fragment_height[!!plane];
1528 int eob_tracker[64];
1547 for (
int i = 1;
i <= 5;
i++) {
1552 for (
int i = 6;
i <= 14;
i++) {
1557 for (
int i = 15;
i <= 27;
i++) {
1562 for (
int i = 28;
i <= 63;
i++) {
1568 vp4_set_tokens_base(
s);
1570 memset(last_dc, 0,
sizeof(last_dc));
1573 memset(eob_tracker, 0,
sizeof(eob_tracker));
1576 for (
int i = 0;
i <
s->fragment_width[!!plane];
i++)
1577 vp4_dc_predictor_reset(&
s->dc_pred_row[
i]);
1579 for (
int j = 0; j < 6; j++)
1580 for (
int i = 0;
i < 6;
i++)
1581 vp4_dc_predictor_reset(&dc_pred[j][
i]);
1583 for (
int sb_y = 0; sb_y * 4 <
s->fragment_height[!!plane]; sb_y++) {
1584 for (
int sb_x = 0; sb_x *4 <
s->fragment_width[!!plane]; sb_x++) {
1585 vp4_dc_pred_before(
s, dc_pred, sb_x);
1586 for (
int j = 0; j < 16; j++) {
1589 int x = 4 * sb_x + hx;
1590 int y = 4 * sb_y + hy;
1594 if (x >=
s->fragment_width[!!plane] || y >=
s->fragment_height[!!plane])
1597 fragment =
s->fragment_start[plane] + y *
s->fragment_width[!!plane] + x;
1602 if (vp4_unpack_vlcs(
s, gb,
tables[!!plane], plane, eob_tracker,
fragment) < 0)
1608 vp4_dc_pred(
s, this_dc_pred, last_dc, dc_block_type, plane);
1610 this_dc_pred->
type = dc_block_type,
1611 this_dc_pred->
dc = last_dc[dc_block_type] =
s->all_fragments[
fragment].dc;
1613 vp4_dc_pred_after(
s, dc_pred, sb_x);
1618 vp4_set_tokens_base(
s);
1629#define COMPATIBLE_FRAME(x) \
1630 (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
1631#define DC_COEFF(u) s->all_fragments[u].dc
1636 int fragment_height)
1643 int i = first_fragment;
1648 int vl, vul, vu, vur;
1660 static const int predictor_transform[16][4] = {
1674 { -104, 116, 0, 116 },
1676 { -104, 116, 0, 116 }
1685 static const unsigned char compatible_frame[9] = {
1696 int current_frame_type;
1712 for (
int y = 0; y < fragment_height; y++) {
1714 for (
int x = 0; x < fragment_width; x++,
i++) {
1717 if (
s->all_fragments[
i].coding_method !=
MODE_COPY) {
1718 current_frame_type =
1719 compatible_frame[
s->all_fragments[
i].coding_method];
1729 u =
i - fragment_width;
1734 ul =
i - fragment_width - 1;
1739 if (x + 1 < fragment_width) {
1740 ur =
i - fragment_width + 1;
1750 predicted_dc = last_dc[current_frame_type];
1754 (predictor_transform[
transform][0] * vul) +
1755 (predictor_transform[
transform][1] * vu) +
1756 (predictor_transform[
transform][2] * vur) +
1757 (predictor_transform[
transform][3] * vl);
1759 predicted_dc /= 128;
1764 if (
FFABS(predicted_dc - vu) > 128)
1766 else if (
FFABS(predicted_dc - vl) > 128)
1768 else if (
FFABS(predicted_dc - vul) > 128)
1776 last_dc[current_frame_type] =
DC_COEFF(
i);
1783 int ystart,
int yend)
1785 int *bounding_values =
s->bounding_values_array + 127;
1787 int width =
s->fragment_width[!!plane];
1788 int height =
s->fragment_height[!!plane];
1790 ptrdiff_t
stride =
s->current_frame.f->linesize[plane];
1791 uint8_t *plane_data =
s->current_frame.f->data[plane];
1792 if (!
s->flipped_image)
1794 plane_data +=
s->data_offset[plane] + 8 * ystart *
stride;
1796 for (
int y = ystart; y < yend; y++) {
1797 for (
int x = 0; x <
width; x++) {
1805 s->vp3dsp.h_loop_filter(
1807 stride, bounding_values);
1812 s->vp3dsp.v_loop_filter(
1814 stride, bounding_values);
1820 if ((x <
width - 1) &&
1822 s->vp3dsp.h_loop_filter(
1823 plane_data + 8 * x + 8,
1824 stride, bounding_values);
1832 s->vp3dsp.v_loop_filter(
1833 plane_data + 8 * x + 8 *
stride,
1834 stride, bounding_values);
1840 plane_data += 8 *
stride;
1849 int plane,
int inter, int16_t
block[64])
1851 const int16_t *dequantizer =
s->qmat[frag->
qpi][inter][plane];
1852 const uint8_t *
perm =
s->idct_scantable;
1856 int token = *
s->dct_tokens[plane][
i];
1857 switch (token & 3) {
1860 s->dct_tokens[plane][
i]++;
1862 *
s->dct_tokens[plane][
i] = token & ~3;
1865 s->dct_tokens[plane][
i]++;
1866 i += (token >> 2) & 0x7f;
1876 s->dct_tokens[plane][
i++]++;
1886 block[0] = frag->
dc *
s->qmat[0][inter][plane][0];
1899 int y_flipped =
s->flipped_image ?
s->height - y : y;
1905 y_flipped ==
s->height ? INT_MAX
1909 if (!
s->avctx->draw_horiz_band)
1912 h = y -
s->last_slice_end;
1913 s->last_slice_end = y;
1916 if (!
s->flipped_image)
1917 y =
s->height - y -
h;
1919 cy = y >>
s->chroma_y_shift;
1920 offset[0] =
s->current_frame.f->linesize[0] * y;
1921 offset[1] =
s->current_frame.f->linesize[1] * cy;
1922 offset[2] =
s->current_frame.f->linesize[2] * cy;
1926 s->avctx->draw_horiz_band(
s->avctx,
s->current_frame.f,
offset, y, 3,
h);
1934 int motion_y,
int y)
1938 int border = motion_y & 1;
1946 ref_row = y + (motion_y >> 1);
1947 ref_row =
FFMAX(
FFABS(ref_row), ref_row + 8 + border);
1952#if CONFIG_VP4_DECODER
1956static int vp4_mc_loop_filter(
Vp3DecodeContext *
s,
int plane,
int motion_x,
int motion_y,
int bx,
int by,
1957 const uint8_t *motion_source, ptrdiff_t
stride,
1958 int src_x,
int src_y, uint8_t *
temp)
1960 int motion_shift = plane ? 4 : 2;
1961 int subpel_mask = plane ? 3 : 1;
1962 int *bounding_values =
s->bounding_values_array + 127;
1966 int x_subpel, y_subpel;
1967 int x_offset, y_offset;
1969 int block_width = plane ? 8 : 16;
1970 int plane_width =
s->width >> (plane &&
s->chroma_x_shift);
1971 int plane_height =
s->height >> (plane &&
s->chroma_y_shift);
1973#define loop_stride 12
1974 uint8_t
loop[12 * loop_stride];
1977 x = 8 * bx + motion_x / motion_shift;
1978 y = 8 * by + motion_y / motion_shift;
1980 x_subpel = motion_x & subpel_mask;
1981 y_subpel = motion_y & subpel_mask;
1983 if (x_subpel || y_subpel) {
1993 x2 = x + block_width;
1994 y2 = y + block_width;
1996 if (x2 < 0 || x2 >= plane_width || y2 < 0 || y2 >= plane_height)
1999 x_offset = (-(x + 2) & 7) + 2;
2000 y_offset = (-(y + 2) & 7) + 2;
2002 av_assert1(!(x_offset > 8 + x_subpel && y_offset > 8 + y_subpel));
2004 s->vdsp.emulated_edge_mc(
loop, motion_source -
stride - 1,
2006 12, 12, src_x - 1, src_y - 1,
2010 if (x_offset <= 8 + x_subpel)
2013 if (y_offset <= 8 + y_subpel)
2021 if (!x_offset && !y_offset)
2024 s->vdsp.emulated_edge_mc(
loop, motion_source -
stride - 1,
2026 12, 12, src_x - 1, src_y - 1,
2030#define safe_loop_filter(name, ptr, stride, bounding_values) \
2031 if (VP3_LOOP_FILTER_NO_UNALIGNED_SUPPORT && (uintptr_t)(ptr) & 7) \
2032 s->vp3dsp.name##_unaligned(ptr, stride, bounding_values); \
2034 s->vp3dsp.name(ptr, stride, bounding_values);
2037 safe_loop_filter(h_loop_filter,
loop + loop_stride + x_offset + 1, loop_stride, bounding_values);
2040 safe_loop_filter(v_loop_filter,
loop + (y_offset + 1)*loop_stride + 1, loop_stride, bounding_values);
2043 for (
int i = 0;
i < 9;
i++)
2056 int16_t *
block =
s->block;
2057 int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef;
2062 const AVFrame *last_frame =
s->last_frame.f ?
2063 s->last_frame.f :
s->current_frame.f;
2064 const AVFrame *golden_frame =
s->golden_frame.f ?
2065 s->golden_frame.f :
s->current_frame.f;
2066 int motion_halfpel_index;
2069 if (slice >=
s->c_superblock_height)
2072 for (
int plane = 0; plane < 3; plane++) {
2074 s->data_offset[plane];
2075 const uint8_t *last_plane = last_frame->
data[plane] +
2076 s->data_offset[plane];
2077 const uint8_t *golden_plane = golden_frame->
data[plane] +
2078 s->data_offset[plane];
2079 ptrdiff_t
stride =
s->current_frame.f->linesize[plane];
2080 int plane_width =
s->width >> (plane &&
s->chroma_x_shift);
2081 int plane_height =
s->height >> (plane &&
s->chroma_y_shift);
2082 const int8_t (*motion_val)[2] =
s->motion_val[!!plane];
2084 int sb_y = slice << (!plane &&
s->chroma_y_shift);
2085 int slice_height = sb_y + 1 + (!plane &&
s->chroma_y_shift);
2086 int slice_width = plane ?
s->c_superblock_width
2087 :
s->y_superblock_width;
2089 int fragment_width =
s->fragment_width[!!plane];
2090 int fragment_height =
s->fragment_height[!!plane];
2091 int fragment_start =
s->fragment_start[plane];
2093 int do_await = !plane && HAVE_THREADS &&
2096 if (!
s->flipped_image)
2102 for (; sb_y < slice_height; sb_y++) {
2104 for (
int sb_x = 0; sb_x < slice_width; sb_x++) {
2106 for (
int j = 0; j < 16; j++) {
2109 int fragment = y * fragment_width + x;
2114 if (x >= fragment_width || y >= fragment_height)
2117 first_pixel = 8 * y *
stride + 8 * x;
2123 (16 * y) >>
s->chroma_y_shift);
2126 if (
s->all_fragments[
i].coding_method !=
MODE_COPY) {
2127 const uint8_t *motion_source;
2130 motion_source = golden_plane;
2132 motion_source = last_plane;
2134 motion_source += first_pixel;
2135 motion_halfpel_index = 0;
2139 if ((
s->all_fragments[
i].coding_method >
MODE_INTRA) &&
2142 int standard_mc = 1;
2143 motion_x = motion_val[
fragment][0];
2144 motion_y = motion_val[
fragment][1];
2145#if CONFIG_VP4_DECODER
2146 if (plane &&
s->version >= 2) {
2147 motion_x = (motion_x >> 1) | (motion_x & 1);
2148 motion_y = (motion_y >> 1) | (motion_y & 1);
2152 src_x = (motion_x >> 1) + 8 * x;
2153 src_y = (motion_y >> 1) + 8 * y;
2155 motion_halfpel_index = motion_x & 0x01;
2156 motion_source += (motion_x >> 1);
2158 motion_halfpel_index |= (motion_y & 0x01) << 1;
2159 motion_source += ((motion_y >> 1) *
stride);
2161#if CONFIG_VP4_DECODER
2162 if (
s->version >= 2) {
2163 uint8_t *
temp =
s->edge_emu_buffer;
2166 if (vp4_mc_loop_filter(
s, plane, motion_val[
fragment][0], motion_val[
fragment][1], x, y, motion_source,
stride, src_x, src_y,
temp)) {
2167 motion_source =
temp;
2173 if (standard_mc && (
2174 src_x < 0 || src_y < 0 ||
2175 src_x + 9 >= plane_width ||
2176 src_y + 9 >= plane_height)) {
2177 uint8_t *
temp =
s->edge_emu_buffer;
2181 s->vdsp.emulated_edge_mc(
temp, motion_source,
2186 motion_source =
temp;
2197 if (motion_halfpel_index != 3) {
2198 s->hdsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
2200 motion_source,
stride, 8);
2204 int d = (motion_x ^ motion_y) >> 31;
2207 motion_source +
stride + 1 + d,
2233 s->hdsp.put_pixels_tab[1][0](
2235 last_plane + first_pixel,
2242 if (
s->version < 2 && !
s->skip_loop_filter)
2244 FFMIN(4 * sb_y + 3, fragment_height - 1));
2282#if CONFIG_VP4_DECODER
2283 for (
int j = 0; j < 2; j++)
2284 for (
int i = 0;
i < 7;
i++) {
2285 vp4_mv_vlc_table[j][
i] =
2293 for (
int i = 0;
i < 2;
i++) {
2294 block_pattern_vlc[
i] =
2306 int y_fragment_count, c_fragment_count;
2310 y_fragment_count =
s->fragment_width[0] *
s->fragment_height[0];
2311 c_fragment_count =
s->fragment_width[1] *
s->fragment_height[1];
2314 s->superblock_coding =
av_mallocz(
FFMAX(
s->superblock_count,
s->yuv_macroblock_count));
2315 s->all_fragments =
av_calloc(
s->fragment_count,
sizeof(*
s->all_fragments));
2317 s-> kf_coded_fragment_list =
av_calloc(
s->fragment_count,
sizeof(
int));
2318 s->nkf_coded_fragment_list =
av_calloc(
s->fragment_count,
sizeof(
int));
2319 memset(
s-> num_kf_coded_fragment, -1,
sizeof(
s-> num_kf_coded_fragment));
2322 64 *
sizeof(*
s->dct_tokens_base));
2323 s->motion_val[0] =
av_calloc(y_fragment_count,
sizeof(*
s->motion_val[0]));
2324 s->motion_val[1] =
av_calloc(c_fragment_count,
sizeof(*
s->motion_val[1]));
2327 s->superblock_fragments =
av_calloc(
s->superblock_count, 16 *
sizeof(
int));
2328 s->macroblock_coding =
av_mallocz(
s->macroblock_count + 1);
2330 s->dc_pred_row =
av_malloc_array(
s->y_superblock_width * 4,
sizeof(*
s->dc_pred_row));
2332 if (!
s->superblock_coding || !
s->all_fragments ||
2333 !
s->dct_tokens_base || !
s->kf_coded_fragment_list ||
2334 !
s->nkf_coded_fragment_list ||
2335 !
s->superblock_fragments || !
s->macroblock_coding ||
2337 !
s->motion_val[0] || !
s->motion_val[1]) {
2362 int y_fragment_count, c_fragment_count;
2366#if !CONFIG_VP4_DECODER
2387 for (
int i = 0;
i < 64;
i++) {
2388#define TRANSPOSE(x) (((x) >> 3) | (((x) & 7) << 3))
2396 for (
int i = 0;
i < 3;
i++)
2403 s->y_superblock_width = (
s->width + 31) / 32;
2404 s->y_superblock_height = (
s->height + 31) / 32;
2405 s->y_superblock_count =
s->y_superblock_width *
s->y_superblock_height;
2408 c_width =
s->width >>
s->chroma_x_shift;
2409 c_height =
s->height >>
s->chroma_y_shift;
2410 s->c_superblock_width = (c_width + 31) / 32;
2411 s->c_superblock_height = (c_height + 31) / 32;
2412 s->c_superblock_count =
s->c_superblock_width *
s->c_superblock_height;
2414 s->superblock_count =
s->y_superblock_count + (
s->c_superblock_count * 2);
2415 s->u_superblock_start =
s->y_superblock_count;
2416 s->v_superblock_start =
s->u_superblock_start +
s->c_superblock_count;
2418 s->macroblock_width = (
s->width + 15) / 16;
2419 s->macroblock_height = (
s->height + 15) / 16;
2420 s->macroblock_count =
s->macroblock_width *
s->macroblock_height;
2421 s->c_macroblock_width = (c_width + 15) / 16;
2422 s->c_macroblock_height = (c_height + 15) / 16;
2423 s->c_macroblock_count =
s->c_macroblock_width *
s->c_macroblock_height;
2424 s->yuv_macroblock_count =
s->macroblock_count + 2 *
s->c_macroblock_count;
2428 s->fragment_width[1] =
s->fragment_width[0] >>
s->chroma_x_shift;
2429 s->fragment_height[1] =
s->fragment_height[0] >>
s->chroma_y_shift;
2432 y_fragment_count =
s->fragment_width[0] *
s->fragment_height[0];
2433 c_fragment_count =
s->fragment_width[1] *
s->fragment_height[1];
2434 s->fragment_count = y_fragment_count + 2 * c_fragment_count;
2435 s->fragment_start[1] = y_fragment_count;
2436 s->fragment_start[2] = y_fragment_count + c_fragment_count;
2438 if (!
s->theora_tables) {
2439 for (
int i = 0;
i < 64;
i++) {
2449 for (
int inter = 0; inter < 2; inter++) {
2450 for (
int plane = 0; plane < 3; plane++) {
2451 s->qr_count[inter][plane] = 1;
2452 s->qr_size[inter][plane][0] = 63;
2453 s->qr_base[inter][plane][0] =
2454 s->qr_base[inter][plane][1] = 2 * inter + (!!plane) * !inter;
2465 s->coeff_vlc = vlcs;
2467 if (!
s->theora_tables) {
2468 const uint8_t (*bias_tabs)[32][2];
2474 &bias_tabs[
i][0][1], 2,
2475 &bias_tabs[
i][0][0], 2, 1,
2486 &
tab->entries[0].len,
sizeof(*
tab->entries),
2487 &
tab->entries[0].sym,
sizeof(*
tab->entries), 1,
2512 int qps_changed = 0;
2519 for (
int i = 0;
i < 3;
i++) {
2520 if (
s->qps[
i] != s1->
qps[1]) {
2522 memcpy(&
s->qmat[
i], &s1->
qmat[
i],
sizeof(
s->qmat[
i]));
2526 if (
s->qps[0] != s1->
qps[0])
2528 sizeof(
s->bounding_values_array));
2531 memcpy(
s->qps, s1->
qps,
sizeof(
s->qps));
2542 const uint8_t *buf = avpkt->
data;
2543 int buf_size = avpkt->
size;
2551#if CONFIG_THEORA_DECODER
2557 av_log(avctx,
AV_LOG_ERROR,
"midstream reconfiguration with multithreading is unsupported, try -threads 1\n");
2571 }
else if (
type == 2) {
2584 "Header packet passed to frame decoder, skipping\n");
2590 if (!
s->all_fragments) {
2598 for (
int i = 0;
i < 3;
i++)
2599 last_qps[
i] =
s->qps[
i];
2604 }
while (
s->theora >= 0x030200 &&
s->nqps < 3 &&
get_bits1(&gb));
2605 for (
int i =
s->nqps;
i < 3;
i++)
2610 s->keyframe ?
"key" :
"", avctx->
frame_num + 1,
s->qps[0]);
2612 s->skip_loop_filter = !
s->filter_limit_values[
s->qps[0]] ||
2616 if (
s->qps[0] != last_qps[0])
2619 for (
int i = 0;
i <
s->nqps;
i++)
2622 if (
s->qps[
i] != last_qps[
i] ||
s->qps[0] != last_qps[0])
2643 if (!
s->edge_emu_buffer) {
2644 s->edge_emu_buffer =
av_malloc(9 *
FFABS(
s->current_frame.f->linesize[0]));
2645 if (!
s->edge_emu_buffer) {
2657#if !CONFIG_VP4_DECODER
2667 "VP version: %d\n",
s->version);
2670 if (
s->version ||
s->theora) {
2673 "Warning, unsupported keyframe coding type?!\n");
2676#if CONFIG_VP4_DECODER
2677 if (
s->version >= 2) {
2678 int mb_height, mb_width;
2679 int mb_width_mul, mb_width_div, mb_height_mul, mb_height_div;
2683 if (mb_height !=
s->macroblock_height ||
2684 mb_width !=
s->macroblock_width)
2691 if (mb_width_mul != 1 || mb_width_div != 1 || mb_height_mul != 1 || mb_height_div != 1)
2701 if (!
s->golden_frame.f) {
2703 "vp3: first frame not a keyframe\n");
2715 memset(
s->all_fragments, 0,
s->fragment_count *
sizeof(
Vp3Fragment));
2717 if (
s->version < 2) {
2722#if CONFIG_VP4_DECODER
2724 if ((ret = vp4_unpack_macroblocks(
s, &gb)) < 0) {
2743 if (
s->version < 2) {
2748#if CONFIG_VP4_DECODER
2750 if ((ret = vp4_unpack_dct_coeffs(
s, &gb)) < 0) {
2757 for (
int i = 0;
i < 3;
i++) {
2758 int height =
s->height >> (
i &&
s->chroma_y_shift);
2759 if (
s->flipped_image)
2760 s->data_offset[
i] = 0;
2762 s->data_offset[
i] = (
height - 1) *
s->current_frame.f->linesize[
i];
2765 s->last_slice_end = 0;
2766 for (
int i = 0;
i <
s->c_superblock_height;
i++)
2771 for (
int i = 0;
i < 3;
i++) {
2772 int row = (
s->height >> (3 + (
i &&
s->chroma_y_shift))) - 1;
2783 frame->crop_left =
s->offset_x;
2785 frame->crop_top =
s->offset_y;
2809 ff_dlog(avctx,
"code length %d, curr entry %d, token %d\n",
2827#if CONFIG_THEORA_DECODER
2835 int visible_width, visible_height, colorspace;
2836 uint8_t offset_x = 0, offset_y = 0;
2843 s->theora_header = 0;
2853 if (
s->theora < 0x030200) {
2854 s->flipped_image = 1;
2856 "Old (<alpha3) Theora bitstream, flipped image\n");
2864 if (
s->theora >= 0x030200) {
2874 visible_width + offset_x >
s->width ||
2875 visible_height + offset_y >
s->height ||
2876 visible_width + 512 <
s->width ||
2877 visible_height + 512 <
s->height ||
2881 "Invalid frame dimensions - w:%d h:%d x:%d y:%d (%dx%d).\n",
2882 visible_width, visible_height, offset_x, offset_y,
2883 s->width,
s->height);
2889 if (fps.
num && fps.
den) {
2890 if (fps.
num < 0 || fps.
den < 0) {
2895 fps.
den, fps.
num, 1 << 30);
2900 if (aspect.
num && aspect.
den) {
2903 aspect.
num, aspect.
den, 1 << 30);
2907 if (
s->theora < 0x030200)
2914 if (
s->theora >= 0x030200) {
2931 avctx->
width = visible_width;
2932 avctx->
height = visible_height;
2935 s->offset_x = offset_x;
2936 s->offset_y =
s->height - visible_height - offset_y;
2939 if (colorspace == 1)
2941 else if (colorspace == 2)
2944 if (colorspace == 1 || colorspace == 2) {
2949 s->theora_header = 1;
2956 int n, matrices, ret;
2958 if (!
s->theora_header)
2961 if (
s->theora >= 0x030200) {
2965 for (
int i = 0;
i < 64;
i++)
2969 if (
s->theora >= 0x030200)
2974 for (
int i = 0;
i < 64;
i++)
2975 s->coded_ac_scale_factor[
i] =
get_bits(gb, n);
2977 if (
s->theora >= 0x030200)
2982 for (
int i = 0;
i < 64;
i++)
2983 s->coded_dc_scale_factor[0][
i] =
2984 s->coded_dc_scale_factor[1][
i] =
get_bits(gb, n);
2986 if (
s->theora >= 0x030200)
2991 if (matrices > 384) {
2996 for (
int j = 0; j < matrices; j++)
2997 for (
int i = 0;
i < 64;
i++)
3000 for (
int inter = 0; inter <= 1; inter++) {
3001 for (
int plane = 0; plane <= 2; plane++) {
3003 if (inter || plane > 0)
3011 qtj = (3 * inter + plane - 1) / 3;
3012 plj = (plane + 2) % 3;
3014 s->qr_count[inter][plane] =
s->qr_count[qtj][plj];
3015 memcpy(
s->qr_size[inter][plane],
s->qr_size[qtj][plj],
3016 sizeof(
s->qr_size[0][0]));
3017 memcpy(
s->qr_base[inter][plane],
s->qr_base[qtj][plj],
3018 sizeof(
s->qr_base[0][0]));
3025 if (
i >= matrices) {
3027 "invalid base matrix index\n");
3030 s->qr_base[inter][plane][qri] =
i;
3034 s->qr_size[inter][plane][qri++] =
i;
3042 s->qr_count[inter][plane] = qri;
3049 s->huffman_table[
i].nb_entries = 0;
3054 s->theora_tables = 1;
3064 const uint8_t *header_start[3];
3078 42, header_start, header_len) < 0) {
3083 for (
int i = 0;
i < 3;
i++) {
3084 if (header_len[
i] <= 0)
3092 if (!(ptype & 0x80)) {
3115 "Unknown Theora config packet: %d\n", ptype & ~0x80);
3120 "%d bits left in packet %X\n",
3122 if (
s->theora < 0x030200)
3135 .
init = theora_decode_init,
3165#if CONFIG_VP4_DECODER
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_theora_decoder
const FFCodec ff_vp3_decoder
const FFCodec ff_vp4_decoder
static av_cold void close(AVCodecParserContext *s)
static const VLCElem * coeff_vlc[2][8][4]
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Libavcodec external API header.
#define FF_THREAD_FRAME
Decode more than one frame at once.
#define FF_DEBUG_PICT_INFO
#define i(width, name, range_min, range_max)
#define bit(string, value)
#define UPDATE_THREAD_CONTEXT(func)
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
Do nothing if dst and src already refer to the same AVFrame; otherwise unreference dst and if src is ...
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset)
Allows to synchronize objects whose lifetime is the whole decoding process among all frame threads.
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
Wrapper around ff_progress_frame_alloc() and ff_thread_get_buffer().
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
int(* init)(AVBSFContext *ctx)
static struct @346255127015250356166251341105367306144006377143 state
static const uint8_t bits[8]
#define AV_NUM_DATA_POINTERS
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int get_bits_left(GetBitContext *gb)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_CODEC_FLAG2_IGNORE_CROP
Discard cropping information from SPS.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
@ AVDISCARD_ALL
discard all
@ AVDISCARD_NONKEY
discard all frames except keyframes
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
static const int8_t transform[32][32]
static VLCElem vlc_tables[VLC_TABLES_SIZE]
static void output_plane(const Plane *plane, int buf_sel, uint8_t *dst, ptrdiff_t dst_pitch, int dst_height)
Convert and output the current plane.
const uint8_t ff_mjpeg_std_chrominance_quant_tbl[64]
#define u(width, name, range_min, range_max)
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Multithreading API for decoders.
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
void ff_vp3dsp_set_bounding_values(int *bounding_values_array, int filter_limit)
av_cold void ff_vp3dsp_init(VP3DSPContext *c)
Macro definitions for various function/variable attributes.
static int ff_thread_once(char *control, void(*routine)(void))
#define FFSWAP(type, a, b)
#define MKTAG(a, b, c, d)
const uint8_t ff_zigzag_direct[64]
static void body(uint32_t ABCD[4], const uint8_t *src, size_t nblocks)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
@ AVCOL_PRI_BT470M
also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
@ AVCOL_TRC_BT709
also ITU-R BT1361
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
static void * av_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(AVRefStructOpaque opaque, void *obj))
A wrapper around av_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
#define FF_ARRAY_ELEMS(a)
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int flags2
AV_CODEC_FLAG2_*.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
int64_t frame_num
Frame counter, set by libavcodec.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
enum AVDiscard skip_loop_filter
Skip loop filtering for selected frames.
enum AVColorSpace colorspace
YUV colorspace type.
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
int coded_width
Bitstream width / height, may be different from width/height e.g.
enum AVDiscard skip_frame
Skip decoding for selected frames.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This structure stores compressed data.
Rational number (pair of numerator and denominator).
const VLCElem * vlc_tabs[80]
The ProgressFrame structure.
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
uint16_t coded_dc_scale_factor[2][64]
int num_coded_frags[3][64]
number of blocks that contain DCT coefficients at the given level or higher
CoeffVLCs * coeff_vlc
The first 16 of the following VLCs are for the dc coefficients; the others are four groups of 16 VLCs...
ProgressFrame golden_frame
int8_t(*[2] motion_val)[2]
uint8_t base_matrix[384][64]
int * kf_coded_fragment_list
VP4Predictor * dc_pred_row
uint32_t coded_ac_scale_factor[64]
int16_t * dct_tokens_base
uint8_t idct_permutation[64]
ProgressFrame current_frame
unsigned char * macroblock_coding
uint8_t * edge_emu_buffer
int num_kf_coded_fragment[3]
int * coded_fragment_list[3]
int bounding_values_array[256+4]
int total_num_coded_frags
HuffTable huffman_table[5 *16]
uint8_t filter_limit_values[64]
int16_t * dct_tokens[3][64]
This is a list of all tokens in bitstream order.
Vp3Fragment * all_fragments
unsigned char * superblock_coding
int * nkf_coded_fragment_list
uint8_t qr_size[2][3][64]
int16_t qmat[3][2][3][64]
qmat[qpi][is_inter][plane]
uint8_t idct_scantable[64]
uint16_t qr_base[2][3][64]
int * superblock_fragments
#define av_malloc_array(a, b)
#define avpriv_request_sample(...)
static void error(const char *err)
static const uint8_t *const tables[]
static const struct twinvq_data tab
RefStruct is an API for creating reference-counted objects with minimal overhead.
static const double coeff[2][5]
Core video DSP helper functions.
int ff_vlc_init_from_lengths(VLC *vlc, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
av_cold const VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags)
void ff_vlc_free(VLC *vlc)
#define VLC_INIT_STATE(_table)
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
static const VLCElem * ff_vlc_init_tables(VLCInitState *state, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, int flags)
static int vp4_get_mv(GetBitContext *gb, int axis, int last_motion)
static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb)
#define CODING_MODE_COUNT
static av_cold int vp3_decode_init(AVCodecContext *avctx)
#define COMPATIBLE_FRAME(x)
static void init_loop_filter(Vp3DecodeContext *s)
#define MODE_INTER_PRIOR_LAST
static int get_eob_run(GetBitContext *gb, int token)
static void reverse_dc_prediction(Vp3DecodeContext *s, int first_fragment, int fragment_width, int fragment_height)
#define TOKEN_EOB(eob_run)
static void init_dequantizer(Vp3DecodeContext *s, int qpi)
static VLCElem motion_vector_vlc[112]
static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
static av_cold int allocate_tables(AVCodecContext *avctx)
Allocate tables for per-frame data in Vp3DecodeContext.
static av_cold void free_vlc_tables(AVRefStructOpaque unused, void *obj)
static VLCElem mode_code_vlc[24+2108 *CONFIG_VP4_DECODER]
static av_cold void free_tables(AVCodecContext *avctx)
static int vp3_dequant(Vp3DecodeContext *s, const Vp3Fragment *frag, int plane, int inter, int16_t block[64])
Pull DCT tokens from the 64 levels to decode and dequant the coefficients for the next block in codin...
#define MODE_INTER_LAST_MV
static av_cold void vp3_decode_flush(AVCodecContext *avctx)
#define MAXIMUM_LONG_BIT_RUN
static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, const VLCElem *vlc_table, int coeff_index, int plane, int eob_run)
static void render_slice(Vp3DecodeContext *s, int slice)
#define MODE_INTER_FOURMV
#define SB_PARTIALLY_CODED
static void await_reference_row(Vp3DecodeContext *s, const Vp3Fragment *fragment, int motion_y, int y)
Wait for the reference frame of the current fragment.
static int read_huffman_tree(HuffTable *huff, GetBitContext *gb, int length, AVCodecContext *avctx)
static VLCElem superblock_run_length_vlc[88]
static const uint8_t vp4_pred_block_type_map[8]
#define SUPERBLOCK_VLC_BITS
static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
static av_cold int vp3_decode_end(AVCodecContext *avctx)
static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
#define MODE_USING_GOLDEN
static int init_block_mapping(Vp3DecodeContext *s)
This function sets up all of the various blocks mappings: superblocks <-> fragments,...
#define MODE_INTER_PLUS_MV
static const int ModeAlphabet[6][CODING_MODE_COUNT]
static av_cold void init_tables_once(void)
static int get_coeff(GetBitContext *gb, int token, int16_t *coeff)
static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int yend)
static int vp3_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
#define TOKEN_COEFF(coeff)
static const uint8_t hilbert_offset[16][2]
#define TOKEN_ZERO_RUN(coeff, zero_run)
static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
called when all pixels up to row y are complete
static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
static VLCElem fragment_run_length_vlc[56]
static const uint8_t zero_run_get_bits[32]
static const uint8_t vp31_filter_limit_values[64]
static const uint16_t vp31_ac_scale_factor[64]
static const uint8_t mode_code_vlc_len[8]
static const uint8_t zero_run_base[32]
static const int8_t fixed_motion_vector_table[64]
static const int16_t *const coeff_tables[32]
static const uint8_t vp31_dc_scale_factor[64]
static const uint8_t vp3_bias[5 *16][32][2]
static const uint8_t fragment_run_length_vlc_len[30]
static const uint8_t vp31_intra_y_dequant[64]
static const struct @370321105316032037314210141206274253244133335364 eob_run_table[7]
static const uint8_t vp31_inter_dequant[64]
static const uint8_t coeff_get_bits[32]
static const uint8_t motion_vector_vlc_table[63][2]
static const uint8_t superblock_run_length_vlc_lens[34]
void ff_vp3dsp_h_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values)
void ff_vp3dsp_v_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values)
static const uint8_t vp4_mv_vlc[2][7][63][2]
static const uint8_t vp4_filter_limit_values[64]
static const uint8_t vp4_uv_dc_scale_factor[64]
static const uint8_t vp4_block_pattern_table_selector[14]
static const uint8_t vp4_mv_table_selector[32]
static const uint8_t vp4_block_pattern_vlc[2][14][2]
static const uint16_t vp4_ac_scale_factor[64]
static const uint8_t vp4_bias[5 *16][32][2]
static const uint8_t vp4_generic_dequant[64]
static const uint8_t vp4_y_dc_scale_factor[64]
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
int avpriv_split_xiph_headers(const uint8_t *extradata, int extradata_size, int first_header_size, const uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use.