media/libtheora/lib/dequant.c

changeset 0
6474c204b198
     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 +}

mercurial