⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pa_converters.c

📁 一个开源的sip源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -