Go to the documentation of this file.
   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 
   73 #define SB_NOT_CODED        0 
   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 
  172 static const VLCElem *vp4_mv_vlc_table[2][7]; 
 
  173 static const VLCElem *block_pattern_vlc[2];   
 
  181 #define MIN_DEQUANT_VAL 2 
  280 #define TOKEN_EOB(eob_run)              ((eob_run) << 2) 
  281 #define TOKEN_ZERO_RUN(coeff, zero_run) (((coeff) * 512) + ((zero_run) << 2) + 1) 
  282 #define TOKEN_COEFF(coeff)              (((coeff) * 4) + 2) 
  355     if (
s->golden_frame.f)
 
  359     if (
s->current_frame.f)
 
  370     s->theora_tables = 0;
 
  394     for (
int plane = 0; plane < 3; plane++) {
 
  395         int sb_width    = plane ? 
s->c_superblock_width
 
  396                                 : 
s->y_superblock_width;
 
  397         int sb_height   = plane ? 
s->c_superblock_height
 
  398                                 : 
s->y_superblock_height;
 
  399         int frag_width  = 
s->fragment_width[!!plane];
 
  400         int frag_height = 
s->fragment_height[!!plane];
 
  402         for (
int sb_y = 0; sb_y < sb_height; sb_y++)
 
  403             for (
int sb_x = 0; sb_x < sb_width; sb_x++)
 
  404                 for (
int i = 0; 
i < 16; 
i++) {
 
  408                     if (x < frag_width && y < frag_height)
 
  409                         s->superblock_fragments[j++] = 
s->fragment_start[plane] +
 
  412                         s->superblock_fragments[j++] = -1;
 
  425     int ac_scale_factor = 
s->coded_ac_scale_factor[
s->qps[qpi]];
 
  427     for (
int inter = 0; inter < 2; inter++) {
 
  428         for (
int plane = 0; plane < 3; plane++) {
 
  429             int dc_scale_factor = 
s->coded_dc_scale_factor[!!plane][
s->qps[qpi]];
 
  430             int sum = 0, bmi, bmj, qistart, qri;
 
  431             for (qri = 0; qri < 
s->qr_count[inter][plane]; qri++) {
 
  432                 sum += 
s->qr_size[inter][plane][qri];
 
  433                 if (
s->qps[qpi] <= sum)
 
  436             qistart = sum - 
s->qr_size[inter][plane][qri];
 
  437             bmi     = 
s->qr_base[inter][plane][qri];
 
  438             bmj     = 
s->qr_base[inter][plane][qri + 1];
 
  439             for (
int i = 0; 
i < 64; 
i++) {
 
  440                 int coeff = (2 * (sum     - 
s->qps[qpi]) * 
s->base_matrix[bmi][
i] -
 
  441                              2 * (qistart - 
s->qps[qpi]) * 
s->base_matrix[bmj][
i] +
 
  442                              s->qr_size[inter][plane][qri]) /
 
  443                             (2 * 
s->qr_size[inter][plane][qri]);
 
  445                 int qmin   = 8 << (inter + !
i);
 
  446                 int qscale = 
i ? ac_scale_factor : dc_scale_factor;
 
  447                 int qbias = (1 + inter) * 3;
 
  448                 s->qmat[qpi][inter][plane][
s->idct_permutation[
i]] =
 
  449                     (
i == 0 || 
s->version < 2) ? 
av_clip((qscale * 
coeff) / 100 * 4, qmin, 4096)
 
  450                                                : (qscale * (
coeff - qbias) / 100 + qbias) * 4;
 
  454             s->qmat[qpi][inter][plane][0] = 
s->qmat[0][inter][plane][0];
 
  476     const int superblock_starts[3] = {
 
  477         0, 
s->u_superblock_start, 
s->v_superblock_start
 
  480     int current_superblock = 0;
 
  482     int num_partial_superblocks = 0;
 
  484     int current_fragment;
 
  485     int plane0_num_coded_frags = 0;
 
  494         while (current_superblock < s->superblock_count && 
get_bits_left(gb) > 0) {
 
  502             if (current_run == 34)
 
  505             if (current_run > 
s->superblock_count - current_superblock) {
 
  507                        "Invalid partially coded superblock run length\n");
 
  511             memset(
s->superblock_coding + current_superblock, 
bit, current_run);
 
  513             current_superblock += current_run;
 
  515                 num_partial_superblocks += current_run;
 
  520         if (num_partial_superblocks < s->superblock_count) {
 
  521             int superblocks_decoded = 0;
 
  523             current_superblock = 0;
 
  527             while (superblocks_decoded < s->superblock_count - num_partial_superblocks &&
 
  536                 if (current_run == 34)
 
  539                 for (
int j = 0; j < current_run; current_superblock++) {
 
  540                     if (current_superblock >= 
s->superblock_count) {
 
  542                                "Invalid fully coded superblock run length\n");
 
  547                     if (
s->superblock_coding[current_superblock] == 
SB_NOT_CODED) {
 
  548                         s->superblock_coding[current_superblock] = 2 * 
bit;
 
  552                 superblocks_decoded += current_run;
 
  558         if (num_partial_superblocks) {
 
  569     s->total_num_coded_frags = 0;
 
  570     memset(
s->macroblock_coding, 
MODE_COPY, 
s->macroblock_count);
 
  572     s->coded_fragment_list[0] = 
s->keyframe ? 
s->kf_coded_fragment_list
 
  573                                             : 
s->nkf_coded_fragment_list;
 
  575     for (
int plane = 0; plane < 3; plane++) {
 
  576         int sb_start = superblock_starts[plane];
 
  577         int sb_end   = sb_start + (plane ? 
s->c_superblock_count
 
  578                                          : 
s->y_superblock_count);
 
  579         int num_coded_frags = 0;
 
  582             if (
s->num_kf_coded_fragment[plane] == -1) {
 
  583                 for (
int i = sb_start; 
i < sb_end; 
i++) {
 
  585                     for (
int j = 0; j < 16; j++) {
 
  587                         current_fragment = 
s->superblock_fragments[
i * 16 + j];
 
  588                         if (current_fragment != -1) {
 
  589                             s->coded_fragment_list[plane][num_coded_frags++] =
 
  594                 s->num_kf_coded_fragment[plane] = num_coded_frags;
 
  596                 num_coded_frags = 
s->num_kf_coded_fragment[plane];
 
  603                 for (
int j = 0; j < 16; j++) {
 
  605                     current_fragment = 
s->superblock_fragments[
i * 16 + j];
 
  606                     if (current_fragment != -1) {
 
  607                         int coded = 
s->superblock_coding[
i];
 
  612                             if (current_run-- == 0) {
 
  622                             s->all_fragments[current_fragment].coding_method =
 
  624                             s->coded_fragment_list[plane][num_coded_frags++] =
 
  628                             s->all_fragments[current_fragment].coding_method =
 
  636             plane0_num_coded_frags = num_coded_frags;
 
  637         s->total_num_coded_frags += num_coded_frags;
 
  638         for (
int i = 0; 
i < 64; 
i++)
 
  639             s->num_coded_frags[plane][
i] = num_coded_frags;
 
  641             s->coded_fragment_list[plane + 1] = 
s->coded_fragment_list[plane] +
 
  647 #define BLOCK_X (2 * mb_x + (k & 1)) 
  648 #define BLOCK_Y (2 * mb_y + (k >> 1)) 
  650 #if CONFIG_VP4_DECODER 
  662         if (v > 
s->yuv_macroblock_count) {
 
  668     skip_bits(gb, 2 + n); \ 
  669     v += (1 << n) + get_bits(gb, n); } 
  670 #define thresh(n) (0x200 - (0x80 >> n)) 
  671 #define else_if(n) else if (bits < thresh(n)) body(n) 
  674     } 
else if (
bits < thresh(0)) {
 
  691 static int vp4_get_block_pattern(
GetBitContext *gb, 
int *next_block_pattern_table)
 
  693     int v = 
get_vlc2(gb, block_pattern_vlc[*next_block_pattern_table], 5, 1);
 
  701     int next_block_pattern_table;
 
  702     int bit, current_run, has_partial;
 
  704     memset(
s->macroblock_coding, 
MODE_COPY, 
s->macroblock_count);
 
  711     for (
int i = 0; 
i < 
s->yuv_macroblock_count; 
i += current_run) {
 
  714         current_run = vp4_get_mb_count(
s, gb);
 
  715         if (current_run > 
s->yuv_macroblock_count - 
i)
 
  717         memset(
s->superblock_coding + 
i, 2 * 
bit, current_run);
 
  726         current_run = vp4_get_mb_count(
s, gb);
 
  727         for (
int i = 0; 
i < 
s->yuv_macroblock_count; 
i++) {
 
  728             if (!
s->superblock_coding[
i]) {
 
  731                     current_run = vp4_get_mb_count(
s, gb);
 
  733                 s->superblock_coding[
i] = 
bit;
 
  741     next_block_pattern_table = 0;
 
  742     for (
int plane = 0, 
i = 0; plane < 3; plane++) {
 
  743         int sb_width = plane ? 
s->c_superblock_width : 
s->y_superblock_width;
 
  744         int sb_height = plane ? 
s->c_superblock_height : 
s->y_superblock_height;
 
  745         int mb_width = plane ? 
s->c_macroblock_width : 
s->macroblock_width;
 
  746         int mb_height = plane ? 
s->c_macroblock_height : 
s->macroblock_height;
 
  747         int fragment_width = 
s->fragment_width[!!plane];
 
  748         int fragment_height = 
s->fragment_height[!!plane];
 
  750         for (
int sb_y = 0; sb_y < sb_height; sb_y++) {
 
  751             for (
int sb_x = 0; sb_x < sb_width; sb_x++) {
 
  752                 for (
int j = 0; j < 4; j++) {
 
  753                     int mb_x = 2 * sb_x + (j >> 1);
 
  754                     int mb_y = 2 * sb_y + (j >> 1) ^ (j & 1);
 
  755                     int mb_coded, pattern, coded;
 
  757                     if (mb_x >= mb_width || mb_y >= mb_height)
 
  760                     mb_coded = 
s->superblock_coding[
i++];
 
  765                         pattern = vp4_get_block_pattern(gb, &next_block_pattern_table);
 
  769                     for (
int k = 0; k < 4; k++) {
 
  773                         coded = pattern & (8 >> k);
 
  793     int current_macroblock;
 
  794     int current_fragment;
 
  801         for (
int i = 0; 
i < 
s->fragment_count; 
i++)
 
  809             for (
int i = 0; 
i < 8; 
i++)
 
  811             for (
int i = 0; 
i < 8; 
i++)
 
  812                 custom_mode_alphabet[
get_bits(gb, 3)] = 
i;
 
  813             alphabet = custom_mode_alphabet;
 
  819         for (
int sb_y = 0; sb_y < 
s->y_superblock_height; sb_y++) {
 
  820             for (
int sb_x = 0; sb_x < 
s->y_superblock_width; sb_x++) {
 
  824                 for (
int j = 0; j < 4; j++) {
 
  826                     int mb_x = 2 * sb_x + (j >> 1);
 
  827                     int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
 
  828                     current_macroblock = mb_y * 
s->macroblock_width + mb_x;
 
  830                     if (mb_x >= 
s->macroblock_width ||
 
  831                         mb_y >= 
s->macroblock_height)
 
  837                     for (k = 0; k < 4; k++) {
 
  840                         if (
s->all_fragments[current_fragment].coding_method != 
MODE_COPY)
 
  854                     s->macroblock_coding[current_macroblock] = coding_mode;
 
  855                     for (k = 0; k < 4; k++) {
 
  861 #define SET_CHROMA_MODES                                                      \ 
  862     if (frag[s->fragment_start[1]].coding_method != MODE_COPY)                \ 
  863         frag[s->fragment_start[1]].coding_method = coding_mode;               \ 
  864     if (frag[s->fragment_start[2]].coding_method != MODE_COPY)                \ 
  865         frag[s->fragment_start[2]].coding_method = coding_mode; 
  867                     if (
s->chroma_y_shift) {
 
  868                         frag = 
s->all_fragments + mb_y *
 
  869                                s->fragment_width[1] + mb_x;
 
  871                     } 
else if (
s->chroma_x_shift) {
 
  872                         frag = 
s->all_fragments +
 
  873                                2 * mb_y * 
s->fragment_width[1] + mb_x;
 
  874                         for (k = 0; k < 2; k++) {
 
  876                             frag += 
s->fragment_width[1];
 
  879                         for (k = 0; k < 4; k++) {
 
  880                             frag = 
s->all_fragments +
 
  895 #if CONFIG_VP4_DECODER 
  898     return last_motion < 0 ? -v : v;
 
  913     int last_motion_x = 0;
 
  914     int last_motion_y = 0;
 
  915     int prior_last_motion_x = 0;
 
  916     int prior_last_motion_y = 0;
 
  917     int last_gold_motion_x = 0;
 
  918     int last_gold_motion_y = 0;
 
  919     int current_macroblock;
 
  920     int current_fragment;
 
  927     coding_mode = 
s->version < 2 ? 
get_bits1(gb) : 2;
 
  931     for (
int sb_y = 0; sb_y < 
s->y_superblock_height; sb_y++) {
 
  932         for (
int sb_x = 0; sb_x < 
s->y_superblock_width; sb_x++) {
 
  936             for (
int j = 0; j < 4; j++) {
 
  937                 int mb_x = 2 * sb_x + (j >> 1);
 
  938                 int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
 
  939                 current_macroblock = mb_y * 
s->macroblock_width + mb_x;
 
  941                 if (mb_x >= 
s->macroblock_width  ||
 
  942                     mb_y >= 
s->macroblock_height ||
 
  943                     s->macroblock_coding[current_macroblock] == 
MODE_COPY)
 
  946                 switch (
s->macroblock_coding[current_macroblock]) {
 
  948                     if (coding_mode == 2) { 
 
  949                         last_gold_motion_x = motion_x[0] = 
vp4_get_mv(gb, 0, last_gold_motion_x);
 
  950                         last_gold_motion_y = motion_y[0] = 
vp4_get_mv(gb, 1, last_gold_motion_y);
 
  955                     if (coding_mode == 0) {
 
  960                     } 
else if (coding_mode == 1) {
 
  964                         motion_x[0] = 
vp4_get_mv(gb, 0, last_motion_x);
 
  965                         motion_y[0] = 
vp4_get_mv(gb, 1, last_motion_y);
 
  970                         prior_last_motion_x = last_motion_x;
 
  971                         prior_last_motion_y = last_motion_y;
 
  972                         last_motion_x       = motion_x[0];
 
  973                         last_motion_y       = motion_y[0];
 
  979                     prior_last_motion_x = last_motion_x;
 
  980                     prior_last_motion_y = last_motion_y;
 
  984                     for (
int k = 0; k < 4; k++) {
 
  986                         if (
s->all_fragments[current_fragment].coding_method != 
MODE_COPY) {
 
  987                             if (coding_mode == 0) {
 
  992                             } 
else if (coding_mode == 1) {
 
  996                                 motion_x[k] = 
vp4_get_mv(gb, 0, prior_last_motion_x);
 
  997                                 motion_y[k] = 
vp4_get_mv(gb, 1, prior_last_motion_y);
 
  999                             last_motion_x = motion_x[k];
 
 1000                             last_motion_y = motion_y[k];
 
 1010                     motion_x[0] = last_motion_x;
 
 1011                     motion_y[0] = last_motion_y;
 
 1020                     motion_x[0] = prior_last_motion_x;
 
 1021                     motion_y[0] = prior_last_motion_y;
 
 1024                     prior_last_motion_x = last_motion_x;
 
 1025                     prior_last_motion_y = last_motion_y;
 
 1026                     last_motion_x       = motion_x[0];
 
 1027                     last_motion_y       = motion_y[0];
 
 1040                 for (
int k = 0; k < 4; k++) {
 
 1044                         s->motion_val[0][current_fragment][0] = motion_x[k];
 
 1045                         s->motion_val[0][current_fragment][1] = motion_y[k];
 
 1047                         s->motion_val[0][current_fragment][0] = motion_x[0];
 
 1048                         s->motion_val[0][current_fragment][1] = motion_y[0];
 
 1052                 if (
s->chroma_y_shift) {
 
 1054                         motion_x[0] = 
RSHIFT(motion_x[0] + motion_x[1] +
 
 1055                                              motion_x[2] + motion_x[3], 2);
 
 1056                         motion_y[0] = 
RSHIFT(motion_y[0] + motion_y[1] +
 
 1057                                              motion_y[2] + motion_y[3], 2);
 
 1059                     if (
s->version <= 2) {
 
 1060                         motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
 
 1061                         motion_y[0] = (motion_y[0] >> 1) | (motion_y[0] & 1);
 
 1063                     frag = mb_y * 
s->fragment_width[1] + mb_x;
 
 1064                     s->motion_val[1][frag][0] = motion_x[0];
 
 1065                     s->motion_val[1][frag][1] = motion_y[0];
 
 1066                 } 
else if (
s->chroma_x_shift) {
 
 1068                         motion_x[0] = 
RSHIFT(motion_x[0] + motion_x[1], 1);
 
 1069                         motion_y[0] = 
RSHIFT(motion_y[0] + motion_y[1], 1);
 
 1070                         motion_x[1] = 
RSHIFT(motion_x[2] + motion_x[3], 1);
 
 1071                         motion_y[1] = 
RSHIFT(motion_y[2] + motion_y[3], 1);
 
 1073                         motion_x[1] = motion_x[0];
 
 1074                         motion_y[1] = motion_y[0];
 
 1076                     if (
s->version <= 2) {
 
 1077                         motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
 
 1078                         motion_x[1] = (motion_x[1] >> 1) | (motion_x[1] & 1);
 
 1080                     frag = 2 * mb_y * 
s->fragment_width[1] + mb_x;
 
 1081                     for (
int k = 0; k < 2; k++) {
 
 1082                         s->motion_val[1][frag][0] = motion_x[k];
 
 1083                         s->motion_val[1][frag][1] = motion_y[k];
 
 1084                         frag += 
s->fragment_width[1];
 
 1087                     for (
int k = 0; k < 4; k++) {
 
 1090                             s->motion_val[1][frag][0] = motion_x[k];
 
 1091                             s->motion_val[1][frag][1] = motion_y[k];
 
 1093                             s->motion_val[1][frag][0] = motion_x[0];
 
 1094                             s->motion_val[1][frag][1] = motion_y[0];
 
 1107     int num_blocks = 
s->total_num_coded_frags;
 
 1109     for (
int qpi = 0; qpi < 
s->nqps - 1 && num_blocks > 0; qpi++) {
 
 1110         int i = 0, blocks_decoded = 0, num_blocks_at_qpi = 0;
 
 1111         int bit, run_length;
 
 1124             if (run_length == 34)
 
 1126             blocks_decoded += run_length;
 
 1129                 num_blocks_at_qpi += run_length;
 
 1131             for (
int j = 0; j < run_length; 
i++) {
 
 1132                 if (
i >= 
s->total_num_coded_frags)
 
 1135                 if (
s->all_fragments[
s->coded_fragment_list[0][
i]].qpi == qpi) {
 
 1136                     s->all_fragments[
s->coded_fragment_list[0][
i]].qpi += 
bit;
 
 1140         } 
while (blocks_decoded < num_blocks && 
get_bits_left(gb) > 0);
 
 1142         num_blocks -= num_blocks_at_qpi;
 
 1158     int bits_to_get, zero_run;
 
 1162         bits_to_get = 
get_bits(gb, bits_to_get);
 
 1185                        const VLCElem *vlc_table, 
int coeff_index,
 
 1195     int num_coeffs      = 
s->num_coded_frags[plane][coeff_index];
 
 1196     int16_t *dct_tokens = 
s->dct_tokens[plane][coeff_index];
 
 1199     const int *coded_fragment_list = 
s->coded_fragment_list[plane];
 
 1202     if (num_coeffs < 0) {
 
 1204                "Invalid number of coefficients at level %d\n", coeff_index);
 
 1208     if (eob_run > num_coeffs) {
 
 1210         blocks_ended = num_coeffs;
 
 1211         eob_run     -= num_coeffs;
 
 1214         blocks_ended = eob_run;
 
 1220         dct_tokens[j++] = blocks_ended << 2;
 
 1224         token = 
get_vlc2(gb, vlc_table, 11, 3);
 
 1226         if ((
unsigned) token <= 6
U) {
 
 1233             if (eob_run > num_coeffs - coeff_i) {
 
 1234                 dct_tokens[j++] = 
TOKEN_EOB(num_coeffs - coeff_i);
 
 1235                 blocks_ended   += num_coeffs - coeff_i;
 
 1236                 eob_run        -= num_coeffs - coeff_i;
 
 1237                 coeff_i         = num_coeffs;
 
 1240                 blocks_ended   += eob_run;
 
 1244         } 
else if (token >= 0) {
 
 1255                     all_fragments[coded_fragment_list[coeff_i]].
dc = 
coeff;
 
 1260             if (coeff_index + zero_run > 64) {
 
 1262                        "Invalid zero run of %d with %d coeffs left\n",
 
 1263                        zero_run, 64 - coeff_index);
 
 1264                 zero_run = 64 - coeff_index;
 
 1269             for (
int i = coeff_index + 1; 
i <= coeff_index + zero_run; 
i++)
 
 1270                 s->num_coded_frags[plane][
i]--;
 
 1278     if (blocks_ended > 
s->num_coded_frags[plane][coeff_index])
 
 1284         for (
int i = coeff_index + 1; 
i < 64; 
i++)
 
 1285             s->num_coded_frags[plane][
i] -= blocks_ended;
 
 1289         s->dct_tokens[plane + 1][coeff_index] = dct_tokens + j;
 
 1290     else if (coeff_index < 63)
 
 1291         s->dct_tokens[0][coeff_index + 1] = dct_tokens + j;
 
 1299                                   int fragment_height);
 
 1311     int residual_eob_run = 0;
 
 1312     const VLCElem *y_tables[64], *c_tables[64];
 
 1314     s->dct_tokens[0][0] = 
s->dct_tokens_base;
 
 1325                                    0, residual_eob_run);
 
 1326     if (residual_eob_run < 0)
 
 1327         return residual_eob_run;
 
 1336                                    1, residual_eob_run);
 
 1337     if (residual_eob_run < 0)
 
 1338         return residual_eob_run;
 
 1340                                    2, residual_eob_run);
 
 1341     if (residual_eob_run < 0)
 
 1342         return residual_eob_run;
 
 1347                               s->fragment_width[1], 
s->fragment_height[1]);
 
 1349                               s->fragment_width[1], 
s->fragment_height[1]);
 
 1359     for (
int i = 1; 
i <= 5; 
i++) {
 
 1364     for (
int i = 6; 
i <= 14; 
i++) {
 
 1369     for (
int i = 15; 
i <= 27; 
i++) {
 
 1374     for (
int i = 28; 
i <= 63; 
i++) {
 
 1381     for (
int i = 1; 
i <= 63; 
i++) {
 
 1383                                        0, residual_eob_run);
 
 1384         if (residual_eob_run < 0)
 
 1385             return residual_eob_run;
 
 1388                                        1, residual_eob_run);
 
 1389         if (residual_eob_run < 0)
 
 1390             return residual_eob_run;
 
 1392                                        2, residual_eob_run);
 
 1393         if (residual_eob_run < 0)
 
 1394             return residual_eob_run;
 
 1400 #if CONFIG_VP4_DECODER 
 1409                        int plane, 
int eob_tracker[64], 
int fragment)
 
 1417     while (!eob_tracker[coeff_i]) {
 
 1424         if ((
unsigned) token <= 6
U) {
 
 1426             *
s->dct_tokens[plane][coeff_i]++ = 
TOKEN_EOB(0);
 
 1427             eob_tracker[coeff_i] = eob_run - 1;
 
 1429         } 
else if (token >= 0) {
 
 1433                 if (coeff_i + zero_run > 64) {
 
 1435                         "Invalid zero run of %d with %d coeffs left\n",
 
 1436                         zero_run, 64 - coeff_i);
 
 1437                     zero_run = 64 - coeff_i;
 
 1440                 coeff_i += zero_run;
 
 1455     *
s->dct_tokens[plane][coeff_i]++ = 
TOKEN_EOB(0);
 
 1456     eob_tracker[coeff_i]--;
 
 1468     for (
int i = 0; 
i < 4; 
i++)
 
 1469         dc_pred[0][
i + 1] = 
s->dc_pred_row[sb_x * 4 + 
i];
 
 1471     for (
int j = 1; j < 5; j++)
 
 1472         for (
int i = 0; 
i < 4; 
i++)
 
 1473             vp4_dc_predictor_reset(&dc_pred[j][
i + 1]);
 
 1478     for (
int i = 0; 
i < 4; 
i++)
 
 1479         s->dc_pred_row[sb_x * 4 + 
i] = dc_pred[4][
i + 1];
 
 1481     for (
int i = 1; 
i < 5; 
i++)
 
 1482         dc_pred[
i][0] = dc_pred[
i][4];
 
 1492         dc += dc_pred[-6].
dc;
 
 1497         dc += dc_pred[6].
dc;
 
 1501     if (count != 2 && dc_pred[-1].
type == 
type) {
 
 1502         dc += dc_pred[-1].
dc;
 
 1506     if (count != 2 && dc_pred[1].
type == 
type) {
 
 1507         dc += dc_pred[1].
dc;
 
 1512     return count == 2 ? 
dc / 2 : last_dc[
type];
 
 1517     int16_t *
base = 
s->dct_tokens_base;
 
 1518     for (
int plane = 0; plane < 3; plane++) {
 
 1519         for (
int i = 0; 
i < 64; 
i++) {
 
 1520             s->dct_tokens[plane][
i] = 
base;
 
 1521             base += 
s->fragment_width[!!plane] * 
s->fragment_height[!!plane];
 
 1534     int eob_tracker[64];
 
 1553     for (
int i = 1; 
i <= 5; 
i++) {
 
 1558     for (
int i = 6; 
i <= 14; 
i++) {
 
 1563     for (
int i = 15; 
i <= 27; 
i++) {
 
 1568     for (
int i = 28; 
i <= 63; 
i++) {
 
 1574     vp4_set_tokens_base(
s);
 
 1576     memset(last_dc, 0, 
sizeof(last_dc));
 
 1579         memset(eob_tracker, 0, 
sizeof(eob_tracker));
 
 1582         for (
int i = 0; 
i < 
s->fragment_width[!!plane]; 
i++)
 
 1583             vp4_dc_predictor_reset(&
s->dc_pred_row[
i]);
 
 1585         for (
int j = 0; j < 6; j++)
 
 1586             for (
int i = 0; 
i < 6; 
i++)
 
 1587                 vp4_dc_predictor_reset(&dc_pred[j][
i]);
 
 1589         for (
int sb_y = 0; sb_y * 4 < 
s->fragment_height[!!plane]; sb_y++) {
 
 1590             for (
int sb_x = 0; sb_x *4 < 
s->fragment_width[!!plane]; sb_x++) {
 
 1591                 vp4_dc_pred_before(
s, dc_pred, sb_x);
 
 1592                 for (
int j = 0; j < 16; j++) {
 
 1595                         int x  = 4 * sb_x + hx;
 
 1596                         int y  = 4 * sb_y + hy;
 
 1600                         if (x >= 
s->fragment_width[!!plane] || y >= 
s->fragment_height[!!plane])
 
 1603                         fragment = 
s->fragment_start[plane] + y * 
s->fragment_width[!!plane] + x;
 
 1608                         if (vp4_unpack_vlcs(
s, gb, 
tables[!!plane], plane, eob_tracker, 
fragment) < 0)
 
 1614                             vp4_dc_pred(
s, this_dc_pred, last_dc, dc_block_type, plane);
 
 1616                         this_dc_pred->
type = dc_block_type,
 
 1617                         this_dc_pred->
dc   = last_dc[dc_block_type] = 
s->all_fragments[
fragment].dc;
 
 1619                 vp4_dc_pred_after(
s, dc_pred, sb_x);
 
 1624     vp4_set_tokens_base(
s);
 
 1635 #define COMPATIBLE_FRAME(x)                                                   \ 
 1636     (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type) 
 1637 #define DC_COEFF(u) s->all_fragments[u].dc 
 1642                                   int fragment_height)
 
 1649     int i = first_fragment;
 
 1654     int vl, vul, vu, vur;
 
 1666     static const int predictor_transform[16][4] = {
 
 1680         { -104, 116,   0, 116 }, 
 
 1682         { -104, 116,   0, 116 }  
 
 1691     static const unsigned char compatible_frame[9] = {
 
 1702     int current_frame_type;
 
 1718     for (
int y = 0; y < fragment_height; y++) {
 
 1720         for (
int x = 0; x < fragment_width; x++, 
i++) {
 
 1723             if (
s->all_fragments[
i].coding_method != 
MODE_COPY) {
 
 1724                 current_frame_type =
 
 1725                     compatible_frame[
s->all_fragments[
i].coding_method];
 
 1735                     u  = 
i - fragment_width;
 
 1740                         ul  = 
i - fragment_width - 1;
 
 1745                     if (x + 1 < fragment_width) {
 
 1746                         ur  = 
i - fragment_width + 1;
 
 1756                     predicted_dc = last_dc[current_frame_type];
 
 1760                         (predictor_transform[
transform][0] * vul) +
 
 1761                         (predictor_transform[
transform][1] * vu) +
 
 1762                         (predictor_transform[
transform][2] * vur) +
 
 1763                         (predictor_transform[
transform][3] * vl);
 
 1765                     predicted_dc /= 128;
 
 1770                         if (
FFABS(predicted_dc - vu) > 128)
 
 1772                         else if (
FFABS(predicted_dc - vl) > 128)
 
 1774                         else if (
FFABS(predicted_dc - vul) > 128)
 
 1782                 last_dc[current_frame_type] = 
DC_COEFF(
i);
 
 1789                               int ystart, 
int yend)
 
 1791     int *bounding_values = 
s->bounding_values_array + 127;
 
 1793     int width           = 
s->fragment_width[!!plane];
 
 1794     int height          = 
s->fragment_height[!!plane];
 
 1796     ptrdiff_t 
stride    = 
s->current_frame.f->linesize[plane];
 
 1797     uint8_t *plane_data = 
s->current_frame.f->data[plane];
 
 1798     if (!
s->flipped_image)
 
 1800     plane_data += 
s->data_offset[plane] + 8 * ystart * 
stride;
 
 1802     for (
int y = ystart; y < yend; y++) {
 
 1803         for (
int x = 0; x < 
width; x++) {
 
 1811                     s->vp3dsp.h_loop_filter(
 
 1813                         stride, bounding_values);
 
 1818                     s->vp3dsp.v_loop_filter(
 
 1820                         stride, bounding_values);
 
 1826                 if ((x < 
width - 1) &&
 
 1828                     s->vp3dsp.h_loop_filter(
 
 1829                         plane_data + 8 * x + 8,
 
 1830                         stride, bounding_values);
 
 1838                     s->vp3dsp.v_loop_filter(
 
 1839                         plane_data + 8 * x + 8 * 
stride,
 
 1840                         stride, bounding_values);
 
 1846         plane_data += 8 * 
stride;
 
 1855                               int plane, 
int inter, int16_t 
block[64])
 
 1857     const int16_t *dequantizer = 
s->qmat[frag->
qpi][inter][plane];
 
 1858     const uint8_t *
perm = 
s->idct_scantable;
 
 1862         int token = *
s->dct_tokens[plane][
i];
 
 1863         switch (token & 3) {
 
 1866                 s->dct_tokens[plane][
i]++;
 
 1868                 *
s->dct_tokens[plane][
i] = token & ~3;
 
 1871             s->dct_tokens[plane][
i]++;
 
 1872             i += (token >> 2) & 0x7f;
 
 1882             s->dct_tokens[plane][
i++]++;
 
 1892     block[0] = frag->
dc * 
s->qmat[0][inter][plane][0];
 
 1905         int y_flipped = 
s->flipped_image ? 
s->height - y : y;
 
 1911                                   y_flipped == 
s->height ? INT_MAX
 
 1916     if (!
s->avctx->draw_horiz_band)
 
 1919     h = y - 
s->last_slice_end;
 
 1920     s->last_slice_end = y;
 
 1923     if (!
s->flipped_image)
 
 1924         y = 
s->height - y - 
h;
 
 1926     cy        = y >> 
s->chroma_y_shift;
 
 1927     offset[0] = 
s->current_frame.f->linesize[0] * y;
 
 1928     offset[1] = 
s->current_frame.f->linesize[1] * cy;
 
 1929     offset[2] = 
s->current_frame.f->linesize[2] * cy;
 
 1934     s->avctx->draw_horiz_band(
s->avctx, 
s->current_frame.f, 
offset, y, 3, 
h);
 
 1942                                 int motion_y, 
int y)
 
 1946     int border = motion_y & 1;
 
 1954     ref_row = y + (motion_y >> 1);
 
 1955     ref_row = 
FFMAX(
FFABS(ref_row), ref_row + 8 + border);
 
 1960 #if CONFIG_VP4_DECODER 
 1964 static int vp4_mc_loop_filter(
Vp3DecodeContext *
s, 
int plane, 
int motion_x, 
int motion_y, 
int bx, 
int by,
 
 1965                               const uint8_t *motion_source, ptrdiff_t 
stride,
 
 1966                               int src_x, 
int src_y, uint8_t *
temp)
 
 1968     int motion_shift = plane ? 4 : 2;
 
 1969     int subpel_mask = plane ? 3 : 1;
 
 1970     int *bounding_values = 
s->bounding_values_array + 127;
 
 1974     int x_subpel, y_subpel;
 
 1975     int x_offset, y_offset;
 
 1977     int block_width = plane ? 8 : 16;
 
 1978     int plane_width  = 
s->width  >> (plane && 
s->chroma_x_shift);
 
 1979     int plane_height = 
s->height >> (plane && 
s->chroma_y_shift);
 
 1981 #define loop_stride 12 
 1982     uint8_t 
loop[12 * loop_stride];
 
 1985     x = 8 * bx + motion_x / motion_shift;
 
 1986     y = 8 * by + motion_y / motion_shift;
 
 1988     x_subpel = motion_x & subpel_mask;
 
 1989     y_subpel = motion_y & subpel_mask;
 
 1991     if (x_subpel || y_subpel) {
 
 2001         x2 = x + block_width;
 
 2002         y2 = y + block_width;
 
 2004         if (x2 < 0 || x2 >= plane_width || y2 < 0 || y2 >= plane_height)
 
 2007         x_offset = (-(x + 2) & 7) + 2;
 
 2008         y_offset = (-(y + 2) & 7) + 2;
 
 2010         av_assert1(!(x_offset > 8 + x_subpel && y_offset > 8 + y_subpel));
 
 2012         s->vdsp.emulated_edge_mc(
loop, motion_source - 
stride - 1,
 
 2014              12, 12, src_x - 1, src_y - 1,
 
 2018         if (x_offset <= 8 + x_subpel)
 
 2021         if (y_offset <= 8 + y_subpel)
 
 2029         if (!x_offset && !y_offset)
 
 2032         s->vdsp.emulated_edge_mc(
loop, motion_source - 
stride - 1,
 
 2034              12, 12, src_x - 1, src_y - 1,
 
 2038 #define safe_loop_filter(name, ptr, stride, bounding_values) \ 
 2039     if ((uintptr_t)(ptr) & 7) \ 
 2040         s->vp3dsp.name##_unaligned(ptr, stride, bounding_values); \ 
 2042         s->vp3dsp.name(ptr, stride, bounding_values); 
 2045             safe_loop_filter(h_loop_filter, 
loop + loop_stride + x_offset + 1, loop_stride, bounding_values);
 
 2048             safe_loop_filter(v_loop_filter, 
loop + (y_offset + 1)*loop_stride + 1, loop_stride, bounding_values);
 
 2051     for (
int i = 0; 
i < 9; 
i++)
 
 2064     int16_t *
block = 
s->block;
 
 2065     int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef;
 
 2070     const AVFrame *last_frame   = 
s->last_frame.f->data[0]   ?
 
 2071                                       s->last_frame.f   : 
s->current_frame.f;
 
 2072     const AVFrame *golden_frame = 
s->golden_frame.f->data[0] ?
 
 2073                                       s->golden_frame.f : 
s->current_frame.f;
 
 2074     int motion_halfpel_index;
 
 2077     if (slice >= 
s->c_superblock_height)
 
 2080     for (
int plane = 0; plane < 3; plane++) {
 
 2082                                 s->data_offset[plane];
 
 2083         const uint8_t *last_plane = last_frame->
data[plane] +
 
 2084                               s->data_offset[plane];
 
 2085         const uint8_t *golden_plane = golden_frame->
data[plane] +
 
 2086                                 s->data_offset[plane];
 
 2087         ptrdiff_t 
stride = 
s->current_frame.f->linesize[plane];
 
 2088         int plane_width  = 
s->width  >> (plane && 
s->chroma_x_shift);
 
 2089         int plane_height = 
s->height >> (plane && 
s->chroma_y_shift);
 
 2090         const int8_t (*motion_val)[2] = 
s->motion_val[!!plane];
 
 2092         int sb_y = slice << (!plane && 
s->chroma_y_shift);
 
 2093         int slice_height = sb_y + 1 + (!plane && 
s->chroma_y_shift);
 
 2094         int slice_width  = plane ? 
s->c_superblock_width
 
 2095                                  : 
s->y_superblock_width;
 
 2097         int fragment_width  = 
s->fragment_width[!!plane];
 
 2098         int fragment_height = 
s->fragment_height[!!plane];
 
 2099         int fragment_start  = 
s->fragment_start[plane];
 
 2101         int do_await = !plane && HAVE_THREADS &&
 
 2104         if (!
s->flipped_image)
 
 2110         for (; sb_y < slice_height; sb_y++) {
 
 2112             for (
int sb_x = 0; sb_x < slice_width; sb_x++) {
 
 2114                 for (
int j = 0; j < 16; j++) {
 
 2117                     int fragment = y * fragment_width + x;
 
 2122                     if (x >= fragment_width || y >= fragment_height)
 
 2125                     first_pixel = 8 * y * 
stride + 8 * x;
 
 2131                                             (16 * y) >> 
s->chroma_y_shift);
 
 2134                     if (
s->all_fragments[
i].coding_method != 
MODE_COPY) {
 
 2135                         const uint8_t *motion_source;
 
 2138                             motion_source = golden_plane;
 
 2140                             motion_source = last_plane;
 
 2142                         motion_source       += first_pixel;
 
 2143                         motion_halfpel_index = 0;
 
 2147                         if ((
s->all_fragments[
i].coding_method > 
MODE_INTRA) &&
 
 2150                             int standard_mc = 1;
 
 2151                             motion_x = motion_val[
fragment][0];
 
 2152                             motion_y = motion_val[
fragment][1];
 
 2153 #if CONFIG_VP4_DECODER 
 2154                             if (plane && 
s->version >= 2) {
 
 2155                                 motion_x = (motion_x >> 1) | (motion_x & 1);
 
 2156                                 motion_y = (motion_y >> 1) | (motion_y & 1);
 
 2160                             src_x = (motion_x >> 1) + 8 * x;
 
 2161                             src_y = (motion_y >> 1) + 8 * y;
 
 2163                             motion_halfpel_index = motion_x & 0x01;
 
 2164                             motion_source       += (motion_x >> 1);
 
 2166                             motion_halfpel_index |= (motion_y & 0x01) << 1;
 
 2167                             motion_source        += ((motion_y >> 1) * 
stride);
 
 2169 #if CONFIG_VP4_DECODER 
 2170                             if (
s->version >= 2) {
 
 2171                                 uint8_t *
temp = 
s->edge_emu_buffer;
 
 2174                                 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)) {
 
 2175                                     motion_source = 
temp;
 
 2181                             if (standard_mc && (
 
 2182                                 src_x < 0 || src_y < 0 ||
 
 2183                                 src_x + 9 >= plane_width ||
 
 2184                                 src_y + 9 >= plane_height)) {
 
 2185                                 uint8_t *
temp = 
s->edge_emu_buffer;
 
 2189                                 s->vdsp.emulated_edge_mc(
temp, motion_source,
 
 2194                                 motion_source = 
temp;
 
 2205                             if (motion_halfpel_index != 3) {
 
 2206                                 s->hdsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
 
 2208                                     motion_source, 
stride, 8);
 
 2212                                 int d = (motion_x ^ motion_y) >> 31;
 
 2215                                                                motion_source + 
stride + 1 + 
d,
 
 2241                         s->hdsp.put_pixels_tab[1][0](
 
 2243                             last_plane + first_pixel,
 
 2250             if (
s->version < 2 && !
s->skip_loop_filter)
 
 2252                                   FFMIN(4 * sb_y + 3, fragment_height - 1));
 
 2290 #if CONFIG_VP4_DECODER 
 2291     for (
int j = 0; j < 2; j++)
 
 2292         for (
int i = 0; 
i < 7; 
i++) {
 
 2293             vp4_mv_vlc_table[j][
i] =
 
 2301     for (
int i = 0; 
i < 2; 
i++) {
 
 2302         block_pattern_vlc[
i] =
 
 2314     int y_fragment_count, c_fragment_count;
 
 2318     y_fragment_count = 
s->fragment_width[0] * 
s->fragment_height[0];
 
 2319     c_fragment_count = 
s->fragment_width[1] * 
s->fragment_height[1];
 
 2322     s->superblock_coding = 
av_mallocz(
FFMAX(
s->superblock_count, 
s->yuv_macroblock_count));
 
 2323     s->all_fragments     = 
av_calloc(
s->fragment_count, 
sizeof(*
s->all_fragments));
 
 2325     s-> kf_coded_fragment_list = 
av_calloc(
s->fragment_count, 
sizeof(
int));
 
 2326     s->nkf_coded_fragment_list = 
av_calloc(
s->fragment_count, 
sizeof(
int));
 
 2327     memset(
s-> num_kf_coded_fragment, -1, 
sizeof(
s-> num_kf_coded_fragment));
 
 2330                                    64 * 
sizeof(*
s->dct_tokens_base));
 
 2331     s->motion_val[0] = 
av_calloc(y_fragment_count, 
sizeof(*
s->motion_val[0]));
 
 2332     s->motion_val[1] = 
av_calloc(c_fragment_count, 
sizeof(*
s->motion_val[1]));
 
 2335     s->superblock_fragments = 
av_calloc(
s->superblock_count, 16 * 
sizeof(
int));
 
 2336     s->macroblock_coding    = 
av_mallocz(
s->macroblock_count + 1);
 
 2338     s->dc_pred_row = 
av_malloc_array(
s->y_superblock_width * 4, 
sizeof(*
s->dc_pred_row));
 
 2340     if (!
s->superblock_coding    || !
s->all_fragments          ||
 
 2341         !
s->dct_tokens_base      || !
s->kf_coded_fragment_list ||
 
 2342         !
s->nkf_coded_fragment_list ||
 
 2343         !
s->superblock_fragments || !
s->macroblock_coding      ||
 
 2345         !
s->motion_val[0]        || !
s->motion_val[1]) {
 
 2360     if (!
s->current_frame.f || !
s->last_frame.f || !
s->golden_frame.f)
 
 2381     int y_fragment_count, c_fragment_count;
 
 2389 #if !CONFIG_VP4_DECODER 
 2410     for (
int i = 0; 
i < 64; 
i++) {
 
 2411 #define TRANSPOSE(x) (((x) >> 3) | (((x) & 7) << 3)) 
 2419     for (
int i = 0; 
i < 3; 
i++)
 
 2426     s->y_superblock_width  = (
s->width  + 31) / 32;
 
 2427     s->y_superblock_height = (
s->height + 31) / 32;
 
 2428     s->y_superblock_count  = 
s->y_superblock_width * 
s->y_superblock_height;
 
 2431     c_width                = 
s->width >> 
s->chroma_x_shift;
 
 2432     c_height               = 
s->height >> 
s->chroma_y_shift;
 
 2433     s->c_superblock_width  = (c_width  + 31) / 32;
 
 2434     s->c_superblock_height = (c_height + 31) / 32;
 
 2435     s->c_superblock_count  = 
s->c_superblock_width * 
s->c_superblock_height;
 
 2437     s->superblock_count   = 
s->y_superblock_count + (
s->c_superblock_count * 2);
 
 2438     s->u_superblock_start = 
s->y_superblock_count;
 
 2439     s->v_superblock_start = 
s->u_superblock_start + 
s->c_superblock_count;
 
 2441     s->macroblock_width  = (
s->width  + 15) / 16;
 
 2442     s->macroblock_height = (
s->height + 15) / 16;
 
 2443     s->macroblock_count  = 
s->macroblock_width * 
s->macroblock_height;
 
 2444     s->c_macroblock_width  = (c_width  + 15) / 16;
 
 2445     s->c_macroblock_height = (c_height + 15) / 16;
 
 2446     s->c_macroblock_count  = 
s->c_macroblock_width * 
s->c_macroblock_height;
 
 2447     s->yuv_macroblock_count = 
s->macroblock_count + 2 * 
s->c_macroblock_count;
 
 2451     s->fragment_width[1]  = 
s->fragment_width[0] >> 
s->chroma_x_shift;
 
 2452     s->fragment_height[1] = 
s->fragment_height[0] >> 
s->chroma_y_shift;
 
 2455     y_fragment_count     = 
s->fragment_width[0] * 
s->fragment_height[0];
 
 2456     c_fragment_count     = 
s->fragment_width[1] * 
s->fragment_height[1];
 
 2457     s->fragment_count    = y_fragment_count + 2 * c_fragment_count;
 
 2458     s->fragment_start[1] = y_fragment_count;
 
 2459     s->fragment_start[2] = y_fragment_count + c_fragment_count;
 
 2461     if (!
s->theora_tables) {
 
 2462         for (
int i = 0; 
i < 64; 
i++) {
 
 2472         for (
int inter = 0; inter < 2; inter++) {
 
 2473             for (
int plane = 0; plane < 3; plane++) {
 
 2474                 s->qr_count[inter][plane]   = 1;
 
 2475                 s->qr_size[inter][plane][0] = 63;
 
 2476                 s->qr_base[inter][plane][0] =
 
 2477                 s->qr_base[inter][plane][1] = 2 * inter + (!!plane) * !inter;
 
 2488         s->coeff_vlc = vlcs;
 
 2490         if (!
s->theora_tables) {
 
 2491             const uint8_t (*bias_tabs)[32][2];
 
 2497                                                &bias_tabs[
i][0][1], 2,
 
 2498                                                &bias_tabs[
i][0][0], 2, 1,
 
 2509                                                &
tab->entries[0].len, 
sizeof(*
tab->entries),
 
 2510                                                &
tab->entries[0].sym, 
sizeof(*
tab->entries), 1,
 
 2545     if (
src->f->data[0])
 
 2564     int qps_changed = 0, err;
 
 2568     if (!
s1->current_frame.f->data[0] ||
 
 2569         s->width != 
s1->width || 
s->height != 
s1->height) {
 
 2577         if ((err = ref_frames(
s, 
s1)) < 0)
 
 2580         s->keyframe = 
s1->keyframe;
 
 2583         for (
int i = 0; 
i < 3; 
i++) {
 
 2584             if (
s->qps[
i] != 
s1->qps[1]) {
 
 2586                 memcpy(&
s->qmat[
i], &
s1->qmat[
i], 
sizeof(
s->qmat[
i]));
 
 2590         if (
s->qps[0] != 
s1->qps[0])
 
 2591             memcpy(&
s->bounding_values_array, &
s1->bounding_values_array,
 
 2592                    sizeof(
s->bounding_values_array));
 
 2595             memcpy(
s->qps,      
s1->qps,      
sizeof(
s->qps));
 
 2596             memcpy(
s->last_qps, 
s1->last_qps, 
sizeof(
s->last_qps));
 
 2608     const uint8_t *buf  = avpkt->
data;
 
 2609     int buf_size        = avpkt->
size;
 
 2617 #if CONFIG_THEORA_DECODER 
 2623             av_log(avctx, 
AV_LOG_ERROR, 
"midstream reconfiguration with multithreading is unsupported, try -threads 1\n");
 
 2637         } 
else if (
type == 2) {
 
 2650                "Header packet passed to frame decoder, skipping\n");
 
 2656     if (!
s->all_fragments) {
 
 2662     for (
int i = 0; 
i < 3; 
i++)
 
 2663         s->last_qps[
i] = 
s->qps[
i];
 
 2668     } 
while (
s->theora >= 0x030200 && 
s->nqps < 3 && 
get_bits1(&gb));
 
 2669     for (
int i = 
s->nqps; 
i < 3; 
i++)
 
 2674                s->keyframe ? 
"key" : 
"", avctx->frame_num + 1, 
s->qps[0]);
 
 2676     s->skip_loop_filter = !
s->filter_limit_values[
s->qps[0]] ||
 
 2680     if (
s->qps[0] != 
s->last_qps[0])
 
 2683     for (
int i = 0; 
i < 
s->nqps; 
i++)
 
 2686         if (
s->qps[
i] != 
s->last_qps[
i] || 
s->qps[0] != 
s->last_qps[0])
 
 2702     if (!
s->edge_emu_buffer) {
 
 2703         s->edge_emu_buffer = 
av_malloc(9 * 
FFABS(
s->current_frame.f->linesize[0]));
 
 2704         if (!
s->edge_emu_buffer) {
 
 2716 #if !CONFIG_VP4_DECODER 
 2723                 if (avctx->frame_num == 0)
 
 2725                            "VP version: %d\n", 
s->version);
 
 2728         if (
s->version || 
s->theora) {
 
 2731                        "Warning, unsupported keyframe coding type?!\n");
 
 2734 #if CONFIG_VP4_DECODER 
 2735             if (
s->version >= 2) {
 
 2736                 int mb_height, mb_width;
 
 2737                 int mb_width_mul, mb_width_div, mb_height_mul, mb_height_div;
 
 2741                 if (mb_height != 
s->macroblock_height ||
 
 2742                     mb_width != 
s->macroblock_width)
 
 2749                 if (mb_width_mul != 1 || mb_width_div != 1 || mb_height_mul != 1 || mb_height_div != 1)
 
 2758         if (!
s->golden_frame.f->data[0]) {
 
 2760                    "vp3: first frame not a keyframe\n");
 
 2768                                            &
s->golden_frame)) < 0)
 
 2775     memset(
s->all_fragments, 0, 
s->fragment_count * 
sizeof(
Vp3Fragment));
 
 2777     if (
s->version < 2) {
 
 2782 #if CONFIG_VP4_DECODER 
 2784         if ((
ret = vp4_unpack_macroblocks(
s, &gb)) < 0) {
 
 2803     if (
s->version < 2) {
 
 2808 #if CONFIG_VP4_DECODER 
 2810         if ((
ret = vp4_unpack_dct_coeffs(
s, &gb)) < 0) {
 
 2817     for (
int i = 0; 
i < 3; 
i++) {
 
 2818         int height = 
s->height >> (
i && 
s->chroma_y_shift);
 
 2819         if (
s->flipped_image)
 
 2820             s->data_offset[
i] = 0;
 
 2822             s->data_offset[
i] = (
height - 1) * 
s->current_frame.f->linesize[
i];
 
 2825     s->last_slice_end = 0;
 
 2826     for (
int i = 0; 
i < 
s->c_superblock_height; 
i++)
 
 2831         for (
int i = 0; 
i < 3; 
i++) {
 
 2832             int row = (
s->height >> (3 + (
i && 
s->chroma_y_shift))) - 1;
 
 2875         ff_dlog(avctx, 
"code length %d, curr entry %d, token %d\n",
 
 2893 #if CONFIG_THEORA_DECODER 
 2901     int visible_width, visible_height, colorspace;
 
 2902     uint8_t offset_x = 0, offset_y = 0;
 
 2909     s->theora_header = 0;
 
 2919     if (
s->theora < 0x030200) {
 
 2920         s->flipped_image = 1;
 
 2922                "Old (<alpha3) Theora bitstream, flipped image\n");
 
 2930     if (
s->theora >= 0x030200) {
 
 2940         visible_width  + offset_x > 
s->width ||
 
 2941         visible_height + offset_y > 
s->height ||
 
 2945                "Invalid frame dimensions - w:%d h:%d x:%d y:%d (%dx%d).\n",
 
 2946                visible_width, visible_height, offset_x, offset_y,
 
 2947                s->width, 
s->height);
 
 2953     if (fps.
num && fps.
den) {
 
 2954         if (fps.
num < 0 || fps.
den < 0) {
 
 2959                   fps.
den, fps.
num, 1 << 30);
 
 2964     if (aspect.
num && aspect.
den) {
 
 2967                   aspect.
num, aspect.
den, 1 << 30);
 
 2971     if (
s->theora < 0x030200)
 
 2978     if (
s->theora >= 0x030200) {
 
 2995         avctx->
width  = visible_width;
 
 2996         avctx->
height = visible_height;
 
 2999         s->offset_x = offset_x;
 
 3000         s->offset_y = 
s->height - visible_height - offset_y;
 
 3003     if (colorspace == 1)
 
 3005     else if (colorspace == 2)
 
 3008     if (colorspace == 1 || colorspace == 2) {
 
 3013     s->theora_header = 1;
 
 3020     int n, matrices, 
ret;
 
 3022     if (!
s->theora_header)
 
 3025     if (
s->theora >= 0x030200) {
 
 3029             for (
int i = 0; 
i < 64; 
i++)
 
 3033     if (
s->theora >= 0x030200)
 
 3038     for (
int i = 0; 
i < 64; 
i++)
 
 3039         s->coded_ac_scale_factor[
i] = 
get_bits(gb, n);
 
 3041     if (
s->theora >= 0x030200)
 
 3046     for (
int i = 0; 
i < 64; 
i++)
 
 3047         s->coded_dc_scale_factor[0][
i] =
 
 3048         s->coded_dc_scale_factor[1][
i] = 
get_bits(gb, n);
 
 3050     if (
s->theora >= 0x030200)
 
 3055     if (matrices > 384) {
 
 3060     for (
int j = 0; j < matrices; j++)
 
 3061         for (
int i = 0; 
i < 64; 
i++)
 
 3064     for (
int inter = 0; inter <= 1; inter++) {
 
 3065         for (
int plane = 0; plane <= 2; plane++) {
 
 3067             if (inter || plane > 0)
 
 3075                     qtj = (3 * inter + plane - 1) / 3;
 
 3076                     plj = (plane + 2) % 3;
 
 3078                 s->qr_count[inter][plane] = 
s->qr_count[qtj][plj];
 
 3079                 memcpy(
s->qr_size[inter][plane], 
s->qr_size[qtj][plj],
 
 3080                        sizeof(
s->qr_size[0][0]));
 
 3081                 memcpy(
s->qr_base[inter][plane], 
s->qr_base[qtj][plj],
 
 3082                        sizeof(
s->qr_base[0][0]));
 
 3089                     if (
i >= matrices) {
 
 3091                                "invalid base matrix index\n");
 
 3094                     s->qr_base[inter][plane][qri] = 
i;
 
 3098                     s->qr_size[inter][plane][qri++] = 
i;
 
 3106                 s->qr_count[inter][plane] = qri;
 
 3113         s->huffman_table[
i].nb_entries = 0;
 
 3118     s->theora_tables = 1;
 
 3128     const uint8_t *header_start[3];
 
 3142                                   42, header_start, header_len) < 0) {
 
 3147     for (
int i = 0; 
i < 3; 
i++) {
 
 3148         if (header_len[
i] <= 0)
 
 3156         if (!(ptype & 0x80)) {
 
 3179                    "Unknown Theora config packet: %d\n", ptype & ~0x80);
 
 3184                    "%d bits left in packet %X\n",
 
 3186         if (
s->theora < 0x030200)
 
 3199     .
init                  = theora_decode_init,
 
 3228 #if CONFIG_VP4_DECODER 
  
static void error(const char *err)
 
static const uint16_t vp4_ac_scale_factor[64]
 
static av_cold int allocate_tables(AVCodecContext *avctx)
Allocate tables for per-frame data in Vp3DecodeContext.
 
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...
 
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
 
#define AV_LOG_WARNING
Something somehow does not look correct.
 
AVPixelFormat
Pixel format.
 
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()
 
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
 
static int get_bits_left(GetBitContext *gb)
 
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
 
static int vp4_get_mv(GetBitContext *gb, int axis, int last_motion)
 
static void vp3_decode_flush(AVCodecContext *avctx)
 
enum AVColorSpace colorspace
YUV colorspace type.
 
static const uint8_t zero_run_base[32]
 
#define MODE_INTER_PRIOR_LAST
 
#define u(width, name, range_min, range_max)
 
uint8_t idct_scantable[64]
 
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
 
static const uint8_t mode_code_vlc_len[8]
 
static void * ff_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(FFRefStructOpaque opaque, void *obj))
A wrapper around ff_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
 
static VLCElem superblock_run_length_vlc[88]
 
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
 
static int read_huffman_tree(HuffTable *huff, GetBitContext *gb, int length, AVCodecContext *avctx)
 
This structure describes decoded (raw) audio or video data.
 
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
 
void ff_vp3dsp_set_bounding_values(int *bounding_values_array, int filter_limit)
 
const FFCodec ff_vp3_decoder
 
Vp3Fragment * all_fragments
 
static VLCElem mode_code_vlc[24+2108 *CONFIG_VP4_DECODER]
 
uint8_t filter_limit_values[64]
 
static VLCElem fragment_run_length_vlc[56]
 
static VLCElem motion_vector_vlc[112]
 
RefStruct is an API for creating reference-counted objects with minimal overhead.
 
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
 
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_thread_await_progress() has been called on them. reget_buffer() and buffer age optimizations no longer work. *The contents of buffers must not be written to after ff_thread_report_progress() has been called on them. This includes draw_edges(). Porting codecs to frame threading
 
static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
 
static void render_slice(Vp3DecodeContext *s, int slice)
 
const VLCElem * vlc_tabs[80]
 
#define FF_DEBUG_PICT_INFO
 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
 
static VLCElem vlc_tables[VLC_TABLES_SIZE]
 
#define AV_CODEC_FLAG2_IGNORE_CROP
Discard cropping information from SPS.
 
#define bit(string, value)
 
int bounding_values_array[256+2]
 
static void skip_bits(GetBitContext *s, int n)
 
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
 
int * superblock_fragments
 
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
 
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
 
static int get_coeff(GetBitContext *gb, int token, int16_t *coeff)
 
AVCodec p
The public AVCodec.
 
static const uint8_t vp4_mv_vlc[2][7][63][2]
 
#define CODING_MODE_COUNT
 
static const struct twinvq_data tab
 
Writing a table generator This documentation is preliminary Parts of the API are not good and should be changed Basic concepts A table generator consists of two *_tablegen c and *_tablegen h The h file will provide the variable declarations and initialization code for the tables
 
int flags
AV_CODEC_FLAG_*.
 
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.
 
#define MODE_INTER_LAST_MV
 
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
 
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
 
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
 
int num_kf_coded_fragment[3]
 
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
 
#define TOKEN_ZERO_RUN(coeff, zero_run)
 
static const uint8_t vp4_pred_block_type_map[8]
 
static void await_reference_row(Vp3DecodeContext *s, const Vp3Fragment *fragment, int motion_y, int y)
Wait for the reference frame of the current fragment.
 
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
 
static int ff_thread_once(char *control, void(*routine)(void))
 
static const uint8_t motion_vector_vlc_table[63][2]
 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
 
#define FF_ARRAY_ELEMS(a)
 
static av_cold void free_vlc_tables(FFRefStructOpaque unused, void *obj)
 
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
 
static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
 
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
 
static const uint8_t hilbert_offset[16][2]
 
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
 
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
 
#define FF_CODEC_DECODE_CB(func)
 
static void init_loop_filter(Vp3DecodeContext *s)
 
static const uint8_t vp4_mv_table_selector[32]
 
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
 
static int init_block_mapping(Vp3DecodeContext *s)
This function sets up all of the various blocks mappings: superblocks <-> fragments,...
 
#define SB_PARTIALLY_CODED
 
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
 
static void reverse_dc_prediction(Vp3DecodeContext *s, int first_fragment, int fragment_width, int fragment_height)
 
static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
 
static const int ModeAlphabet[6][CODING_MODE_COUNT]
 
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
 
#define CODEC_LONG_NAME(str)
 
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
 
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
 
#define MODE_USING_GOLDEN
 
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
 
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
 
uint8_t idct_permutation[64]
 
static void init_dequantizer(Vp3DecodeContext *s, int qpi)
 
#define MODE_INTER_FOURMV
 
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
 
@ AVDISCARD_ALL
discard all
 
static const int16_t *const coeff_tables[32]
 
static av_cold int init_frames(Vp3DecodeContext *s)
 
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
 
Used to store optimal huffman encoding results.
 
static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
 
static const int8_t transform[32][32]
 
Rational number (pair of numerator and denominator).
 
struct AVCodecInternal * internal
Private context used for internal data.
 
void ff_vp3dsp_h_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values)
 
static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
 
@ AV_PICTURE_TYPE_I
Intra.
 
static unsigned int get_bits1(GetBitContext *s)
 
static const uint8_t fragment_run_length_vlc_len[30]
 
static const uint8_t vp4_bias[5 *16][32][2]
 
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
 
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
 
#define TOKEN_COEFF(coeff)
 
static const uint8_t vp4_y_dc_scale_factor[64]
 
#define UPDATE_THREAD_CONTEXT(func)
 
static int update_frames(AVCodecContext *avctx)
Release and shuffle frames after decode finishes.
 
CoeffVLCs * coeff_vlc
The first 16 of the following VLCs are for the dc coefficients; the others are four groups of 16 VLCs...
 
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
 
static const uint16_t vp31_ac_scale_factor[64]
 
uint8_t qr_size[2][3][64]
 
static const uint8_t vp31_intra_y_dequant[64]
 
void ff_vp3dsp_v_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values)
 
int total_num_coded_frags
 
@ AVDISCARD_NONKEY
discard all frames except keyframes
 
int flags2
AV_CODEC_FLAG2_*.
 
int(* init)(AVBSFContext *ctx)
 
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
 
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
 
static const int8_t fixed_motion_vector_table[64]
 
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
 
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
 
#define DECLARE_ALIGNED(n, t, v)
 
static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
 
const FFCodec ff_vp4_decoder
 
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
 
#define AV_NUM_DATA_POINTERS
 
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
 
int16_t * dct_tokens[3][64]
This is a list of all tokens in bitstream order.
 
uint16_t coded_dc_scale_factor[2][64]
 
ThreadFrame current_frame
 
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
 
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
 
unsigned char * macroblock_coding
 
#define AV_LOG_INFO
Standard information.
 
@ AVCOL_TRC_BT709
also ITU-R BT1361
 
#define FF_THREAD_FRAME
Decode more than one frame at once.
 
int * nkf_coded_fragment_list
 
static const struct @198 eob_run_table[7]
 
static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int yend)
 
av_cold void ff_vp3dsp_init(VP3DSPContext *c, int flags)
 
#define i(width, name, range_min, range_max)
 
uint8_t * edge_emu_buffer
 
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
 
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
 
#define av_malloc_array(a, b)
 
static int vp3_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
 
static const uint8_t superblock_run_length_vlc_lens[34]
 
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
 
const uint8_t ff_mjpeg_std_chrominance_quant_tbl[64]
 
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
 
#define SUPERBLOCK_VLC_BITS
 
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
 
const char * name
Name of the codec implementation.
 
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
 
int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around ff_get_buffer() for frame-multithreaded codecs.
 
void * av_calloc(size_t nmemb, size_t size)
 
int * coded_fragment_list[3]
 
const uint8_t ff_zigzag_direct[64]
 
@ AVCOL_PRI_BT470M
also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
 
void ff_vlc_free(VLC *vlc)
 
#define FFSWAP(type, a, b)
 
static av_cold void free_tables(AVCodecContext *avctx)
 
static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, const VLCElem *vlc_table, int coeff_index, int plane, int eob_run)
 
#define MODE_INTER_PLUS_MV
 
int num_coded_frags[3][64]
number of blocks that contain DCT coefficients at the given level or higher
 
void ff_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
 
static const uint8_t vp4_block_pattern_table_selector[14]
 
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
 
const FFCodec ff_theora_decoder
 
static const uint8_t vp4_filter_limit_values[64]
 
static const VLCElem * coeff_vlc[2][8][4]
 
main external API structure.
 
static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
called when all pixels up to row y are complete
 
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
 
static const uint8_t vp4_generic_dequant[64]
 
static const uint8_t zero_run_get_bits[32]
 
uint32_t coded_ac_scale_factor[64]
 
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.
 
static const uint8_t vp31_inter_dequant[64]
 
static void body(uint32_t ABCD[4], const uint8_t *src, size_t nblocks)
 
static const uint8_t vp4_block_pattern_vlc[2][14][2]
 
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.
 
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
 
const av_cold 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)
 
unsigned char * superblock_coding
 
#define COMPATIBLE_FRAME(x)
 
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
 
int coded_width
Bitstream width / height, may be different from width/height e.g.
 
@ AV_PICTURE_TYPE_P
Predicted.
 
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)
 
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
 
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
 
#define avpriv_request_sample(...)
 
static const uint8_t vp3_bias[5 *16][32][2]
 
static int get_eob_run(GetBitContext *gb, int token)
 
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
 
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
 
HuffTable huffman_table[5 *16]
 
#define VLC_INIT_STATE(_table)
 
static const uint8_t vp31_filter_limit_values[64]
 
This structure stores compressed data.
 
static av_cold int vp3_decode_init(AVCodecContext *avctx)
 
uint8_t base_matrix[384][64]
 
static const uint8_t vp31_dc_scale_factor[64]
 
int width
picture width / height.
 
int * kf_coded_fragment_list
 
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
 
static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb)
 
uint16_t qr_base[2][3][64]
 
static av_cold int vp3_decode_end(AVCodecContext *avctx)
 
The exact code depends on how similar the blocks are and how related they are to the block
 
static const double coeff[2][5]
 
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
 
#define MKTAG(a, b, c, d)
 
static const uint8_t vp4_uv_dc_scale_factor[64]
 
#define MAXIMUM_LONG_BIT_RUN
 
static av_cold void init_tables_once(void)
 
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...
 
int8_t(*[2] motion_val)[2]
 
VP4Predictor * dc_pred_row
 
static const uint8_t coeff_get_bits[32]
 
int16_t * dct_tokens_base
 
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
 
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
 
int16_t qmat[3][2][3][64]
qmat[qpi][is_inter][plane]
 
#define TOKEN_EOB(eob_run)