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