eca00652f9babfebf859b3547573bab9f0e5cc28
[platform/upstream/libvorbis.git] / lib / floor0.c
1 /********************************************************************
2  *                                                                  *
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.                            *
7  *                                                                  *
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/                                             *
11  *                                                                  *
12  ********************************************************************
13
14  function: floor backend 0 implementation
15  last mod: $Id: floor0.c,v 1.1 2000/01/20 04:42:55 xiphmont Exp $
16
17  ********************************************************************/
18
19 #include <stdlib.h>
20 #include <string.h>
21 #include "vorbis/codec.h"
22 #include "bitwise.h"
23 #include "registry.h"
24 #include "floor0.h"
25
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));
29   if(d->stages){
30     d->books=malloc(sizeof(int)*d->stages);
31     memcpy(d->books,((vorbis_info_floor0 *)source)->books,
32            sizeof(int)*d->stages);
33   }
34   return(d);
35 }
36
37 extern void _vorbis_floor0_free(_vi_info_floor *i){
38   vorbis_info_floor0 *d=(vorbis_info_floor0 *)i;
39   if(d){
40     if(d->books)free(d->books);
41     memset(i,0,sizeof(vorbis_info_floor0));
42   }
43 }
44
45 extern void _vorbis_floor0_pack(oggpack_buffer *opb,_vi_info_floor *vi){
46   vorbis_info_floor0 *d=(vorbis_info_floor0 *)vi;
47   int i;
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);
54 }
55
56 extern _vi_info_floor *_vorbis_floor0_unpack(vorbis_info *vi,
57                                              oggpack_buffer *opb){
58   vorbis_info_floor0 d;
59   int i;
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);
64   
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);
69
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);
74   }
75   return(_vorbis_floor0_dup(&d));
76 }