[Vorbis] how to arrange the codeword tree into array form
Ashok
ashokb at blr.pin.philips.com
Sun Mar 19 22:30:32 PST 2006
hi,
i am porting ogg vorbis decoder on to a24- bit dsp
platform. i would like to know how he is arranging
the binary tree into an array form. i think this
process is done in _make_words in tremer code. i
would be if some one could explain me the exact
algorithm or where can i get it?
i am attaching the code here for your reference.
static int _make_words(char *l,long n,ogg_uint32_t *r,long quantvals,
codebook *b, oggpack_buffer *opb,int maptype){
long i,j,count=0;
long top=0;
ogg_uint32_t marker[33];
if(n<2){
r[0]=0x80000000;
}else{
memset(marker,0,sizeof(marker));
for(i=0;i<n;i++){
long length=l[i];
if(length){
ogg_uint32_t entry=marker[length];
long chase=0;
if(count && !entry)return -1; /* overpopulated tree! */
/* chase the tree as far as it's already populated, fill in past */
for(j=0;j<length-1;j++){
int bit=(entry>>(length-j-1))&1;
if(chase>=top){
top++;
r[chase*2]=top;
r[chase*2+1]=0;
}else
if(!r[chase*2+bit])
r[chase*2+bit]=top;
chase=r[chase*2+bit];
}
{
int bit=(entry>>(length-j-1))&1;
if(chase>=top){
top++;
r[chase*2+1]=0;
}
r[chase*2+bit]= decpack(i,count++,quantvals,b,opb,maptype) |
0x80000000;
}
/* Look to see if the next shorter marker points to the node
above. if so, update it and repeat. */
for(j=length;j>0;j--){
if(marker[j]&1){
marker[j]=marker[j-1]<<1;
break;
}
marker[j]++;
}
/* prune the tree; the implicit invariant says all the longer
markers were dangling from our just-taken node. Dangle them
from our *new* node. */
for(j=length+1;j<33;j++)
if((marker[j]>>1) == entry){
entry=marker[j];
marker[j]=marker[j-1]<<1;
}else
break;
}
}
}
return 0;
}
regards
ashok.j.n.
More information about the Vorbis
mailing list