more bit allocation wip
This commit is contained in:
parent
b86ed07dc2
commit
a663174665
1 changed files with 112 additions and 18 deletions
130
libcelt/rate.c
130
libcelt/rate.c
|
@ -33,9 +33,13 @@
|
||||||
#include "modes.h"
|
#include "modes.h"
|
||||||
#include "cwrs.h"
|
#include "cwrs.h"
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
|
||||||
#include "entcode.h"
|
#include "entcode.h"
|
||||||
|
|
||||||
|
#define BITRES 4
|
||||||
|
#define BITOVERFLOW 1000
|
||||||
|
|
||||||
int log2_frac(ec_uint32 val, int frac)
|
int log2_frac(ec_uint32 val, int frac)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -84,6 +88,87 @@ int log2_frac64(ec_uint64 val, int frac)
|
||||||
return L;
|
return L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bits2pulses(int bits, int N)
|
||||||
|
{
|
||||||
|
int i, b, prev;
|
||||||
|
/* FIXME: This is terribly inefficient. Do a bisection instead
|
||||||
|
but be careful about overflows */
|
||||||
|
prev = 0;
|
||||||
|
i=1;
|
||||||
|
b = log2_frac64(ncwrs64(N, i),0);
|
||||||
|
while (b<bits)
|
||||||
|
{
|
||||||
|
prev=b;
|
||||||
|
i++;
|
||||||
|
b = log2_frac64(ncwrs64(N, i),0);
|
||||||
|
}
|
||||||
|
if (bits-prev < b-bits)
|
||||||
|
i--;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct alloc_data {
|
||||||
|
int len;
|
||||||
|
int **bits;
|
||||||
|
int **rev_bits;
|
||||||
|
};
|
||||||
|
|
||||||
|
void alloc_init(struct alloc_data *alloc, const CELTMode *m)
|
||||||
|
{
|
||||||
|
int i, prevN, BC;
|
||||||
|
const int *eBands = m->eBands;
|
||||||
|
alloc->bits = celt_alloc(m->nbEBands*sizeof(int*));
|
||||||
|
alloc->rev_bits = celt_alloc(m->nbEBands*sizeof(int*));
|
||||||
|
alloc->len = m->nbEBands;
|
||||||
|
BC = m->nbMdctBlocks*m->nbChannels;
|
||||||
|
prevN = -1;
|
||||||
|
for (i=0;i<alloc->len;i++)
|
||||||
|
{
|
||||||
|
int N = BC*(eBands[i+1]-eBands[i]);
|
||||||
|
if (N == prevN)
|
||||||
|
{
|
||||||
|
alloc->bits[i] = alloc->bits[i-1];
|
||||||
|
alloc->rev_bits[i] = alloc->rev_bits[i-1];
|
||||||
|
} else {
|
||||||
|
int j;
|
||||||
|
/* FIXME: We could save memory here */
|
||||||
|
alloc->bits[i] = celt_alloc(64*sizeof(int));
|
||||||
|
alloc->rev_bits[i] = celt_alloc(64*sizeof(int));
|
||||||
|
for (j=0;j<64;j++)
|
||||||
|
{
|
||||||
|
alloc->bits[i][j] = log2_frac64(ncwrs64(N, j),BITRES);
|
||||||
|
/* We could just update rev_bits here */
|
||||||
|
if (alloc->bits[i][j] > (60>>BITRES))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (;j<64;j++)
|
||||||
|
alloc->bits[i][j] = BITOVERFLOW;
|
||||||
|
for (j=0;j<32;j++)
|
||||||
|
alloc->rev_bits[i][j] = bits2pulses(j, N);
|
||||||
|
prevN = N;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void alloc_clear(struct alloc_data *alloc)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int *prevPtr = NULL;
|
||||||
|
for (i=0;i<alloc->len;i++)
|
||||||
|
{
|
||||||
|
if (alloc->bits[i] != prevPtr)
|
||||||
|
{
|
||||||
|
prevPtr = alloc->bits[i];
|
||||||
|
celt_free(alloc->bits[i]);
|
||||||
|
celt_free(alloc->rev_bits[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
celt_free(alloc->bits);
|
||||||
|
celt_free(alloc->rev_bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int compute_allocation(const CELTMode *m, int *pulses)
|
int compute_allocation(const CELTMode *m, int *pulses)
|
||||||
{
|
{
|
||||||
int i, N, BC, bits;
|
int i, N, BC, bits;
|
||||||
|
@ -106,24 +191,6 @@ int compute_allocation(const CELTMode *m, int *pulses)
|
||||||
return (bits+255)>>8;
|
return (bits+255)>>8;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bits2pulses(int bits, int N)
|
|
||||||
{
|
|
||||||
int i, b, prev;
|
|
||||||
/* FIXME: This is terribly inefficient. Do a bisection instead
|
|
||||||
but be careful about overflows */
|
|
||||||
prev = 0;
|
|
||||||
i=1;
|
|
||||||
b = log2_frac64(ncwrs(N, i),0);
|
|
||||||
while (b<bits)
|
|
||||||
{
|
|
||||||
prev=b;
|
|
||||||
i++;
|
|
||||||
b = log2_frac64(ncwrs(N, i),0);
|
|
||||||
}
|
|
||||||
if (bits-prev < b-bits)
|
|
||||||
i--;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int vec_bits2pulses(int *bands, int *bits, int *pulses, int len, int B)
|
int vec_bits2pulses(int *bands, int *bits, int *pulses, int len, int B)
|
||||||
{
|
{
|
||||||
|
@ -183,3 +250,30 @@ int main()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if 0
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int bits[18] = {10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 9, 10, 11, 6, 7};
|
||||||
|
int bits1[18] = {8, 7, 7, 6, 6, 6, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
|
||||||
|
int bits2[18] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15};
|
||||||
|
int bank[20] = {0, 4, 8, 12, 16, 20, 24, 28, 32, 38, 44, 52, 62, 74, 90,112,142,182, 232,256};
|
||||||
|
int pulses[18];
|
||||||
|
struct alloc_data alloc;
|
||||||
|
|
||||||
|
alloc_init(&alloc, celt_mode0);
|
||||||
|
int b = vec_bits2pulses(bank, bits, pulses, 18, 1);
|
||||||
|
printf ("total: %d bits\n", b);
|
||||||
|
for (i=0;i<18;i++)
|
||||||
|
printf ("%d ", pulses[i]);
|
||||||
|
printf ("\n");
|
||||||
|
b = interp_bits2pulses(bank, bits1, bits2, 160, pulses, 18, 1);
|
||||||
|
printf ("total: %d bits\n", b);
|
||||||
|
for (i=0;i<18;i++)
|
||||||
|
printf ("%d ", pulses[i]);
|
||||||
|
printf ("\n");
|
||||||
|
|
||||||
|
alloc_clear(&alloc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue