sm64

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

vdecode.c (1420B)


      1 #include <stdio.h>
      2 #include "vadpcm.h"
      3 
      4 void vdecodeframe(FILE *ifile, s32 *outp, s32 order, s32 ***coefTable)
      5 {
      6     s32 optimalp;
      7     s32 scale;
      8     s32 maxlevel;
      9     s32 i;
     10     s32 j;
     11     s32 in_vec[16];
     12     s32 ix[16];
     13     u8 header;
     14     u8 c;
     15 
     16     maxlevel = 7;
     17     fread(&header, 1, 1, ifile);
     18     scale = 1 << (header >> 4);
     19     optimalp = header & 0xf;
     20 
     21     for (i = 0; i < 16; i += 2)
     22     {
     23         fread(&c, 1, 1, ifile);
     24         ix[i] = c >> 4;
     25         ix[i + 1] = c & 0xf;
     26 
     27         if (ix[i] <= maxlevel)
     28         {
     29             ix[i] *= scale;
     30         }
     31         else
     32         {
     33             ix[i] = (-0x10 - -ix[i]) * scale;
     34         }
     35 
     36         if (ix[i + 1] <= maxlevel)
     37         {
     38             ix[i + 1] *= scale;
     39         }
     40         else
     41         {
     42             ix[i + 1] = (-0x10 - -ix[i + 1]) * scale;
     43         }
     44     }
     45 
     46     for (j = 0; j < 2; j++)
     47     {
     48         for (i = 0; i < 8; i++)
     49         {
     50             in_vec[i + order] = ix[j * 8 + i];
     51         }
     52 
     53         if (j == 0)
     54         {
     55             for (i = 0; i < order; i++)
     56             {
     57                 in_vec[i] = outp[16 - order + i];
     58             }
     59         }
     60         else
     61         {
     62             for (i = 0; i < order; i++)
     63             {
     64                 in_vec[i] = outp[j * 8 - order + i];
     65             }
     66         }
     67 
     68         for (i = 0; i < 8; i++)
     69         {
     70             outp[i + j * 8] = inner_product(order + 8, coefTable[optimalp][i], in_vec);
     71         }
     72     }
     73 }