1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libtheora/lib/dequant.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,182 @@ 1.4 +/******************************************************************** 1.5 + * * 1.6 + * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * 1.7 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 1.8 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 1.9 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 1.10 + * * 1.11 + * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * 1.12 + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * 1.13 + * * 1.14 + ******************************************************************** 1.15 + 1.16 + function: 1.17 + last mod: $Id: dequant.c 16503 2009-08-22 18:14:02Z giles $ 1.18 + 1.19 + ********************************************************************/ 1.20 + 1.21 +#include <stdlib.h> 1.22 +#include <string.h> 1.23 +#include <ogg/ogg.h> 1.24 +#include "dequant.h" 1.25 +#include "decint.h" 1.26 + 1.27 +int oc_quant_params_unpack(oc_pack_buf *_opb,th_quant_info *_qinfo){ 1.28 + th_quant_base *base_mats; 1.29 + long val; 1.30 + int nbase_mats; 1.31 + int sizes[64]; 1.32 + int indices[64]; 1.33 + int nbits; 1.34 + int bmi; 1.35 + int ci; 1.36 + int qti; 1.37 + int pli; 1.38 + int qri; 1.39 + int qi; 1.40 + int i; 1.41 + val=oc_pack_read(_opb,3); 1.42 + nbits=(int)val; 1.43 + for(qi=0;qi<64;qi++){ 1.44 + val=oc_pack_read(_opb,nbits); 1.45 + _qinfo->loop_filter_limits[qi]=(unsigned char)val; 1.46 + } 1.47 + val=oc_pack_read(_opb,4); 1.48 + nbits=(int)val+1; 1.49 + for(qi=0;qi<64;qi++){ 1.50 + val=oc_pack_read(_opb,nbits); 1.51 + _qinfo->ac_scale[qi]=(ogg_uint16_t)val; 1.52 + } 1.53 + val=oc_pack_read(_opb,4); 1.54 + nbits=(int)val+1; 1.55 + for(qi=0;qi<64;qi++){ 1.56 + val=oc_pack_read(_opb,nbits); 1.57 + _qinfo->dc_scale[qi]=(ogg_uint16_t)val; 1.58 + } 1.59 + val=oc_pack_read(_opb,9); 1.60 + nbase_mats=(int)val+1; 1.61 + base_mats=_ogg_malloc(nbase_mats*sizeof(base_mats[0])); 1.62 + if(base_mats==NULL)return TH_EFAULT; 1.63 + for(bmi=0;bmi<nbase_mats;bmi++){ 1.64 + for(ci=0;ci<64;ci++){ 1.65 + val=oc_pack_read(_opb,8); 1.66 + base_mats[bmi][ci]=(unsigned char)val; 1.67 + } 1.68 + } 1.69 + nbits=oc_ilog(nbase_mats-1); 1.70 + for(i=0;i<6;i++){ 1.71 + th_quant_ranges *qranges; 1.72 + th_quant_base *qrbms; 1.73 + int *qrsizes; 1.74 + qti=i/3; 1.75 + pli=i%3; 1.76 + qranges=_qinfo->qi_ranges[qti]+pli; 1.77 + if(i>0){ 1.78 + val=oc_pack_read1(_opb); 1.79 + if(!val){ 1.80 + int qtj; 1.81 + int plj; 1.82 + if(qti>0){ 1.83 + val=oc_pack_read1(_opb); 1.84 + if(val){ 1.85 + qtj=qti-1; 1.86 + plj=pli; 1.87 + } 1.88 + else{ 1.89 + qtj=(i-1)/3; 1.90 + plj=(i-1)%3; 1.91 + } 1.92 + } 1.93 + else{ 1.94 + qtj=(i-1)/3; 1.95 + plj=(i-1)%3; 1.96 + } 1.97 + *qranges=*(_qinfo->qi_ranges[qtj]+plj); 1.98 + continue; 1.99 + } 1.100 + } 1.101 + val=oc_pack_read(_opb,nbits); 1.102 + indices[0]=(int)val; 1.103 + for(qi=qri=0;qi<63;){ 1.104 + val=oc_pack_read(_opb,oc_ilog(62-qi)); 1.105 + sizes[qri]=(int)val+1; 1.106 + qi+=(int)val+1; 1.107 + val=oc_pack_read(_opb,nbits); 1.108 + indices[++qri]=(int)val; 1.109 + } 1.110 + /*Note: The caller is responsible for cleaning up any partially 1.111 + constructed qinfo.*/ 1.112 + if(qi>63){ 1.113 + _ogg_free(base_mats); 1.114 + return TH_EBADHEADER; 1.115 + } 1.116 + qranges->nranges=qri; 1.117 + qranges->sizes=qrsizes=(int *)_ogg_malloc(qri*sizeof(qrsizes[0])); 1.118 + if(qranges->sizes==NULL){ 1.119 + /*Note: The caller is responsible for cleaning up any partially 1.120 + constructed qinfo.*/ 1.121 + _ogg_free(base_mats); 1.122 + return TH_EFAULT; 1.123 + } 1.124 + memcpy(qrsizes,sizes,qri*sizeof(qrsizes[0])); 1.125 + qrbms=(th_quant_base *)_ogg_malloc((qri+1)*sizeof(qrbms[0])); 1.126 + if(qrbms==NULL){ 1.127 + /*Note: The caller is responsible for cleaning up any partially 1.128 + constructed qinfo.*/ 1.129 + _ogg_free(base_mats); 1.130 + return TH_EFAULT; 1.131 + } 1.132 + qranges->base_matrices=(const th_quant_base *)qrbms; 1.133 + do{ 1.134 + bmi=indices[qri]; 1.135 + /*Note: The caller is responsible for cleaning up any partially 1.136 + constructed qinfo.*/ 1.137 + if(bmi>=nbase_mats){ 1.138 + _ogg_free(base_mats); 1.139 + return TH_EBADHEADER; 1.140 + } 1.141 + memcpy(qrbms[qri],base_mats[bmi],sizeof(qrbms[qri])); 1.142 + } 1.143 + while(qri-->0); 1.144 + } 1.145 + _ogg_free(base_mats); 1.146 + return 0; 1.147 +} 1.148 + 1.149 +void oc_quant_params_clear(th_quant_info *_qinfo){ 1.150 + int i; 1.151 + for(i=6;i-->0;){ 1.152 + int qti; 1.153 + int pli; 1.154 + qti=i/3; 1.155 + pli=i%3; 1.156 + /*Clear any duplicate pointer references.*/ 1.157 + if(i>0){ 1.158 + int qtj; 1.159 + int plj; 1.160 + qtj=(i-1)/3; 1.161 + plj=(i-1)%3; 1.162 + if(_qinfo->qi_ranges[qti][pli].sizes== 1.163 + _qinfo->qi_ranges[qtj][plj].sizes){ 1.164 + _qinfo->qi_ranges[qti][pli].sizes=NULL; 1.165 + } 1.166 + if(_qinfo->qi_ranges[qti][pli].base_matrices== 1.167 + _qinfo->qi_ranges[qtj][plj].base_matrices){ 1.168 + _qinfo->qi_ranges[qti][pli].base_matrices=NULL; 1.169 + } 1.170 + } 1.171 + if(qti>0){ 1.172 + if(_qinfo->qi_ranges[1][pli].sizes== 1.173 + _qinfo->qi_ranges[0][pli].sizes){ 1.174 + _qinfo->qi_ranges[1][pli].sizes=NULL; 1.175 + } 1.176 + if(_qinfo->qi_ranges[1][pli].base_matrices== 1.177 + _qinfo->qi_ranges[0][pli].base_matrices){ 1.178 + _qinfo->qi_ranges[1][pli].base_matrices=NULL; 1.179 + } 1.180 + } 1.181 + /*Now free all the non-duplicate storage.*/ 1.182 + _ogg_free((void *)_qinfo->qi_ranges[qti][pli].sizes); 1.183 + _ogg_free((void *)_qinfo->qi_ranges[qti][pli].base_matrices); 1.184 + } 1.185 +}