sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

vpredictor.c (3060B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include "vadpcm.h"
      4 
      5 s32 readcodebook(FILE *fhandle, s32 ****table, s32 *order, s32 *npredictors)
      6 {
      7     s32 **table_entry;
      8     s32 i;
      9     s32 j;
     10     s32 k;
     11 
     12     fscanf(fhandle, "%d", order);
     13     fscanf(fhandle, "%d", npredictors);
     14     *table = malloc(*npredictors * sizeof(s32 **));
     15     for (i = 0; i < *npredictors; i++)
     16     {
     17         (*table)[i] = malloc(8 * sizeof(s32 *));
     18         for (j = 0; j < 8; j++)
     19         {
     20             (*table)[i][j] = malloc((*order + 8) * sizeof(s32));
     21         }
     22     }
     23 
     24     for (i = 0; i < *npredictors; i++)
     25     {
     26         table_entry = (*table)[i];
     27         for (j = 0; j < *order; j++)
     28         {
     29             for (k = 0; k < 8; k++)
     30             {
     31                 fscanf(fhandle, "%d", &table_entry[k][j]);
     32             }
     33         }
     34 
     35         for (k = 1; k < 8; k++)
     36         {
     37             table_entry[k][*order] = table_entry[k - 1][*order - 1];
     38         }
     39 
     40         table_entry[0][*order] = 1 << 11;
     41 
     42         for (k = 1; k < 8; k++)
     43         {
     44             for (j = 0; j < k; j++)
     45             {
     46                 table_entry[j][k + *order] = 0;
     47             }
     48 
     49             for (; j < 8; j++)
     50             {
     51                 table_entry[j][k + *order] = table_entry[j - k][*order];
     52             }
     53         }
     54     }
     55     return 0;
     56 }
     57 
     58 s32 readaifccodebook(FILE *fhandle, s32 ****table, s16 *order, s16 *npredictors)
     59 {
     60     s32 **table_entry;
     61     s32 i;
     62     s32 j;
     63     s32 k;
     64     s16 ts;
     65 
     66     fread(order, sizeof(s16), 1, fhandle);
     67     BSWAP16(*order)
     68     fread(npredictors, sizeof(s16), 1, fhandle);
     69     BSWAP16(*npredictors)
     70     *table = malloc(*npredictors * sizeof(s32 **));
     71     for (i = 0; i < *npredictors; i++)
     72     {
     73         (*table)[i] = malloc(8 * sizeof(s32 *));
     74         for (j = 0; j < 8; j++)
     75         {
     76             (*table)[i][j] = malloc((*order + 8) * sizeof(s32));
     77         }
     78     }
     79 
     80     for (i = 0; i < *npredictors; i++)
     81     {
     82         table_entry = (*table)[i];
     83         for (j = 0; j < *order; j++)
     84         {
     85             for (k = 0; k < 8; k++)
     86             {
     87                 fread(&ts, sizeof(s16), 1, fhandle);
     88                 BSWAP16(ts)
     89                 table_entry[k][j] = ts;
     90             }
     91         }
     92 
     93         for (k = 1; k < 8; k++)
     94         {
     95             table_entry[k][*order] = table_entry[k - 1][*order - 1];
     96         }
     97 
     98         table_entry[0][*order] = 1 << 11;
     99 
    100         for (k = 1; k < 8; k++)
    101         {
    102             for (j = 0; j < k; j++)
    103             {
    104                 table_entry[j][k + *order] = 0;
    105             }
    106 
    107             for (; j < 8; j++)
    108             {
    109                 table_entry[j][k + *order] = table_entry[j - k][*order];
    110             }
    111         }
    112     }
    113     return 0;
    114 }
    115 
    116 s32 inner_product(s32 length, s32 *v1, s32 *v2)
    117 {
    118     s32 j;
    119     s32 dout;
    120     s32 fiout;
    121     s32 out;
    122 
    123     j = 0;
    124     out = 0;
    125     for (; j < length; j++)
    126     {
    127         out += *v1++ * *v2++;
    128     }
    129 
    130     // Compute "out / 2^11", rounded down.
    131     dout = out / (1 << 11);
    132     fiout = dout * (1 << 11);
    133     if (out - fiout < 0)
    134     {
    135         return dout - 1;
    136     }
    137     else
    138     {
    139         return dout;
    140     }
    141 }