1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: residue backend 0, 1 and 2 implementation
14 last mod: $Id: res0.c 16227 2009-07-08 06:58:46Z xiphmont $
16 ********************************************************************/
18 /* Slow, slow, slow, simpleminded and did I mention it was slow? The
19 encode/decode loops are coded for clarity and performance is not
20 yet even a nagging little idea lurking in the shadows. Oh and BTW,
27 #include "vorbis/codec.h"
28 #include "codec_internal.h"
34 #if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
39 vorbis_info_residue0
*info
;
45 codebook
***partbooks
;
54 #if defined(TRAIN_RES) || defined(TRAIN_RESAUX)
56 long *training_data
[8][64];
57 float training_max
[8][64];
58 float training_min
[8][64];
63 } vorbis_look_residue0
;
65 void res0_free_info(vorbis_info_residue
*i
){
66 vorbis_info_residue0
*info
=(vorbis_info_residue0
*)i
;
68 memset(info
,0,sizeof(*info
));
73 void res0_free_look(vorbis_look_residue
*i
){
77 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)i
;
82 for(j
=0;j
<look
->parts
;j
++){
83 /*fprintf(stderr,"partition %d: ",j);*/
85 if(look
->training_data
[k
][j
]){
88 codebook
*statebook
=look
->partbooks
[j
][k
];
90 /* long and short into the same bucket by current convention */
91 sprintf(buffer
,"res_part%d_pass%d.vqd",j
,k
);
94 for(l
=0;l
<statebook
->entries
;l
++)
95 fprintf(of
,"%d:%ld\n",l
,look
->training_data
[k
][j
][l
]);
99 /*fprintf(stderr,"%d(%.2f|%.2f) ",k,
100 look->training_min[k][j],look->training_max[k][j]);*/
102 _ogg_free(look
->training_data
[k
][j
]);
103 look
->training_data
[k
][j
]=NULL
;
105 /*fprintf(stderr,"\n");*/
108 fprintf(stderr
,"min/max residue: %g::%g\n",look
->tmin
,look
->tmax
);
110 /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n",
111 (float)look->phrasebits/look->frames,
112 (float)look->postbits/look->frames,
113 (float)(look->postbits+look->phrasebits)/look->frames);*/
117 /*vorbis_info_residue0 *info=look->info;
120 "%ld frames encoded in %ld phrasebits and %ld residue bits "
121 "(%g/frame) \n",look->frames,look->phrasebits,
123 (look->phrasebits+look->resbitsflat)/(float)look->frames);
125 for(j=0;j<look->parts;j++){
127 fprintf(stderr,"\t[%d] == ",j);
128 for(k=0;k<look->stages;k++)
129 if((info->secondstages[j]>>k)&1){
130 fprintf(stderr,"%ld,",look->resbits[j][k]);
131 acc+=look->resbits[j][k];
134 fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j],
135 acc?(float)acc/(look->resvals[j]*info->grouping):0);
137 fprintf(stderr,"\n");*/
139 for(j
=0;j
<look
->parts
;j
++)
140 if(look
->partbooks
[j
])_ogg_free(look
->partbooks
[j
]);
141 _ogg_free(look
->partbooks
);
142 for(j
=0;j
<look
->partvals
;j
++)
143 _ogg_free(look
->decodemap
[j
]);
144 _ogg_free(look
->decodemap
);
146 memset(look
,0,sizeof(*look
));
151 static int ilog(unsigned int v
){
160 static int icount(unsigned int v
){
170 void res0_pack(vorbis_info_residue
*vr
,oggpack_buffer
*opb
){
171 vorbis_info_residue0
*info
=(vorbis_info_residue0
*)vr
;
173 oggpack_write(opb
,info
->begin
,24);
174 oggpack_write(opb
,info
->end
,24);
176 oggpack_write(opb
,info
->grouping
-1,24); /* residue vectors to group and
177 code with a partitioned book */
178 oggpack_write(opb
,info
->partitions
-1,6); /* possible partition choices */
179 oggpack_write(opb
,info
->groupbook
,8); /* group huffman book */
181 /* secondstages is a bitmask; as encoding progresses pass by pass, a
182 bitmask of one indicates this partition class has bits to write
184 for(j
=0;j
<info
->partitions
;j
++){
185 if(ilog(info
->secondstages
[j
])>3){
186 /* yes, this is a minor hack due to not thinking ahead */
187 oggpack_write(opb
,info
->secondstages
[j
],3);
188 oggpack_write(opb
,1,1);
189 oggpack_write(opb
,info
->secondstages
[j
]>>3,5);
191 oggpack_write(opb
,info
->secondstages
[j
],4); /* trailing zero */
192 acc
+=icount(info
->secondstages
[j
]);
195 oggpack_write(opb
,info
->booklist
[j
],8);
199 /* vorbis_info is for range checking */
200 vorbis_info_residue
*res0_unpack(vorbis_info
*vi
,oggpack_buffer
*opb
){
202 vorbis_info_residue0
*info
=_ogg_calloc(1,sizeof(*info
));
203 codec_setup_info
*ci
=vi
->codec_setup
;
205 info
->begin
=oggpack_read(opb
,24);
206 info
->end
=oggpack_read(opb
,24);
207 info
->grouping
=oggpack_read(opb
,24)+1;
208 info
->partitions
=oggpack_read(opb
,6)+1;
209 info
->groupbook
=oggpack_read(opb
,8);
211 /* check for premature EOP */
212 if(info
->groupbook
<0)goto errout
;
214 for(j
=0;j
<info
->partitions
;j
++){
215 int cascade
=oggpack_read(opb
,3);
216 int cflag
=oggpack_read(opb
,1);
217 if(cflag
<0) goto errout
;
219 int c
=oggpack_read(opb
,5);
223 info
->secondstages
[j
]=cascade
;
225 acc
+=icount(cascade
);
228 int book
=oggpack_read(opb
,8);
229 if(book
<0) goto errout
;
230 info
->booklist
[j
]=book
;
233 if(info
->groupbook
>=ci
->books
)goto errout
;
235 if(info
->booklist
[j
]>=ci
->books
)goto errout
;
236 if(ci
->book_param
[info
->booklist
[j
]]->maptype
==0)goto errout
;
239 /* verify the phrasebook is not specifying an impossible or
240 inconsistent partitioning scheme. */
242 int entries
= ci
->book_param
[info
->groupbook
]->entries
;
243 int dim
= ci
->book_param
[info
->groupbook
]->dim
;
246 partvals
*= info
->partitions
;
247 if(partvals
> entries
) goto errout
;
254 res0_free_info(info
);
258 vorbis_look_residue
*res0_look(vorbis_dsp_state
*vd
,
259 vorbis_info_residue
*vr
){
260 vorbis_info_residue0
*info
=(vorbis_info_residue0
*)vr
;
261 vorbis_look_residue0
*look
=_ogg_calloc(1,sizeof(*look
));
262 codec_setup_info
*ci
=vd
->vi
->codec_setup
;
269 look
->parts
=info
->partitions
;
270 look
->fullbooks
=ci
->fullbooks
;
271 look
->phrasebook
=ci
->fullbooks
+info
->groupbook
;
272 dim
=look
->phrasebook
->dim
;
274 look
->partbooks
=_ogg_calloc(look
->parts
,sizeof(*look
->partbooks
));
276 for(j
=0;j
<look
->parts
;j
++){
277 int stages
=ilog(info
->secondstages
[j
]);
279 if(stages
>maxstage
)maxstage
=stages
;
280 look
->partbooks
[j
]=_ogg_calloc(stages
,sizeof(*look
->partbooks
[j
]));
281 for(k
=0;k
<stages
;k
++)
282 if(info
->secondstages
[j
]&(1<<k
)){
283 look
->partbooks
[j
][k
]=ci
->fullbooks
+info
->booklist
[acc
++];
285 look
->training_data
[k
][j
]=_ogg_calloc(look
->partbooks
[j
][k
]->entries
,
286 sizeof(***look
->training_data
));
294 look
->partvals
*=look
->parts
;
296 look
->stages
=maxstage
;
297 look
->decodemap
=_ogg_malloc(look
->partvals
*sizeof(*look
->decodemap
));
298 for(j
=0;j
<look
->partvals
;j
++){
300 long mult
=look
->partvals
/look
->parts
;
301 look
->decodemap
[j
]=_ogg_malloc(dim
*sizeof(*look
->decodemap
[j
]));
306 look
->decodemap
[j
][k
]=deco
;
309 #if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
311 static int train_seq
=0;
312 look
->train_seq
=train_seq
++;
318 /* break an abstraction and copy some code for performance purposes */
319 static int local_book_besterror(codebook
*book
,float *a
){
320 int dim
=book
->dim
,i
,k
,o
;
322 encode_aux_threshmatch
*tt
=book
->c
->thresh_tree
;
324 /* find the quant val of each scalar */
325 for(k
=0,o
=dim
;k
<dim
;++k
){
329 if(val
<tt
->quantthresh
[i
]){
330 if(val
<tt
->quantthresh
[i
-1]){
332 if(val
>=tt
->quantthresh
[i
-1])
337 for(++i
;i
<tt
->threshvals
-1;++i
)
338 if(val
<tt
->quantthresh
[i
])break;
342 best
=(best
*tt
->quantvals
)+tt
->quantmap
[i
];
344 /* regular lattices are easy :-) */
346 if(book
->c
->lengthlist
[best
]<=0){
347 const static_codebook
*c
=book
->c
;
350 float *e
=book
->valuelist
;
352 for(i
=0;i
<book
->entries
;i
++){
353 if(c
->lengthlist
[i
]>0){
356 float val
=(e
[j
]-a
[j
]);
359 if(best
==-1 || this<bestf
){
369 float *ptr
=book
->valuelist
+best
*dim
;
377 static int _encodepart(oggpack_buffer
*opb
,float *vec
, int n
,
378 codebook
*book
,long *acc
){
384 int entry
=local_book_besterror(book
,vec
+i
*dim
);
391 bits
+=vorbis_book_encode(book
,entry
,opb
);
398 static long **_01class(vorbis_block
*vb
,vorbis_look_residue
*vl
,
401 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)vl
;
402 vorbis_info_residue0
*info
=look
->info
;
404 /* move all this setup out later */
405 int samples_per_partition
=info
->grouping
;
406 int possible_partitions
=info
->partitions
;
407 int n
=info
->end
-info
->begin
;
409 int partvals
=n
/samples_per_partition
;
410 long **partword
=_vorbis_block_alloc(vb
,ch
*sizeof(*partword
));
411 float scale
=100./samples_per_partition
;
413 /* we find the partition type for each partition of each
414 channel. We'll go back and do the interleaved encoding in a
415 bit. For now, clarity */
418 partword
[i
]=_vorbis_block_alloc(vb
,n
/samples_per_partition
*sizeof(*partword
[i
]));
419 memset(partword
[i
],0,n
/samples_per_partition
*sizeof(*partword
[i
]));
422 for(i
=0;i
<partvals
;i
++){
423 int offset
=i
*samples_per_partition
+info
->begin
;
427 for(k
=0;k
<samples_per_partition
;k
++){
428 if(fabs(in
[j
][offset
+k
])>max
)max
=fabs(in
[j
][offset
+k
]);
429 ent
+=fabs(rint(in
[j
][offset
+k
]));
433 for(k
=0;k
<possible_partitions
-1;k
++)
434 if(max
<=info
->classmetric1
[k
] &&
435 (info
->classmetric2
[k
]<0 || (int)ent
<info
->classmetric2
[k
]))
448 sprintf(buffer
,"resaux_%d.vqd",look
->train_seq
);
449 of
=fopen(buffer
,"a");
450 for(j
=0;j
<partvals
;j
++)
451 fprintf(of
,"%ld, ",partword
[i
][j
]);
462 /* designed for stereo or other modes where the partition size is an
463 integer multiple of the number of channels encoded in the current
465 static long **_2class(vorbis_block
*vb
,vorbis_look_residue
*vl
,float **in
,
468 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)vl
;
469 vorbis_info_residue0
*info
=look
->info
;
471 /* move all this setup out later */
472 int samples_per_partition
=info
->grouping
;
473 int possible_partitions
=info
->partitions
;
474 int n
=info
->end
-info
->begin
;
476 int partvals
=n
/samples_per_partition
;
477 long **partword
=_vorbis_block_alloc(vb
,sizeof(*partword
));
479 #if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
484 partword
[0]=_vorbis_block_alloc(vb
,n
*ch
/samples_per_partition
*sizeof(*partword
[0]));
485 memset(partword
[0],0,n
*ch
/samples_per_partition
*sizeof(*partword
[0]));
487 for(i
=0,l
=info
->begin
/ch
;i
<partvals
;i
++){
490 for(j
=0;j
<samples_per_partition
;j
+=ch
){
491 if(fabs(in
[0][l
])>magmax
)magmax
=fabs(in
[0][l
]);
493 if(fabs(in
[k
][l
])>angmax
)angmax
=fabs(in
[k
][l
]);
497 for(j
=0;j
<possible_partitions
-1;j
++)
498 if(magmax
<=info
->classmetric1
[j
] &&
499 angmax
<=info
->classmetric2
[j
])
507 sprintf(buffer
,"resaux_%d.vqd",look
->train_seq
);
508 of
=fopen(buffer
,"a");
509 for(i
=0;i
<partvals
;i
++)
510 fprintf(of
,"%ld, ",partword
[0][i
]);
520 static int _01forward(oggpack_buffer
*opb
,
521 vorbis_block
*vb
,vorbis_look_residue
*vl
,
524 int (*encode
)(oggpack_buffer
*,float *,int,
527 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)vl
;
528 vorbis_info_residue0
*info
=look
->info
;
530 /* move all this setup out later */
531 int samples_per_partition
=info
->grouping
;
532 int possible_partitions
=info
->partitions
;
533 int partitions_per_word
=look
->phrasebook
->dim
;
534 int n
=info
->end
-info
->begin
;
536 int partvals
=n
/samples_per_partition
;
542 for(j
=info
->begin
;j
<end
;j
++){
543 if(in
[i
][j
]>look
->tmax
)look
->tmax
=in
[i
][j
];
544 if(in
[i
][j
]<look
->tmin
)look
->tmin
=in
[i
][j
];
548 memset(resbits
,0,sizeof(resbits
));
549 memset(resvals
,0,sizeof(resvals
));
551 /* we code the partition words for each channel, then the residual
552 words for a partition per channel until we've written all the
553 residual words for that partition word. Then write the next
554 partition channel words... */
556 for(s
=0;s
<look
->stages
;s
++){
558 for(i
=0;i
<partvals
;){
560 /* first we encode a partition codeword for each channel */
563 long val
=partword
[j
][i
];
564 for(k
=1;k
<partitions_per_word
;k
++){
565 val
*=possible_partitions
;
567 val
+=partword
[j
][i
+k
];
571 if(val
<look
->phrasebook
->entries
)
572 look
->phrasebits
+=vorbis_book_encode(look
->phrasebook
,val
,opb
);
573 #if 0 /*def TRAIN_RES*/
581 /* now we encode interleaved residual values for the partitions */
582 for(k
=0;k
<partitions_per_word
&& i
<partvals
;k
++,i
++){
583 long offset
=i
*samples_per_partition
+info
->begin
;
586 if(s
==0)resvals
[partword
[j
][i
]]+=samples_per_partition
;
587 if(info
->secondstages
[partword
[j
][i
]]&(1<<s
)){
588 codebook
*statebook
=look
->partbooks
[partword
[j
][i
]][s
];
591 long *accumulator
=NULL
;
594 accumulator
=look
->training_data
[s
][partword
[j
][i
]];
597 float *samples
=in
[j
]+offset
;
598 for(l
=0;l
<samples_per_partition
;l
++){
599 if(samples
[l
]<look
->training_min
[s
][partword
[j
][i
]])
600 look
->training_min
[s
][partword
[j
][i
]]=samples
[l
];
601 if(samples
[l
]>look
->training_max
[s
][partword
[j
][i
]])
602 look
->training_max
[s
][partword
[j
][i
]]=samples
[l
];
607 ret
=encode(opb
,in
[j
]+offset
,samples_per_partition
,
608 statebook
,accumulator
);
611 resbits
[partword
[j
][i
]]+=ret
;
622 fprintf(stderr,"%d :: ",vb->mode);
623 for(k=0;k<possible_partitions;k++){
624 fprintf(stderr,"%ld/%1.2g, ",resvals[k],(float)resbits[k]/resvals[k]);
626 totalbits+=resbits[k];
629 fprintf(stderr,":: %ld:%1.2g\n",total,(double)totalbits/total);
635 /* a truncated packet here just means 'stop working'; it's not an error */
636 static int _01inverse(vorbis_block
*vb
,vorbis_look_residue
*vl
,
638 long (*decodepart
)(codebook
*, float *,
639 oggpack_buffer
*,int)){
642 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)vl
;
643 vorbis_info_residue0
*info
=look
->info
;
645 /* move all this setup out later */
646 int samples_per_partition
=info
->grouping
;
647 int partitions_per_word
=look
->phrasebook
->dim
;
648 int max
=vb
->pcmend
>>1;
649 int end
=(info
->end
<max
?info
->end
:max
);
650 int n
=end
-info
->begin
;
653 int partvals
=n
/samples_per_partition
;
654 int partwords
=(partvals
+partitions_per_word
-1)/partitions_per_word
;
655 int ***partword
=alloca(ch
*sizeof(*partword
));
658 partword
[j
]=_vorbis_block_alloc(vb
,partwords
*sizeof(*partword
[j
]));
660 for(s
=0;s
<look
->stages
;s
++){
662 /* each loop decodes on partition codeword containing
663 partitions_per_word partitions */
664 for(i
=0,l
=0;i
<partvals
;l
++){
666 /* fetch the partition word for each channel */
668 int temp
=vorbis_book_decode(look
->phrasebook
,&vb
->opb
);
670 if(temp
==-1)goto eopbreak
;
671 partword
[j
][l
]=look
->decodemap
[temp
];
672 if(partword
[j
][l
]==NULL
)goto errout
;
676 /* now we decode residual values for the partitions */
677 for(k
=0;k
<partitions_per_word
&& i
<partvals
;k
++,i
++)
679 long offset
=info
->begin
+i
*samples_per_partition
;
680 if(info
->secondstages
[partword
[j
][l
][k
]]&(1<<s
)){
681 codebook
*stagebook
=look
->partbooks
[partword
[j
][l
][k
]][s
];
683 if(decodepart(stagebook
,in
[j
]+offset
,&vb
->opb
,
684 samples_per_partition
)==-1)goto eopbreak
;
697 /* residue 0 and 1 are just slight variants of one another. 0 is
698 interleaved, 1 is not */
699 long **res0_class(vorbis_block
*vb
,vorbis_look_residue
*vl
,
700 float **in
,int *nonzero
,int ch
){
701 /* we encode only the nonzero parts of a bundle */
707 /*return(_01class(vb,vl,in,used,_interleaved_testhack));*/
708 return(_01class(vb
,vl
,in
,used
));
713 int res0_forward(vorbis_block
*vb
,vorbis_look_residue
*vl
,
714 float **in
,float **out
,int *nonzero
,int ch
,
716 /* we encode only the nonzero parts of a bundle */
717 int i
,j
,used
=0,n
=vb
->pcmend
/2;
726 int ret
=_01forward(vb
,vl
,in
,used
,partword
,
727 _interleaved_encodepart
);
733 out
[i
][j
]-=in
[used
][j
];
744 int res0_inverse(vorbis_block
*vb
,vorbis_look_residue
*vl
,
745 float **in
,int *nonzero
,int ch
){
751 return(_01inverse(vb
,vl
,in
,used
,vorbis_book_decodevs_add
));
756 int res1_forward(oggpack_buffer
*opb
,vorbis_block
*vb
,vorbis_look_residue
*vl
,
757 float **in
,float **out
,int *nonzero
,int ch
,
759 int i
,j
,used
=0,n
=vb
->pcmend
/2;
769 int ret
=_01forward(opb
,vb
,vl
,in
,used
,partword
,_encodepart
);
775 out
[i
][j
]-=in
[used
][j
];
785 long **res1_class(vorbis_block
*vb
,vorbis_look_residue
*vl
,
786 float **in
,int *nonzero
,int ch
){
792 return(_01class(vb
,vl
,in
,used
));
797 int res1_inverse(vorbis_block
*vb
,vorbis_look_residue
*vl
,
798 float **in
,int *nonzero
,int ch
){
804 return(_01inverse(vb
,vl
,in
,used
,vorbis_book_decodev_add
));
809 long **res2_class(vorbis_block
*vb
,vorbis_look_residue
*vl
,
810 float **in
,int *nonzero
,int ch
){
813 if(nonzero
[i
])used
++;
815 return(_2class(vb
,vl
,in
,ch
));
820 /* res2 is slightly more different; all the channels are interleaved
821 into a single vector and encoded. */
823 int res2_forward(oggpack_buffer
*opb
,
824 vorbis_block
*vb
,vorbis_look_residue
*vl
,
825 float **in
,float **out
,int *nonzero
,int ch
,
827 long i
,j
,k
,n
=vb
->pcmend
/2,used
=0;
829 /* don't duplicate the code; use a working vector hack for now and
830 reshape ourselves into a single channel res1 */
831 /* ugly; reallocs for each coupling pass :-( */
832 float *work
=_vorbis_block_alloc(vb
,ch
*n
*sizeof(*work
));
835 if(nonzero
[i
])used
++;
836 for(j
=0,k
=i
;j
<n
;j
++,k
+=ch
)
841 int ret
=_01forward(opb
,vb
,vl
,&work
,1,partword
,_encodepart
);
842 /* update the sofar vector */
847 for(j
=0,k
=i
;j
<n
;j
++,k
+=ch
)
848 sofar
[j
]+=pcm
[j
]-work
[k
];
858 /* duplicate code here as speed is somewhat more important */
859 int res2_inverse(vorbis_block
*vb
,vorbis_look_residue
*vl
,
860 float **in
,int *nonzero
,int ch
){
862 vorbis_look_residue0
*look
=(vorbis_look_residue0
*)vl
;
863 vorbis_info_residue0
*info
=look
->info
;
865 /* move all this setup out later */
866 int samples_per_partition
=info
->grouping
;
867 int partitions_per_word
=look
->phrasebook
->dim
;
868 int max
=(vb
->pcmend
*ch
)>>1;
869 int end
=(info
->end
<max
?info
->end
:max
);
870 int n
=end
-info
->begin
;
873 int partvals
=n
/samples_per_partition
;
874 int partwords
=(partvals
+partitions_per_word
-1)/partitions_per_word
;
875 int **partword
=_vorbis_block_alloc(vb
,partwords
*sizeof(*partword
));
877 for(i
=0;i
<ch
;i
++)if(nonzero
[i
])break;
878 if(i
==ch
)return(0); /* no nonzero vectors */
880 for(s
=0;s
<look
->stages
;s
++){
881 for(i
=0,l
=0;i
<partvals
;l
++){
884 /* fetch the partition word */
885 int temp
=vorbis_book_decode(look
->phrasebook
,&vb
->opb
);
886 if(temp
==-1)goto eopbreak
;
887 partword
[l
]=look
->decodemap
[temp
];
888 if(partword
[l
]==NULL
)goto errout
;
891 /* now we decode residual values for the partitions */
892 for(k
=0;k
<partitions_per_word
&& i
<partvals
;k
++,i
++)
893 if(info
->secondstages
[partword
[l
][k
]]&(1<<s
)){
894 codebook
*stagebook
=look
->partbooks
[partword
[l
][k
]][s
];
897 if(vorbis_book_decodevv_add(stagebook
,in
,
898 i
*samples_per_partition
+info
->begin
,ch
,
899 &vb
->opb
,samples_per_partition
)==-1)
912 const vorbis_func_residue residue0_exportbundle
={
923 const vorbis_func_residue residue1_exportbundle
={
934 const vorbis_func_residue residue2_exportbundle
={