📄 pa_converters.c
字号:
float dithered = ((float)*src * (2147483646.0f)) + dither; *dest = lrintf(dithered - 0.5f);#else double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; *dest = (PaInt32) dithered;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int32_Clip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt32 *dest = (PaInt32*)destinationBuffer; (void) ditherGenerator; /* unused parameter */ while( count-- ) { /* REVIEW */#ifdef PA_USE_C99_LRINTF float scaled = *src * 0x7FFFFFFF; PA_CLIP_( scaled, -2147483648.f, 2147483647.f ); *dest = lrintf(scaled-0.5f);#else double scaled = *src * 0x7FFFFFFF; PA_CLIP_( scaled, -2147483648., 2147483647. ); *dest = (PaInt32) scaled;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int32_DitherClip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt32 *dest = (PaInt32*)destinationBuffer; while( count-- ) { /* REVIEW */#ifdef PA_USE_C99_LRINTF float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ float dithered = ((float)*src * (2147483646.0f)) + dither; PA_CLIP_( dithered, -2147483648.f, 2147483647.f ); *dest = lrintf(dithered-0.5f);#else double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; PA_CLIP_( dithered, -2147483648., 2147483647. ); *dest = (PaInt32) dithered;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int24( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; PaInt32 temp; (void) ditherGenerator; /* unused parameter */ while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ double scaled = *src * 0x7FFFFFFF; temp = (PaInt32) scaled; #if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(temp >> 8); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 24);#elif defined(PA_BIG_ENDIAN) dest[0] = (unsigned char)(temp >> 24); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 8);#endif src += sourceStride; dest += destinationStride * 3; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int24_Dither( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; PaInt32 temp; while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; temp = (PaInt32) dithered;#if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(temp >> 8); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 24);#elif defined(PA_BIG_ENDIAN) dest[0] = (unsigned char)(temp >> 24); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 8);#endif src += sourceStride; dest += destinationStride * 3; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int24_Clip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; PaInt32 temp; (void) ditherGenerator; /* unused parameter */ while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ double scaled = *src * 0x7FFFFFFF; PA_CLIP_( scaled, -2147483648., 2147483647. ); temp = (PaInt32) scaled;#if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(temp >> 8); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 24);#elif defined(PA_BIG_ENDIAN) dest[0] = (unsigned char)(temp >> 24); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 8);#endif src += sourceStride; dest += destinationStride * 3; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int24_DitherClip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; PaInt32 temp; while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; PA_CLIP_( dithered, -2147483648., 2147483647. ); temp = (PaInt32) dithered;#if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(temp >> 8); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 24);#elif defined(PA_BIG_ENDIAN) dest[0] = (unsigned char)(temp >> 24); dest[1] = (unsigned char)(temp >> 16); dest[2] = (unsigned char)(temp >> 8);#endif src += sourceStride; dest += destinationStride * 3; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int16( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt16 *dest = (PaInt16*)destinationBuffer; (void)ditherGenerator; /* unused parameter */ while( count-- ) {#ifdef PA_USE_C99_LRINTF float tempf = (*src * (32767.0f)) ; *dest = lrintf(tempf-0.5f);#else short samp = (short) (*src * (32767.0f)); *dest = samp;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int16_Dither( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt16 *dest = (PaInt16*)destinationBuffer; while( count-- ) { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ float dithered = (*src * (32766.0f)) + dither;#ifdef PA_USE_C99_LRINTF *dest = lrintf(dithered-0.5f);#else *dest = (PaInt16) dithered;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int16_Clip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt16 *dest = (PaInt16*)destinationBuffer; (void)ditherGenerator; /* unused parameter */ while( count-- ) {#ifdef PA_USE_C99_LRINTF long samp = lrintf((*src * (32767.0f)) -0.5f);#else long samp = (PaInt32) (*src * (32767.0f));#endif PA_CLIP_( samp, -0x8000, 0x7FFF ); *dest = (PaInt16) samp; src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int16_DitherClip( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; PaInt16 *dest = (PaInt16*)destinationBuffer; (void)ditherGenerator; /* unused parameter */ while( count-- ) { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ float dithered = (*src * (32766.0f)) + dither; PaInt32 samp = (PaInt32) dithered; PA_CLIP_( samp, -0x8000, 0x7FFF );#ifdef PA_USE_C99_LRINTF *dest = lrintf(samp-0.5f);#else *dest = (PaInt16) samp;#endif src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int8( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; signed char *dest = (signed char*)destinationBuffer; (void)ditherGenerator; /* unused parameter */ while( count-- ) { signed char samp = (signed char) (*src * (127.0f)); *dest = samp; src += sourceStride; dest += destinationStride; }}/* -------------------------------------------------------------------------- */static void Float32_To_Int8_Dither( void *destinationBuffer, signed int destinationStride, void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ){ float *src = (float*)sourceBuffer; signed char *dest = (signed char*)destinationBuffer; (void)ditherGenerator; /* unused parameter */ while( count-- ) { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ float dithered = (*src * (126.0f)) + dither; PaInt32 samp = (PaInt32) dithered; *dest = (signed char) samp; src += sourceStride; dest += destinationStride; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -