1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: residue backend 0 implementation
15 last mod: $Id: res0.c,v 1.5 2000/02/12 08:33:09 xiphmont Exp $
17 ********************************************************************/
23 #include "vorbis/codec.h"
29 vorbis_info_residue0 *info;
31 } vorbis_look_residue0;
33 void free_info(vorbis_info_residue *i){
35 memset(i,0,sizeof(vorbis_info_residue0));
40 void free_look(vorbis_look_residue *i){
42 memset(i,0,sizeof(vorbis_look_residue0));
48 void pack(vorbis_info_residue *vr,oggpack_buffer *opb){
49 vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
51 _oggpack_write(opb,info->begin,24);
52 _oggpack_write(opb,info->end,24);
54 _oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and
55 code with a partitioned book */
56 _oggpack_write(opb,info->partitions-1,6); /* possible partition choices */
57 _oggpack_write(opb,info->groupspercode-1,6); /* partitioned group
60 _oggpack_write(opb,info->groupbook,8); /* group huffman book */
61 for(j=0;j<info->partitions;j++){
62 _oggpack_write(opb,info->secondstages[j],4); /* zero *is* a valid choice */
63 acc+=info->secondstages[j];
66 _oggpack_write(opb,info->booklist[j],8);
70 /* vorbis_info is for range checking */
71 vorbis_info_residue *unpack(vorbis_info *vi,oggpack_buffer *opb){
73 vorbis_info_residue0 *ret=calloc(1,sizeof(vorbis_info_residue0));
75 ret->begin=_oggpack_read(opb,24);
76 ret->end=_oggpack_read(opb,24);
77 ret->grouping=_oggpack_read(opb,24)+1;
78 ret->partitions=_oggpack_read(opb,6)+1;
79 ret->groupspercode=_oggpack_read(opb,6)+1;
80 ret->groupbook=_oggpack_read(opb,8);
81 for(j=0;j<ret->partitions;j++)
82 acc+=ret->secondstages[j]=_oggpack_read(opb,4);
84 ret->booklist[j]=_oggpack_read(opb,8);
86 if(ret->groupbook>=vi->books)goto errout;
88 if(ret->booklist[j]>=vi->books)goto errout;
96 vorbis_look_residue *look (vorbis_info *vi,vorbis_info_mode *vm,
97 vorbis_info_residue *vr){
98 vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
99 vorbis_look_residue0 *look=calloc(1,sizeof(vorbis_look_residue0));
102 for(j=0;j<info->partitions;j++){
103 look->bookpointers[j]=acc;
104 acc+=info->secondstages[j];
110 int forward(vorbis_block *vb,vorbis_look_residue *l,
113 vorbis_look_residue0 *look=(vorbis_look_residue0 *)l;
114 vorbis_info_residue0 *info=look->info;
116 for(j=0;j<vb->pcmend/2;j++)
117 _oggpack_write(&vb->opb,rint(in[i][j])+16,5);
121 int inverse(vorbis_block *vb,vorbis_look_residue *l,double **in,int ch){
124 for(j=0;j<vb->pcmend/2;j++)
125 in[i][j]*=_oggpack_read(&vb->opb,5)-16;
129 vorbis_func_residue residue0_exportbundle={