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: floor backend 0 implementation
15 last mod: $Id: floor0.c,v 1.1 2000/01/20 04:42:55 xiphmont Exp $
17 ********************************************************************/
21 #include "vorbis/codec.h"
26 extern _vi_info_floor *_vorbis_floor0_dup(_vi_info_floor *source){
27 vorbis_info_floor0 *d=malloc(sizeof(vorbis_info_floor0));
28 memcpy(d,source,sizeof(vorbis_info_floor0));
30 d->books=malloc(sizeof(int)*d->stages);
31 memcpy(d->books,((vorbis_info_floor0 *)source)->books,
32 sizeof(int)*d->stages);
37 extern void _vorbis_floor0_free(_vi_info_floor *i){
38 vorbis_info_floor0 *d=(vorbis_info_floor0 *)i;
40 if(d->books)free(d->books);
41 memset(i,0,sizeof(vorbis_info_floor0));
45 extern void _vorbis_floor0_pack(oggpack_buffer *opb,_vi_info_floor *vi){
46 vorbis_info_floor0 *d=(vorbis_info_floor0 *)vi;
48 _oggpack_write(opb,d->order,8);
49 _oggpack_write(opb,d->rate,16);
50 _oggpack_write(opb,d->barkmap,16);
51 _oggpack_write(opb,d->stages,8);
52 for(i=0;i<d->stages;i++)
53 _oggpack_write(opb,d->books[i],8);
56 extern _vi_info_floor *_vorbis_floor0_unpack(vorbis_info *vi,
60 d.order=_oggpack_read(opb,8);
61 d.rate=_oggpack_read(opb,16);
62 d.barkmap=_oggpack_read(opb,16);
63 d.stages=_oggpack_read(opb,8);
65 if(d.order<1)return(NULL);
66 if(d.rate<1)return(NULL);
67 if(d.barkmap<1)return(NULL);
68 if(d.stages<1)return(NULL);
70 d.books=alloca(sizeof(int)*d.stages);
71 for(i=0;i<d.stages;i++){
72 d.books[i]=_oggpack_read(opb,8);
73 if(d.books[i]<0 || d.books[i]>=vi->books)return(NULL);
75 return(_vorbis_floor0_dup(&d));