Mercurial > libavcodec.hg
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; |