Coverage Report

Created: 2026-03-21 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libtheora/lib/dequant.c
Line
Count
Source
1
/********************************************************************
2
 *                                                                  *
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.       *
7
 *                                                                  *
8
 * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009                *
9
 * by the Xiph.Org Foundation and contributors                      *
10
 * https://www.xiph.org/                                            *
11
 *                                                                  *
12
 ********************************************************************
13
14
  function:
15
16
 ********************************************************************/
17
18
#include <stdlib.h>
19
#include <string.h>
20
#include <ogg/ogg.h>
21
#include "dequant.h"
22
#include "decint.h"
23
24
1.27k
int oc_quant_params_unpack(oc_pack_buf *_opb,th_quant_info *_qinfo){
25
1.27k
  th_quant_base *base_mats;
26
1.27k
  long           val;
27
1.27k
  int            nbase_mats;
28
1.27k
  int            sizes[64];
29
1.27k
  int            indices[64];
30
1.27k
  int            nbits;
31
1.27k
  int            bmi;
32
1.27k
  int            ci;
33
1.27k
  int            qti;
34
1.27k
  int            pli;
35
1.27k
  int            qri;
36
1.27k
  int            qi;
37
1.27k
  int            i;
38
1.27k
  val=oc_pack_read(_opb,3);
39
1.27k
  nbits=(int)val;
40
83.1k
  for(qi=0;qi<64;qi++){
41
81.8k
    val=oc_pack_read(_opb,nbits);
42
81.8k
    _qinfo->loop_filter_limits[qi]=(unsigned char)val;
43
81.8k
  }
44
1.27k
  val=oc_pack_read(_opb,4);
45
1.27k
  nbits=(int)val+1;
46
83.1k
  for(qi=0;qi<64;qi++){
47
81.8k
    val=oc_pack_read(_opb,nbits);
48
81.8k
    _qinfo->ac_scale[qi]=(ogg_uint16_t)val;
49
81.8k
  }
50
1.27k
  val=oc_pack_read(_opb,4);
51
1.27k
  nbits=(int)val+1;
52
83.1k
  for(qi=0;qi<64;qi++){
53
81.8k
    val=oc_pack_read(_opb,nbits);
54
81.8k
    _qinfo->dc_scale[qi]=(ogg_uint16_t)val;
55
81.8k
  }
56
1.27k
  val=oc_pack_read(_opb,9);
57
1.27k
  nbase_mats=(int)val+1;
58
1.27k
  base_mats=_ogg_malloc(nbase_mats*sizeof(base_mats[0]));
59
1.27k
  if(base_mats==NULL)return TH_EFAULT;
60
8.48k
  for(bmi=0;bmi<nbase_mats;bmi++){
61
468k
    for(ci=0;ci<64;ci++){
62
460k
      val=oc_pack_read(_opb,8);
63
460k
      base_mats[bmi][ci]=(unsigned char)val;
64
460k
    }
65
7.20k
  }
66
1.27k
  nbits=oc_ilog(nbase_mats-1);
67
8.82k
  for(i=0;i<6;i++){
68
7.57k
    th_quant_ranges *qranges;
69
7.57k
    th_quant_base   *qrbms;
70
7.57k
    int             *qrsizes;
71
7.57k
    qti=i/3;
72
7.57k
    pli=i%3;
73
7.57k
    qranges=_qinfo->qi_ranges[qti]+pli;
74
7.57k
    if(i>0){
75
6.29k
      val=oc_pack_read1(_opb);
76
6.29k
      if(!val){
77
6.08k
        int qtj;
78
6.08k
        int plj;
79
6.08k
        if(qti>0){
80
3.68k
          val=oc_pack_read1(_opb);
81
3.68k
          if(val){
82
1.53k
            qtj=qti-1;
83
1.53k
            plj=pli;
84
1.53k
          }
85
2.15k
          else{
86
2.15k
            qtj=(i-1)/3;
87
2.15k
            plj=(i-1)%3;
88
2.15k
          }
89
3.68k
        }
90
2.40k
        else{
91
2.40k
          qtj=(i-1)/3;
92
2.40k
          plj=(i-1)%3;
93
2.40k
        }
94
6.08k
        *qranges=*(_qinfo->qi_ranges[qtj]+plj);
95
6.08k
        continue;
96
6.08k
      }
97
6.29k
    }
98
1.48k
    val=oc_pack_read(_opb,nbits);
99
1.48k
    indices[0]=(int)val;
100
8.86k
    for(qi=qri=0;qi<63;){
101
7.38k
      val=oc_pack_read(_opb,oc_ilog(62-qi));
102
7.38k
      sizes[qri]=(int)val+1;
103
7.38k
      qi+=(int)val+1;
104
7.38k
      val=oc_pack_read(_opb,nbits);
105
7.38k
      indices[++qri]=(int)val;
106
7.38k
    }
107
    /*Note: The caller is responsible for cleaning up any partially
108
       constructed qinfo.*/
109
1.48k
    if(qi>63){
110
15
      _ogg_free(base_mats);
111
15
      return TH_EBADHEADER;
112
15
    }
113
1.46k
    qranges->nranges=qri;
114
1.46k
    qranges->sizes=qrsizes=(int *)_ogg_malloc(qri*sizeof(qrsizes[0]));
115
1.46k
    if(qranges->sizes==NULL){
116
      /*Note: The caller is responsible for cleaning up any partially
117
         constructed qinfo.*/
118
0
      _ogg_free(base_mats);
119
0
      return TH_EFAULT;
120
0
    }
121
1.46k
    memcpy(qrsizes,sizes,qri*sizeof(qrsizes[0]));
122
1.46k
    qrbms=(th_quant_base *)_ogg_malloc((qri+1)*sizeof(qrbms[0]));
123
1.46k
    if(qrbms==NULL){
124
      /*Note: The caller is responsible for cleaning up any partially
125
         constructed qinfo.*/
126
0
      _ogg_free(base_mats);
127
0
      return TH_EFAULT;
128
0
    }
129
1.46k
    qranges->base_matrices=(const th_quant_base *)qrbms;
130
8.80k
    do{
131
8.80k
      bmi=indices[qri];
132
      /*Note: The caller is responsible for cleaning up any partially
133
         constructed qinfo.*/
134
8.80k
      if(bmi>=nbase_mats){
135
8
        _ogg_free(base_mats);
136
8
        return TH_EBADHEADER;
137
8
      }
138
8.79k
      memcpy(qrbms[qri],base_mats[bmi],sizeof(qrbms[qri]));
139
8.79k
    }
140
8.79k
    while(qri-->0);
141
1.46k
  }
142
1.25k
  _ogg_free(base_mats);
143
1.25k
  return 0;
144
1.27k
}
145
146
1.27k
void oc_quant_params_clear(th_quant_info *_qinfo){
147
1.27k
  int i;
148
8.95k
  for(i=6;i-->0;){
149
7.67k
    int qti;
150
7.67k
    int pli;
151
7.67k
    qti=i/3;
152
7.67k
    pli=i%3;
153
    /*Clear any duplicate pointer references.*/
154
7.67k
    if(i>0){
155
6.39k
      int qtj;
156
6.39k
      int plj;
157
6.39k
      qtj=(i-1)/3;
158
6.39k
      plj=(i-1)%3;
159
6.39k
      if(_qinfo->qi_ranges[qti][pli].sizes==
160
6.39k
       _qinfo->qi_ranges[qtj][plj].sizes){
161
6.05k
        _qinfo->qi_ranges[qti][pli].sizes=NULL;
162
6.05k
      }
163
6.39k
      if(_qinfo->qi_ranges[qti][pli].base_matrices==
164
6.39k
       _qinfo->qi_ranges[qtj][plj].base_matrices){
165
6.05k
        _qinfo->qi_ranges[qti][pli].base_matrices=NULL;
166
6.05k
      }
167
6.39k
    }
168
7.67k
    if(qti>0){
169
3.83k
      if(_qinfo->qi_ranges[1][pli].sizes==
170
3.83k
       _qinfo->qi_ranges[0][pli].sizes){
171
181
        _qinfo->qi_ranges[1][pli].sizes=NULL;
172
181
      }
173
3.83k
      if(_qinfo->qi_ranges[1][pli].base_matrices==
174
3.83k
       _qinfo->qi_ranges[0][pli].base_matrices){
175
181
        _qinfo->qi_ranges[1][pli].base_matrices=NULL;
176
181
      }
177
3.83k
    }
178
    /*Now free all the non-duplicate storage.*/
179
7.67k
    _ogg_free((void *)_qinfo->qi_ranges[qti][pli].sizes);
180
7.67k
    _ogg_free((void *)_qinfo->qi_ranges[qti][pli].base_matrices);
181
7.67k
  }
182
1.27k
}