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 }