comparison g726.c @ 7071:cbc38c3580da libavcodec

Copy 4 pointers to avid dozends of ptr dereferences.
author michael
date Thu, 19 Jun 2008 10:49:30 +0000
parents 3e197f8ee6c6
children be6f9be3a79d
comparison
equal deleted inserted replaced
7070:3e197f8ee6c6 7071:cbc38c3580da
69 const int16_t* W; /**< special table #1 ;-) */ 69 const int16_t* W; /**< special table #1 ;-) */
70 const uint8_t* F; /**< special table #2 */ 70 const uint8_t* F; /**< special table #2 */
71 } G726Tables; 71 } G726Tables;
72 72
73 typedef struct G726Context { 73 typedef struct G726Context {
74 const G726Tables* tbls; /**< static tables needed for computation */ 74 G726Tables tbls; /**< static tables needed for computation */
75 75
76 Float11 sr[2]; /**< prev. reconstructed samples */ 76 Float11 sr[2]; /**< prev. reconstructed samples */
77 Float11 dq[6]; /**< prev. difference */ 77 Float11 dq[6]; /**< prev. difference */
78 int a[2]; /**< second order predictor coeffs */ 78 int a[2]; /**< second order predictor coeffs */
79 int b[6]; /**< sixth order predictor coeffs */ 79 int b[6]; /**< sixth order predictor coeffs */
158 d = -d; 158 d = -d;
159 } 159 }
160 exp = av_log2_16bit(d); 160 exp = av_log2_16bit(d);
161 dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2); 161 dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2);
162 162
163 while (c->tbls->quant[i] < INT_MAX && c->tbls->quant[i] < dln) 163 while (c->tbls.quant[i] < INT_MAX && c->tbls.quant[i] < dln)
164 ++i; 164 ++i;
165 165
166 if (sign) 166 if (sign)
167 i = ~i; 167 i = ~i;
168 if (c->tbls->bits != 2 && i == 0) /* I'm not sure this is a good idea */ 168 if (c->tbls.bits != 2 && i == 0) /* I'm not sure this is a good idea */
169 i = 0xff; 169 i = 0xff;
170 170
171 return i; 171 return i;
172 } 172 }
173 173
176 */ 176 */
177 static inline int16_t inverse_quant(G726Context* c, int i) 177 static inline int16_t inverse_quant(G726Context* c, int i)
178 { 178 {
179 int dql, dex, dqt; 179 int dql, dex, dqt;
180 180
181 dql = c->tbls->iquant[i] + (c->y >> 2); 181 dql = c->tbls.iquant[i] + (c->y >> 2);
182 dex = (dql>>7) & 0xf; /* 4bit exponent */ 182 dex = (dql>>7) & 0xf; /* 4bit exponent */
183 dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */ 183 dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */
184 return (dql < 0) ? 0 : ((dqt<<dex) >> 7); 184 return (dql < 0) ? 0 : ((dqt<<dex) >> 7);
185 } 185 }
186 186
187 static int16_t g726_decode(G726Context* c, int I) 187 static int16_t g726_decode(G726Context* c, int I)
188 { 188 {
189 int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0; 189 int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0;
190 Float11 f; 190 Float11 f;
191 int I_sig= I >> (c->tbls->bits - 1); 191 int I_sig= I >> (c->tbls.bits - 1);
192 192
193 dq = inverse_quant(c, I); 193 dq = inverse_quant(c, I);
194 194
195 /* Transition detect */ 195 /* Transition detect */
196 ylint = (c->yl >> 15); 196 ylint = (c->yl >> 15);
234 c->dq[0].sign = I_sig; /* Isn't it crazy ?!?! */ 234 c->dq[0].sign = I_sig; /* Isn't it crazy ?!?! */
235 235
236 c->td = c->a[1] < -11776; 236 c->td = c->a[1] < -11776;
237 237
238 /* Update Ap */ 238 /* Update Ap */
239 c->dms += ((c->tbls->F[I]<<9) - c->dms) >> 5; 239 c->dms += ((c->tbls.F[I]<<9) - c->dms) >> 5;
240 c->dml += ((c->tbls->F[I]<<11) - c->dml) >> 7; 240 c->dml += ((c->tbls.F[I]<<11) - c->dml) >> 7;
241 if (tr) 241 if (tr)
242 c->ap = 256; 242 c->ap = 256;
243 else if (c->y > 1535 && !c->td && abs((c->dms << 2) - c->dml) < (c->dml >> 3)) 243 else if (c->y > 1535 && !c->td && abs((c->dms << 2) - c->dml) < (c->dml >> 3))
244 c->ap += (-c->ap) >> 4; 244 c->ap += (-c->ap) >> 4;
245 else 245 else
246 c->ap += (0x200 - c->ap) >> 4; 246 c->ap += (0x200 - c->ap) >> 4;
247 247
248 /* Update Yu and Yl */ 248 /* Update Yu and Yl */
249 c->yu = av_clip(c->y + c->tbls->W[I] + ((-c->y)>>5), 544, 5120); 249 c->yu = av_clip(c->y + c->tbls.W[I] + ((-c->y)>>5), 544, 5120);
250 c->yl += c->yu + ((-c->yl)>>6); 250 c->yl += c->yu + ((-c->yl)>>6);
251 251
252 /* Next iteration for Y */ 252 /* Next iteration for Y */
253 al = (c->ap >= 256) ? 1<<6 : c->ap >> 2; 253 al = (c->ap >= 256) ? 1<<6 : c->ap >> 2;
254 c->y = (c->yl + (c->yu - (c->yl>>6))*al) >> 6; 254 c->y = (c->yl + (c->yu - (c->yl>>6))*al) >> 6;
267 267
268 static av_cold int g726_reset(G726Context* c, int index) 268 static av_cold int g726_reset(G726Context* c, int index)
269 { 269 {
270 int i; 270 int i;
271 271
272 c->tbls = &G726Tables_pool[index]; 272 c->tbls = G726Tables_pool[index];
273 for (i=0; i<2; i++) { 273 for (i=0; i<2; i++) {
274 c->sr[i].mant = 1<<5; 274 c->sr[i].mant = 1<<5;
275 c->pk[i] = 1; 275 c->pk[i] = 1;
276 } 276 }
277 for (i=0; i<6; i++) { 277 for (i=0; i<6; i++) {
288 #ifdef CONFIG_ENCODERS 288 #ifdef CONFIG_ENCODERS
289 static int16_t g726_encode(G726Context* c, int16_t sig) 289 static int16_t g726_encode(G726Context* c, int16_t sig)
290 { 290 {
291 uint8_t i; 291 uint8_t i;
292 292
293 i = quant(c, sig/4 - c->se) & ((1<<c->tbls->bits) - 1); 293 i = quant(c, sig/4 - c->se) & ((1<<c->tbls.bits) - 1);
294 g726_decode(c, i); 294 g726_decode(c, i);
295 return i; 295 return i;
296 } 296 }
297 #endif 297 #endif
298 298
314 if(index>3){ 314 if(index>3){
315 av_log(avctx, AV_LOG_ERROR, "Unsupported number of bits %d\n", index+2); 315 av_log(avctx, AV_LOG_ERROR, "Unsupported number of bits %d\n", index+2);
316 return -1; 316 return -1;
317 } 317 }
318 g726_reset(c, index); 318 g726_reset(c, index);
319 c->code_size = c->tbls->bits; 319 c->code_size = c->tbls.bits;
320 320
321 avctx->coded_frame = avcodec_alloc_frame(); 321 avctx->coded_frame = avcodec_alloc_frame();
322 if (!avctx->coded_frame) 322 if (!avctx->coded_frame)
323 return AVERROR(ENOMEM); 323 return AVERROR(ENOMEM);
324 avctx->coded_frame->key_frame = 1; 324 avctx->coded_frame->key_frame = 1;