1 /********************************************************************
3 * THIS FILE IS PART OF THE OggTheora 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
9 * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
11 ********************************************************************
14 last mod: $Id: dequant.c 16503 2009-08-22 18:14:02Z giles $
16 ********************************************************************/
24 int oc_quant_params_unpack(oc_pack_buf *_opb,th_quant_info *_qinfo){
25 th_quant_base *base_mats;
38 val=oc_pack_read(_opb,3);
41 val=oc_pack_read(_opb,nbits);
42 _qinfo->loop_filter_limits[qi]=(unsigned char)val;
44 val=oc_pack_read(_opb,4);
47 val=oc_pack_read(_opb,nbits);
48 _qinfo->ac_scale[qi]=(ogg_uint16_t)val;
50 val=oc_pack_read(_opb,4);
53 val=oc_pack_read(_opb,nbits);
54 _qinfo->dc_scale[qi]=(ogg_uint16_t)val;
56 val=oc_pack_read(_opb,9);
57 nbase_mats=(int)val+1;
58 base_mats=_ogg_malloc(nbase_mats*sizeof(base_mats[0]));
59 if(base_mats==NULL)return TH_EFAULT;
60 for(bmi=0;bmi<nbase_mats;bmi++){
62 val=oc_pack_read(_opb,8);
63 base_mats[bmi][ci]=(unsigned char)val;
66 nbits=oc_ilog(nbase_mats-1);
68 th_quant_ranges *qranges;
73 qranges=_qinfo->qi_ranges[qti]+pli;
75 val=oc_pack_read1(_opb);
80 val=oc_pack_read1(_opb);
94 *qranges=*(_qinfo->qi_ranges[qtj]+plj);
98 val=oc_pack_read(_opb,nbits);
100 for(qi=qri=0;qi<63;){
101 val=oc_pack_read(_opb,oc_ilog(62-qi));
102 sizes[qri]=(int)val+1;
104 val=oc_pack_read(_opb,nbits);
105 indices[++qri]=(int)val;
107 /*Note: The caller is responsible for cleaning up any partially
110 _ogg_free(base_mats);
111 return TH_EBADHEADER;
113 qranges->nranges=qri;
114 qranges->sizes=qrsizes=(int *)_ogg_malloc(qri*sizeof(qrsizes[0]));
115 if(qranges->sizes==NULL){
116 /*Note: The caller is responsible for cleaning up any partially
118 _ogg_free(base_mats);
121 memcpy(qrsizes,sizes,qri*sizeof(qrsizes[0]));
122 qrbms=(th_quant_base *)_ogg_malloc((qri+1)*sizeof(qrbms[0]));
124 /*Note: The caller is responsible for cleaning up any partially
126 _ogg_free(base_mats);
129 qranges->base_matrices=(const th_quant_base *)qrbms;
132 /*Note: The caller is responsible for cleaning up any partially
135 _ogg_free(base_mats);
136 return TH_EBADHEADER;
138 memcpy(qrbms[qri],base_mats[bmi],sizeof(qrbms[qri]));
142 _ogg_free(base_mats);
146 void oc_quant_params_clear(th_quant_info *_qinfo){
153 /*Clear any duplicate pointer references.*/
159 if(_qinfo->qi_ranges[qti][pli].sizes==
160 _qinfo->qi_ranges[qtj][plj].sizes){
161 _qinfo->qi_ranges[qti][pli].sizes=NULL;
163 if(_qinfo->qi_ranges[qti][pli].base_matrices==
164 _qinfo->qi_ranges[qtj][plj].base_matrices){
165 _qinfo->qi_ranges[qti][pli].base_matrices=NULL;
169 if(_qinfo->qi_ranges[1][pli].sizes==
170 _qinfo->qi_ranges[0][pli].sizes){
171 _qinfo->qi_ranges[1][pli].sizes=NULL;
173 if(_qinfo->qi_ranges[1][pli].base_matrices==
174 _qinfo->qi_ranges[0][pli].base_matrices){
175 _qinfo->qi_ranges[1][pli].base_matrices=NULL;
178 /*Now free all the non-duplicate storage.*/
179 _ogg_free((void *)_qinfo->qi_ranges[qti][pli].sizes);
180 _ogg_free((void *)_qinfo->qi_ranges[qti][pli].base_matrices);