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 }