cannam@140: /* cannam@140: * $Id$ cannam@140: * Portable Audio I/O Library sample conversion mechanism cannam@140: * cannam@140: * Based on the Open Source API proposed by Ross Bencina cannam@140: * Copyright (c) 1999-2002 Phil Burk, Ross Bencina cannam@140: * cannam@140: * Permission is hereby granted, free of charge, to any person obtaining cannam@140: * a copy of this software and associated documentation files cannam@140: * (the "Software"), to deal in the Software without restriction, cannam@140: * including without limitation the rights to use, copy, modify, merge, cannam@140: * publish, distribute, sublicense, and/or sell copies of the Software, cannam@140: * and to permit persons to whom the Software is furnished to do so, cannam@140: * subject to the following conditions: cannam@140: * cannam@140: * The above copyright notice and this permission notice shall be cannam@140: * included in all copies or substantial portions of the Software. cannam@140: * cannam@140: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, cannam@140: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF cannam@140: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. cannam@140: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR cannam@140: * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF cannam@140: * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION cannam@140: * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. cannam@140: */ cannam@140: cannam@140: /* cannam@140: * The text above constitutes the entire PortAudio license; however, cannam@140: * the PortAudio community also makes the following non-binding requests: cannam@140: * cannam@140: * Any person wishing to distribute modifications to the Software is cannam@140: * requested to send the modifications to the original developer so that cannam@140: * they can be incorporated into the canonical version. It is also cannam@140: * requested that these non-binding requests be included along with the cannam@140: * license above. cannam@140: */ cannam@140: cannam@140: /** @file cannam@140: @ingroup common_src cannam@140: cannam@140: @brief Conversion function implementations. cannam@140: cannam@140: If the C9x function lrintf() is available, define PA_USE_C99_LRINTF to use it cannam@140: cannam@140: @todo Consider whether functions which dither but don't clip should exist, cannam@140: V18 automatically enabled clipping whenever dithering was selected. Perhaps cannam@140: we should do the same. cannam@140: see: "require clipping for dithering sample conversion functions?" cannam@140: http://www.portaudio.com/trac/ticket/112 cannam@140: cannam@140: @todo implement the converters marked IMPLEMENT ME: Int32_To_Int24_Dither, cannam@140: Int32_To_UInt8_Dither, Int24_To_Int16_Dither, Int24_To_Int8_Dither, cannam@140: Int24_To_UInt8_Dither, Int16_To_Int8_Dither, Int16_To_UInt8_Dither cannam@140: see: "some conversion functions are not implemented in pa_converters.c" cannam@140: http://www.portaudio.com/trac/ticket/35 cannam@140: cannam@140: @todo review the converters marked REVIEW: Float32_To_Int32, cannam@140: Float32_To_Int32_Dither, Float32_To_Int32_Clip, Float32_To_Int32_DitherClip, cannam@140: Int32_To_Int16_Dither, Int32_To_Int8_Dither, Int16_To_Int32 cannam@140: */ cannam@140: cannam@140: cannam@140: #include "pa_converters.h" cannam@140: #include "pa_dither.h" cannam@140: #include "pa_endianness.h" cannam@140: #include "pa_types.h" cannam@140: cannam@140: cannam@140: PaSampleFormat PaUtil_SelectClosestAvailableFormat( cannam@140: PaSampleFormat availableFormats, PaSampleFormat format ) cannam@140: { cannam@140: PaSampleFormat result; cannam@140: cannam@140: format &= ~paNonInterleaved; cannam@140: availableFormats &= ~paNonInterleaved; cannam@140: cannam@140: if( (format & availableFormats) == 0 ) cannam@140: { cannam@140: /* NOTE: this code depends on the sample format constants being in cannam@140: descending order of quality - ie best quality is 0 cannam@140: FIXME: should write an assert which checks that all of the cannam@140: known constants conform to that requirement. cannam@140: */ cannam@140: cannam@140: if( format != 0x01 ) cannam@140: { cannam@140: /* scan for better formats */ cannam@140: result = format; cannam@140: do cannam@140: { cannam@140: result >>= 1; cannam@140: } cannam@140: while( (result & availableFormats) == 0 && result != 0 ); cannam@140: } cannam@140: else cannam@140: { cannam@140: result = 0; cannam@140: } cannam@140: cannam@140: if( result == 0 ){ cannam@140: /* scan for worse formats */ cannam@140: result = format; cannam@140: do cannam@140: { cannam@140: result <<= 1; cannam@140: } cannam@140: while( (result & availableFormats) == 0 && result != paCustomFormat ); cannam@140: cannam@140: if( (result & availableFormats) == 0 ) cannam@140: result = paSampleFormatNotSupported; cannam@140: } cannam@140: cannam@140: }else{ cannam@140: result = format; cannam@140: } cannam@140: cannam@140: return result; cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_SELECT_FORMAT_( format, float32, int32, int24, int16, int8, uint8 ) \ cannam@140: switch( format & ~paNonInterleaved ){ \ cannam@140: case paFloat32: \ cannam@140: float32 \ cannam@140: case paInt32: \ cannam@140: int32 \ cannam@140: case paInt24: \ cannam@140: int24 \ cannam@140: case paInt16: \ cannam@140: int16 \ cannam@140: case paInt8: \ cannam@140: int8 \ cannam@140: case paUInt8: \ cannam@140: uint8 \ cannam@140: default: return 0; \ cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_SELECT_CONVERTER_DITHER_CLIP_( flags, source, destination ) \ cannam@140: if( flags & paClipOff ){ /* no clip */ \ cannam@140: if( flags & paDitherOff ){ /* no dither */ \ cannam@140: return paConverters. source ## _To_ ## destination; \ cannam@140: }else{ /* dither */ \ cannam@140: return paConverters. source ## _To_ ## destination ## _Dither; \ cannam@140: } \ cannam@140: }else{ /* clip */ \ cannam@140: if( flags & paDitherOff ){ /* no dither */ \ cannam@140: return paConverters. source ## _To_ ## destination ## _Clip; \ cannam@140: }else{ /* dither */ \ cannam@140: return paConverters. source ## _To_ ## destination ## _DitherClip; \ cannam@140: } \ cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_SELECT_CONVERTER_DITHER_( flags, source, destination ) \ cannam@140: if( flags & paDitherOff ){ /* no dither */ \ cannam@140: return paConverters. source ## _To_ ## destination; \ cannam@140: }else{ /* dither */ \ cannam@140: return paConverters. source ## _To_ ## destination ## _Dither; \ cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_USE_CONVERTER_( source, destination )\ cannam@140: return paConverters. source ## _To_ ## destination; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_UNITY_CONVERSION_( wordlength )\ cannam@140: return paConverters. Copy_ ## wordlength ## _To_ ## wordlength; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilConverter* PaUtil_SelectConverter( PaSampleFormat sourceFormat, cannam@140: PaSampleFormat destinationFormat, PaStreamFlags flags ) cannam@140: { cannam@140: PA_SELECT_FORMAT_( sourceFormat, cannam@140: /* paFloat32: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_UNITY_CONVERSION_( 32 ), cannam@140: /* paInt32: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int32 ), cannam@140: /* paInt24: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int24 ), cannam@140: /* paInt16: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int16 ), cannam@140: /* paInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int8 ), cannam@140: /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, UInt8 ) cannam@140: ), cannam@140: /* paInt32: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_USE_CONVERTER_( Int32, Float32 ), cannam@140: /* paInt32: */ PA_UNITY_CONVERSION_( 32 ), cannam@140: /* paInt24: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int24 ), cannam@140: /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int16 ), cannam@140: /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int8 ), cannam@140: /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, UInt8 ) cannam@140: ), cannam@140: /* paInt24: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_USE_CONVERTER_( Int24, Float32 ), cannam@140: /* paInt32: */ PA_USE_CONVERTER_( Int24, Int32 ), cannam@140: /* paInt24: */ PA_UNITY_CONVERSION_( 24 ), cannam@140: /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int16 ), cannam@140: /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int8 ), cannam@140: /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, UInt8 ) cannam@140: ), cannam@140: /* paInt16: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_USE_CONVERTER_( Int16, Float32 ), cannam@140: /* paInt32: */ PA_USE_CONVERTER_( Int16, Int32 ), cannam@140: /* paInt24: */ PA_USE_CONVERTER_( Int16, Int24 ), cannam@140: /* paInt16: */ PA_UNITY_CONVERSION_( 16 ), cannam@140: /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, Int8 ), cannam@140: /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, UInt8 ) cannam@140: ), cannam@140: /* paInt8: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_USE_CONVERTER_( Int8, Float32 ), cannam@140: /* paInt32: */ PA_USE_CONVERTER_( Int8, Int32 ), cannam@140: /* paInt24: */ PA_USE_CONVERTER_( Int8, Int24 ), cannam@140: /* paInt16: */ PA_USE_CONVERTER_( Int8, Int16 ), cannam@140: /* paInt8: */ PA_UNITY_CONVERSION_( 8 ), cannam@140: /* paUInt8: */ PA_USE_CONVERTER_( Int8, UInt8 ) cannam@140: ), cannam@140: /* paUInt8: */ cannam@140: PA_SELECT_FORMAT_( destinationFormat, cannam@140: /* paFloat32: */ PA_USE_CONVERTER_( UInt8, Float32 ), cannam@140: /* paInt32: */ PA_USE_CONVERTER_( UInt8, Int32 ), cannam@140: /* paInt24: */ PA_USE_CONVERTER_( UInt8, Int24 ), cannam@140: /* paInt16: */ PA_USE_CONVERTER_( UInt8, Int16 ), cannam@140: /* paInt8: */ PA_USE_CONVERTER_( UInt8, Int8 ), cannam@140: /* paUInt8: */ PA_UNITY_CONVERSION_( 8 ) cannam@140: ) cannam@140: ) cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #ifdef PA_NO_STANDARD_CONVERTERS cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilConverterTable paConverters = { cannam@140: 0, /* PaUtilConverter *Float32_To_Int32; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int32_Dither; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int32_Clip; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int32_DitherClip; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Float32_To_Int24; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int24_Dither; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int24_Clip; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int24_DitherClip; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Float32_To_Int16; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int16_Dither; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int16_Clip; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int16_DitherClip; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Float32_To_Int8; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int8_Dither; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int8_Clip; */ cannam@140: 0, /* PaUtilConverter *Float32_To_Int8_DitherClip; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Float32_To_UInt8; */ cannam@140: 0, /* PaUtilConverter *Float32_To_UInt8_Dither; */ cannam@140: 0, /* PaUtilConverter *Float32_To_UInt8_Clip; */ cannam@140: 0, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Int32_To_Float32; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int24; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int24_Dither; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int16; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int16_Dither; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int8; */ cannam@140: 0, /* PaUtilConverter *Int32_To_Int8_Dither; */ cannam@140: 0, /* PaUtilConverter *Int32_To_UInt8; */ cannam@140: 0, /* PaUtilConverter *Int32_To_UInt8_Dither; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Int24_To_Float32; */ cannam@140: 0, /* PaUtilConverter *Int24_To_Int32; */ cannam@140: 0, /* PaUtilConverter *Int24_To_Int16; */ cannam@140: 0, /* PaUtilConverter *Int24_To_Int16_Dither; */ cannam@140: 0, /* PaUtilConverter *Int24_To_Int8; */ cannam@140: 0, /* PaUtilConverter *Int24_To_Int8_Dither; */ cannam@140: 0, /* PaUtilConverter *Int24_To_UInt8; */ cannam@140: 0, /* PaUtilConverter *Int24_To_UInt8_Dither; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Int16_To_Float32; */ cannam@140: 0, /* PaUtilConverter *Int16_To_Int32; */ cannam@140: 0, /* PaUtilConverter *Int16_To_Int24; */ cannam@140: 0, /* PaUtilConverter *Int16_To_Int8; */ cannam@140: 0, /* PaUtilConverter *Int16_To_Int8_Dither; */ cannam@140: 0, /* PaUtilConverter *Int16_To_UInt8; */ cannam@140: 0, /* PaUtilConverter *Int16_To_UInt8_Dither; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Int8_To_Float32; */ cannam@140: 0, /* PaUtilConverter *Int8_To_Int32; */ cannam@140: 0, /* PaUtilConverter *Int8_To_Int24 */ cannam@140: 0, /* PaUtilConverter *Int8_To_Int16; */ cannam@140: 0, /* PaUtilConverter *Int8_To_UInt8; */ cannam@140: cannam@140: 0, /* PaUtilConverter *UInt8_To_Float32; */ cannam@140: 0, /* PaUtilConverter *UInt8_To_Int32; */ cannam@140: 0, /* PaUtilConverter *UInt8_To_Int24; */ cannam@140: 0, /* PaUtilConverter *UInt8_To_Int16; */ cannam@140: 0, /* PaUtilConverter *UInt8_To_Int8; */ cannam@140: cannam@140: 0, /* PaUtilConverter *Copy_8_To_8; */ cannam@140: 0, /* PaUtilConverter *Copy_16_To_16; */ cannam@140: 0, /* PaUtilConverter *Copy_24_To_24; */ cannam@140: 0 /* PaUtilConverter *Copy_32_To_32; */ cannam@140: }; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #else /* PA_NO_STANDARD_CONVERTERS is not defined */ cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #define PA_CLIP_( val, min, max )\ cannam@140: { val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); } cannam@140: cannam@140: cannam@140: static const float const_1_div_128_ = 1.0f / 128.0f; /* 8 bit multiplier */ cannam@140: cannam@140: static const float const_1_div_32768_ = 1.0f / 32768.f; /* 16 bit multiplier */ cannam@140: cannam@140: static const double const_1_div_2147483648_ = 1.0 / 2147483648.0; /* 32 bit multiplier */ cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: float scaled = *src * 0x7FFFFFFF; cannam@140: *dest = lrintf(scaled-0.5f); cannam@140: #else cannam@140: double scaled = *src * 0x7FFFFFFF; cannam@140: *dest = (PaInt32) scaled; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int32_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = ((float)*src * (2147483646.0f)) + dither; cannam@140: *dest = lrintf(dithered - 0.5f); cannam@140: #else cannam@140: double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: double dithered = ((double)*src * (2147483646.0)) + dither; cannam@140: *dest = (PaInt32) dithered; cannam@140: #endif cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int32_Clip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: float scaled = *src * 0x7FFFFFFF; cannam@140: PA_CLIP_( scaled, -2147483648.f, 2147483647.f ); cannam@140: *dest = lrintf(scaled-0.5f); cannam@140: #else cannam@140: double scaled = *src * 0x7FFFFFFF; cannam@140: PA_CLIP_( scaled, -2147483648., 2147483647. ); cannam@140: *dest = (PaInt32) scaled; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int32_DitherClip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = ((float)*src * (2147483646.0f)) + dither; cannam@140: PA_CLIP_( dithered, -2147483648.f, 2147483647.f ); cannam@140: *dest = lrintf(dithered-0.5f); cannam@140: #else cannam@140: double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: double dithered = ((double)*src * (2147483646.0)) + dither; cannam@140: PA_CLIP_( dithered, -2147483648., 2147483647. ); cannam@140: *dest = (PaInt32) dithered; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* convert to 32 bit and drop the low 8 bits */ cannam@140: double scaled = (double)(*src) * 2147483647.0; cannam@140: temp = (PaInt32) scaled; cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 8); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 24); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 8); cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int24_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* convert to 32 bit and drop the low 8 bits */ cannam@140: cannam@140: double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: double dithered = ((double)*src * (2147483646.0)) + dither; cannam@140: cannam@140: temp = (PaInt32) dithered; cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 8); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 24); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 8); cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int24_Clip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* convert to 32 bit and drop the low 8 bits */ cannam@140: double scaled = *src * 0x7FFFFFFF; cannam@140: PA_CLIP_( scaled, -2147483648., 2147483647. ); cannam@140: temp = (PaInt32) scaled; cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 8); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 24); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 8); cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int24_DitherClip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* convert to 32 bit and drop the low 8 bits */ cannam@140: cannam@140: double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: double dithered = ((double)*src * (2147483646.0)) + dither; cannam@140: PA_CLIP_( dithered, -2147483648., 2147483647. ); cannam@140: cannam@140: temp = (PaInt32) dithered; cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 8); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 24); cannam@140: dest[1] = (unsigned char)(temp >> 16); cannam@140: dest[2] = (unsigned char)(temp >> 8); cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: float tempf = (*src * (32767.0f)) ; cannam@140: *dest = lrintf(tempf-0.5f); cannam@140: #else cannam@140: short samp = (short) (*src * (32767.0f)); cannam@140: *dest = samp; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int16_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (32766.0f)) + dither; cannam@140: cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: *dest = lrintf(dithered-0.5f); cannam@140: #else cannam@140: *dest = (PaInt16) dithered; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int16_Clip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: long samp = lrintf((*src * (32767.0f)) -0.5f); cannam@140: #else cannam@140: long samp = (PaInt32) (*src * (32767.0f)); cannam@140: #endif cannam@140: PA_CLIP_( samp, -0x8000, 0x7FFF ); cannam@140: *dest = (PaInt16) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int16_DitherClip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (32766.0f)) + dither; cannam@140: PaInt32 samp = (PaInt32) dithered; cannam@140: PA_CLIP_( samp, -0x8000, 0x7FFF ); cannam@140: #ifdef PA_USE_C99_LRINTF cannam@140: *dest = lrintf(samp-0.5f); cannam@140: #else cannam@140: *dest = (PaInt16) samp; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: signed char samp = (signed char) (*src * (127.0f)); cannam@140: *dest = samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (126.0f)) + dither; cannam@140: PaInt32 samp = (PaInt32) dithered; cannam@140: *dest = (signed char) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int8_Clip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: PaInt32 samp = (PaInt32)(*src * (127.0f)); cannam@140: PA_CLIP_( samp, -0x80, 0x7F ); cannam@140: *dest = (signed char) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_Int8_DitherClip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (126.0f)) + dither; cannam@140: PaInt32 samp = (PaInt32) dithered; cannam@140: PA_CLIP_( samp, -0x80, 0x7F ); cannam@140: *dest = (signed char) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_UInt8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: unsigned char samp = (unsigned char)(128 + ((unsigned char) (*src * (127.0f)))); cannam@140: *dest = samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_UInt8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (126.0f)) + dither; cannam@140: PaInt32 samp = (PaInt32) dithered; cannam@140: *dest = (unsigned char) (128 + samp); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_UInt8_Clip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: PaInt32 samp = 128 + (PaInt32)(*src * (127.0f)); cannam@140: PA_CLIP_( samp, 0x0000, 0x00FF ); cannam@140: *dest = (unsigned char) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Float32_To_UInt8_DitherClip( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: float *src = (float*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); cannam@140: /* use smaller scaler to prevent overflow when we add the dither */ cannam@140: float dithered = (*src * (126.0f)) + dither; cannam@140: PaInt32 samp = 128 + (PaInt32) dithered; cannam@140: PA_CLIP_( samp, 0x0000, 0x00FF ); cannam@140: *dest = (unsigned char) samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Float32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: float *dest = (float*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = (float) ((double)*src * const_1_div_2147483648_); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = (unsigned char)(*src >> 8); cannam@140: dest[1] = (unsigned char)(*src >> 16); cannam@140: dest[2] = (unsigned char)(*src >> 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(*src >> 24); cannam@140: dest[1] = (unsigned char)(*src >> 16); cannam@140: dest[2] = (unsigned char)(*src >> 8); cannam@140: #endif cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int24_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: (void) destinationBuffer; /* unused parameters */ cannam@140: (void) destinationStride; /* unused parameters */ cannam@140: (void) sourceBuffer; /* unused parameters */ cannam@140: (void) sourceStride; /* unused parameters */ cannam@140: (void) count; /* unused parameters */ cannam@140: (void) ditherGenerator; /* unused parameters */ cannam@140: /* IMPLEMENT ME */ cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = (PaInt16) ((*src) >> 16); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int16_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: PaInt32 dither; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); cannam@140: *dest = (PaInt16) ((((*src)>>1) + dither) >> 15); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = (signed char) ((*src) >> 24); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_Int8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: PaInt32 dither; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW */ cannam@140: dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); cannam@140: *dest = (signed char) ((((*src)>>1) + dither) >> 23); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_UInt8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (unsigned char)(((*src) >> 24) + 128); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int32_To_UInt8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt32 *src = (PaInt32*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* IMPLEMENT ME */ cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Float32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: float *dest = (float*)destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 8); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 24); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 8); cannam@140: #endif cannam@140: cannam@140: *dest = (float) ((double)temp * const_1_div_2147483648_); cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Int32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*) destinationBuffer; cannam@140: PaInt32 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 8); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 24); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 8); cannam@140: #endif cannam@140: cannam@140: *dest = temp; cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Int16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: cannam@140: PaInt16 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: /* src[0] is discarded */ cannam@140: temp = (((PaInt16)src[1])); cannam@140: temp = temp | (PaInt16)(((PaInt16)src[2]) << 8); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: /* src[2] is discarded */ cannam@140: temp = (PaInt16)(((PaInt16)src[0]) << 8); cannam@140: temp = temp | (((PaInt16)src[1])); cannam@140: #endif cannam@140: cannam@140: *dest = temp; cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Int16_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: cannam@140: PaInt32 temp, dither; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 8); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 24); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 8); cannam@140: #endif cannam@140: cannam@140: /* REVIEW */ cannam@140: dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); cannam@140: *dest = (PaInt16) (((temp >> 1) + dither) >> 15); cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Int8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: /* src[0] is discarded */ cannam@140: /* src[1] is discarded */ cannam@140: *dest = src[2]; cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: /* src[2] is discarded */ cannam@140: /* src[1] is discarded */ cannam@140: *dest = src[0]; cannam@140: #endif cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_Int8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: cannam@140: PaInt32 temp, dither; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 8); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 24); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: temp = (((PaInt32)src[0]) << 24); cannam@140: temp = temp | (((PaInt32)src[1]) << 16); cannam@140: temp = temp | (((PaInt32)src[2]) << 8); cannam@140: #endif cannam@140: cannam@140: /* REVIEW */ cannam@140: dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); cannam@140: *dest = (signed char) (((temp >> 1) + dither) >> 23); cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_UInt8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: /* src[0] is discarded */ cannam@140: /* src[1] is discarded */ cannam@140: *dest = (unsigned char)(src[2] + 128); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: *dest = (unsigned char)(src[0] + 128); cannam@140: /* src[1] is discarded */ cannam@140: /* src[2] is discarded */ cannam@140: #endif cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int24_To_UInt8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: (void) destinationBuffer; /* unused parameters */ cannam@140: (void) destinationStride; /* unused parameters */ cannam@140: (void) sourceBuffer; /* unused parameters */ cannam@140: (void) sourceStride; /* unused parameters */ cannam@140: (void) count; /* unused parameters */ cannam@140: (void) ditherGenerator; /* unused parameters */ cannam@140: /* IMPLEMENT ME */ cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_Float32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: float *dest = (float*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float samp = *src * const_1_div_32768_; /* FIXME: i'm concerned about this being asymetrical with float->int16 -rb */ cannam@140: *dest = samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_Int32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* REVIEW: we should consider something like cannam@140: (*src << 16) | (*src & 0xFFFF) cannam@140: */ cannam@140: cannam@140: *dest = *src << 16; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_Int24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*) sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: PaInt16 temp; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: temp = *src; cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = 0; cannam@140: dest[1] = (unsigned char)(temp); cannam@140: dest[2] = (unsigned char)(temp >> 8); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(temp >> 8); cannam@140: dest[1] = (unsigned char)(temp); cannam@140: dest[2] = 0; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_Int8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (signed char)((*src) >> 8); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_Int8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* IMPLEMENT ME */ cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_UInt8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (unsigned char)(((*src) >> 8) + 128); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int16_To_UInt8_Dither( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaInt16 *src = (PaInt16*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: /* IMPLEMENT ME */ cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int8_To_Float32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: signed char *src = (signed char*)sourceBuffer; cannam@140: float *dest = (float*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float samp = *src * const_1_div_128_; cannam@140: *dest = samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int8_To_Int32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: signed char *src = (signed char*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (*src) << 24; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int8_To_Int24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: signed char *src = (signed char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = 0; cannam@140: dest[1] = 0; cannam@140: dest[2] = (*src); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (*src); cannam@140: dest[1] = 0; cannam@140: dest[2] = 0; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int8_To_Int16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: signed char *src = (signed char*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (PaInt16)((*src) << 8); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Int8_To_UInt8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: signed char *src = (signed char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (unsigned char)(*src + 128); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void UInt8_To_Float32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: float *dest = (float*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: float samp = (*src - 128) * const_1_div_128_; cannam@140: *dest = samp; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void UInt8_To_Int32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: PaInt32 *dest = (PaInt32*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (*src - 128) << 24; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void UInt8_To_Int24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: (void) ditherGenerator; /* unused parameters */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: cannam@140: #if defined(PA_LITTLE_ENDIAN) cannam@140: dest[0] = 0; cannam@140: dest[1] = 0; cannam@140: dest[2] = (unsigned char)(*src - 128); cannam@140: #elif defined(PA_BIG_ENDIAN) cannam@140: dest[0] = (unsigned char)(*src - 128); cannam@140: dest[1] = 0; cannam@140: dest[2] = 0; cannam@140: #endif cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void UInt8_To_Int16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: PaInt16 *dest = (PaInt16*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (PaInt16)((*src - 128) << 8); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void UInt8_To_Int8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: signed char *dest = (signed char*)destinationBuffer; cannam@140: (void)ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: (*dest) = (signed char)(*src - 128); cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Copy_8_To_8( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = *src; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Copy_16_To_16( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaUint16 *src = (PaUint16 *)sourceBuffer; cannam@140: PaUint16 *dest = (PaUint16 *)destinationBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = *src; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Copy_24_To_24( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: unsigned char *src = (unsigned char*)sourceBuffer; cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: dest[0] = src[0]; cannam@140: dest[1] = src[1]; cannam@140: dest[2] = src[2]; cannam@140: cannam@140: src += sourceStride * 3; cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Copy_32_To_32( cannam@140: void *destinationBuffer, signed int destinationStride, cannam@140: void *sourceBuffer, signed int sourceStride, cannam@140: unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) cannam@140: { cannam@140: PaUint32 *dest = (PaUint32 *)destinationBuffer; cannam@140: PaUint32 *src = (PaUint32 *)sourceBuffer; cannam@140: cannam@140: (void) ditherGenerator; /* unused parameter */ cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = *src; cannam@140: cannam@140: src += sourceStride; cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilConverterTable paConverters = { cannam@140: Float32_To_Int32, /* PaUtilConverter *Float32_To_Int32; */ cannam@140: Float32_To_Int32_Dither, /* PaUtilConverter *Float32_To_Int32_Dither; */ cannam@140: Float32_To_Int32_Clip, /* PaUtilConverter *Float32_To_Int32_Clip; */ cannam@140: Float32_To_Int32_DitherClip, /* PaUtilConverter *Float32_To_Int32_DitherClip; */ cannam@140: cannam@140: Float32_To_Int24, /* PaUtilConverter *Float32_To_Int24; */ cannam@140: Float32_To_Int24_Dither, /* PaUtilConverter *Float32_To_Int24_Dither; */ cannam@140: Float32_To_Int24_Clip, /* PaUtilConverter *Float32_To_Int24_Clip; */ cannam@140: Float32_To_Int24_DitherClip, /* PaUtilConverter *Float32_To_Int24_DitherClip; */ cannam@140: cannam@140: Float32_To_Int16, /* PaUtilConverter *Float32_To_Int16; */ cannam@140: Float32_To_Int16_Dither, /* PaUtilConverter *Float32_To_Int16_Dither; */ cannam@140: Float32_To_Int16_Clip, /* PaUtilConverter *Float32_To_Int16_Clip; */ cannam@140: Float32_To_Int16_DitherClip, /* PaUtilConverter *Float32_To_Int16_DitherClip; */ cannam@140: cannam@140: Float32_To_Int8, /* PaUtilConverter *Float32_To_Int8; */ cannam@140: Float32_To_Int8_Dither, /* PaUtilConverter *Float32_To_Int8_Dither; */ cannam@140: Float32_To_Int8_Clip, /* PaUtilConverter *Float32_To_Int8_Clip; */ cannam@140: Float32_To_Int8_DitherClip, /* PaUtilConverter *Float32_To_Int8_DitherClip; */ cannam@140: cannam@140: Float32_To_UInt8, /* PaUtilConverter *Float32_To_UInt8; */ cannam@140: Float32_To_UInt8_Dither, /* PaUtilConverter *Float32_To_UInt8_Dither; */ cannam@140: Float32_To_UInt8_Clip, /* PaUtilConverter *Float32_To_UInt8_Clip; */ cannam@140: Float32_To_UInt8_DitherClip, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */ cannam@140: cannam@140: Int32_To_Float32, /* PaUtilConverter *Int32_To_Float32; */ cannam@140: Int32_To_Int24, /* PaUtilConverter *Int32_To_Int24; */ cannam@140: Int32_To_Int24_Dither, /* PaUtilConverter *Int32_To_Int24_Dither; */ cannam@140: Int32_To_Int16, /* PaUtilConverter *Int32_To_Int16; */ cannam@140: Int32_To_Int16_Dither, /* PaUtilConverter *Int32_To_Int16_Dither; */ cannam@140: Int32_To_Int8, /* PaUtilConverter *Int32_To_Int8; */ cannam@140: Int32_To_Int8_Dither, /* PaUtilConverter *Int32_To_Int8_Dither; */ cannam@140: Int32_To_UInt8, /* PaUtilConverter *Int32_To_UInt8; */ cannam@140: Int32_To_UInt8_Dither, /* PaUtilConverter *Int32_To_UInt8_Dither; */ cannam@140: cannam@140: Int24_To_Float32, /* PaUtilConverter *Int24_To_Float32; */ cannam@140: Int24_To_Int32, /* PaUtilConverter *Int24_To_Int32; */ cannam@140: Int24_To_Int16, /* PaUtilConverter *Int24_To_Int16; */ cannam@140: Int24_To_Int16_Dither, /* PaUtilConverter *Int24_To_Int16_Dither; */ cannam@140: Int24_To_Int8, /* PaUtilConverter *Int24_To_Int8; */ cannam@140: Int24_To_Int8_Dither, /* PaUtilConverter *Int24_To_Int8_Dither; */ cannam@140: Int24_To_UInt8, /* PaUtilConverter *Int24_To_UInt8; */ cannam@140: Int24_To_UInt8_Dither, /* PaUtilConverter *Int24_To_UInt8_Dither; */ cannam@140: cannam@140: Int16_To_Float32, /* PaUtilConverter *Int16_To_Float32; */ cannam@140: Int16_To_Int32, /* PaUtilConverter *Int16_To_Int32; */ cannam@140: Int16_To_Int24, /* PaUtilConverter *Int16_To_Int24; */ cannam@140: Int16_To_Int8, /* PaUtilConverter *Int16_To_Int8; */ cannam@140: Int16_To_Int8_Dither, /* PaUtilConverter *Int16_To_Int8_Dither; */ cannam@140: Int16_To_UInt8, /* PaUtilConverter *Int16_To_UInt8; */ cannam@140: Int16_To_UInt8_Dither, /* PaUtilConverter *Int16_To_UInt8_Dither; */ cannam@140: cannam@140: Int8_To_Float32, /* PaUtilConverter *Int8_To_Float32; */ cannam@140: Int8_To_Int32, /* PaUtilConverter *Int8_To_Int32; */ cannam@140: Int8_To_Int24, /* PaUtilConverter *Int8_To_Int24 */ cannam@140: Int8_To_Int16, /* PaUtilConverter *Int8_To_Int16; */ cannam@140: Int8_To_UInt8, /* PaUtilConverter *Int8_To_UInt8; */ cannam@140: cannam@140: UInt8_To_Float32, /* PaUtilConverter *UInt8_To_Float32; */ cannam@140: UInt8_To_Int32, /* PaUtilConverter *UInt8_To_Int32; */ cannam@140: UInt8_To_Int24, /* PaUtilConverter *UInt8_To_Int24; */ cannam@140: UInt8_To_Int16, /* PaUtilConverter *UInt8_To_Int16; */ cannam@140: UInt8_To_Int8, /* PaUtilConverter *UInt8_To_Int8; */ cannam@140: cannam@140: Copy_8_To_8, /* PaUtilConverter *Copy_8_To_8; */ cannam@140: Copy_16_To_16, /* PaUtilConverter *Copy_16_To_16; */ cannam@140: Copy_24_To_24, /* PaUtilConverter *Copy_24_To_24; */ cannam@140: Copy_32_To_32 /* PaUtilConverter *Copy_32_To_32; */ cannam@140: }; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #endif /* PA_NO_STANDARD_CONVERTERS */ cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilZeroer* PaUtil_SelectZeroer( PaSampleFormat destinationFormat ) cannam@140: { cannam@140: switch( destinationFormat & ~paNonInterleaved ){ cannam@140: case paFloat32: cannam@140: return paZeroers.Zero32; cannam@140: case paInt32: cannam@140: return paZeroers.Zero32; cannam@140: case paInt24: cannam@140: return paZeroers.Zero24; cannam@140: case paInt16: cannam@140: return paZeroers.Zero16; cannam@140: case paInt8: cannam@140: return paZeroers.Zero8; cannam@140: case paUInt8: cannam@140: return paZeroers.ZeroU8; cannam@140: default: return 0; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #ifdef PA_NO_STANDARD_ZEROERS cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilZeroerTable paZeroers = { cannam@140: 0, /* PaUtilZeroer *ZeroU8; */ cannam@140: 0, /* PaUtilZeroer *Zero8; */ cannam@140: 0, /* PaUtilZeroer *Zero16; */ cannam@140: 0, /* PaUtilZeroer *Zero24; */ cannam@140: 0, /* PaUtilZeroer *Zero32; */ cannam@140: }; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #else /* PA_NO_STANDARD_ZEROERS is not defined */ cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void ZeroU8( void *destinationBuffer, signed int destinationStride, cannam@140: unsigned int count ) cannam@140: { cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = 128; cannam@140: cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Zero8( void *destinationBuffer, signed int destinationStride, cannam@140: unsigned int count ) cannam@140: { cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = 0; cannam@140: cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Zero16( void *destinationBuffer, signed int destinationStride, cannam@140: unsigned int count ) cannam@140: { cannam@140: PaUint16 *dest = (PaUint16 *)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = 0; cannam@140: cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Zero24( void *destinationBuffer, signed int destinationStride, cannam@140: unsigned int count ) cannam@140: { cannam@140: unsigned char *dest = (unsigned char*)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: dest[0] = 0; cannam@140: dest[1] = 0; cannam@140: dest[2] = 0; cannam@140: cannam@140: dest += destinationStride * 3; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: static void Zero32( void *destinationBuffer, signed int destinationStride, cannam@140: unsigned int count ) cannam@140: { cannam@140: PaUint32 *dest = (PaUint32 *)destinationBuffer; cannam@140: cannam@140: while( count-- ) cannam@140: { cannam@140: *dest = 0; cannam@140: cannam@140: dest += destinationStride; cannam@140: } cannam@140: } cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: PaUtilZeroerTable paZeroers = { cannam@140: ZeroU8, /* PaUtilZeroer *ZeroU8; */ cannam@140: Zero8, /* PaUtilZeroer *Zero8; */ cannam@140: Zero16, /* PaUtilZeroer *Zero16; */ cannam@140: Zero24, /* PaUtilZeroer *Zero24; */ cannam@140: Zero32, /* PaUtilZeroer *Zero32; */ cannam@140: }; cannam@140: cannam@140: /* -------------------------------------------------------------------------- */ cannam@140: cannam@140: #endif /* PA_NO_STANDARD_ZEROERS */