Mercurial > mplayer.hg
comparison libaf/af_format.c @ 33736:a5a54c7a15ce
Fix the precision loss in float -> 32bit conversion case, introduced
by my earlier commit. Instead use method proposed by Reimar.
Also, avoid using ldexp, it is slower than multiply with constant.
author | iive |
---|---|
date | Wed, 06 Jul 2011 23:35:39 +0000 |
parents | 6c8743e5fa30 |
children | a93891202051 |
comparison
equal
deleted
inserted
replaced
33735:84defaf2e7f8 | 33736:a5a54c7a15ce |
---|---|
487 for(i=0;i<len;i++) | 487 for(i=0;i<len;i++) |
488 ((int16_t*)out)[i] = av_clip_int16(lrintf(32768.0 * in[i])); | 488 ((int16_t*)out)[i] = av_clip_int16(lrintf(32768.0 * in[i])); |
489 break; | 489 break; |
490 case(3): | 490 case(3): |
491 for(i=0;i<len;i++){ | 491 for(i=0;i<len;i++){ |
492 f = ldexp(in[i], 23); | 492 f = in[i] * 8388608; |
493 store24bit(out, i, av_clip(lrintf(f), -1*(1<<23), (1<<23)-1) << 8); | 493 store24bit(out, i, av_clip(lrintf(f), -1*(1<<23), (1<<23)-1) << 8); |
494 } | 494 } |
495 break; | 495 break; |
496 case(4): | 496 case(4): |
497 for(i=0;i<len;i++){ | 497 for(i=0;i<len;i++){ |
498 f = ldexp(in[i], 23); | 498 f = in[i]; |
499 //The mantissa is only 23 bit, that's all the precision there is. | 499 if (f <= -1.0) |
500 ((int32_t*)out)[i] = av_clip(lrintf(f), -1*(1<<23), (1<<23)-1) << 8; | 500 ((int32_t*)out)[i] = INT_MIN; |
501 else | |
502 if (f >= 1.0)//no need to use corrected constant, rounding won't cause overflow | |
503 ((int32_t*)out)[i] = INT_MAX; | |
504 else | |
505 ((int32_t*)out)[i] = lrintf(f*2147483648.0); | |
506 | |
501 } | 507 } |
502 break; | 508 break; |
503 } | 509 } |
504 } | 510 } |
505 | 511 |