Path: blob/master/tools/sdk-tools/adpcm/vpredictor.c
7861 views
#include <stdio.h>1#include <stdlib.h>2#include "vadpcm.h"34s32 readcodebook(FILE *fhandle, s32 ****table, s32 *order, s32 *npredictors)5{6s32 **table_entry;7s32 i;8s32 j;9s32 k;1011fscanf(fhandle, "%d", order);12fscanf(fhandle, "%d", npredictors);13*table = malloc(*npredictors * sizeof(s32 **));14for (i = 0; i < *npredictors; i++)15{16(*table)[i] = malloc(8 * sizeof(s32 *));17for (j = 0; j < 8; j++)18{19(*table)[i][j] = malloc((*order + 8) * sizeof(s32));20}21}2223for (i = 0; i < *npredictors; i++)24{25table_entry = (*table)[i];26for (j = 0; j < *order; j++)27{28for (k = 0; k < 8; k++)29{30fscanf(fhandle, "%d", &table_entry[k][j]);31}32}3334for (k = 1; k < 8; k++)35{36table_entry[k][*order] = table_entry[k - 1][*order - 1];37}3839table_entry[0][*order] = 1 << 11;4041for (k = 1; k < 8; k++)42{43for (j = 0; j < k; j++)44{45table_entry[j][k + *order] = 0;46}4748for (; j < 8; j++)49{50table_entry[j][k + *order] = table_entry[j - k][*order];51}52}53}54return 0;55}5657s32 readaifccodebook(FILE *fhandle, s32 ****table, s16 *order, s16 *npredictors)58{59s32 **table_entry;60s32 i;61s32 j;62s32 k;63s16 ts;6465fread(order, sizeof(s16), 1, fhandle);66BSWAP16(*order)67fread(npredictors, sizeof(s16), 1, fhandle);68BSWAP16(*npredictors)69*table = malloc(*npredictors * sizeof(s32 **));70for (i = 0; i < *npredictors; i++)71{72(*table)[i] = malloc(8 * sizeof(s32 *));73for (j = 0; j < 8; j++)74{75(*table)[i][j] = malloc((*order + 8) * sizeof(s32));76}77}7879for (i = 0; i < *npredictors; i++)80{81table_entry = (*table)[i];82for (j = 0; j < *order; j++)83{84for (k = 0; k < 8; k++)85{86fread(&ts, sizeof(s16), 1, fhandle);87BSWAP16(ts)88table_entry[k][j] = ts;89}90}9192for (k = 1; k < 8; k++)93{94table_entry[k][*order] = table_entry[k - 1][*order - 1];95}9697table_entry[0][*order] = 1 << 11;9899for (k = 1; k < 8; k++)100{101for (j = 0; j < k; j++)102{103table_entry[j][k + *order] = 0;104}105106for (; j < 8; j++)107{108table_entry[j][k + *order] = table_entry[j - k][*order];109}110}111}112return 0;113}114115s32 inner_product(s32 length, s32 *v1, s32 *v2)116{117s32 j;118s32 dout;119s32 fiout;120s32 out;121122j = 0;123out = 0;124for (; j < length; j++)125{126out += *v1++ * *v2++;127}128129// Compute "out / 2^11", rounded down.130dout = out / (1 << 11);131fiout = dout * (1 << 11);132if (out - fiout < 0)133{134return dout - 1;135}136else137{138return dout;139}140}141142143