00001
00008
00009 #include "BitResConverter.h"
00010
00011 namespace ac3 {
00012
00033 void CBitResConverter::ConvertBitResolution(UINT32 nSampleCount,
00034 void* pSource,
00035 UINT16 nSourceResolution,
00036 void* pDest,
00037 UINT16 nDestResolution)
00038 {
00039 switch (nSourceResolution)
00040 {
00041 case 8:
00042 {
00043 UINT8* ps = (UINT8*)pSource;
00044 switch (nDestResolution)
00045 {
00046 case 8:
00047 {
00048 UINT8* pd = (UINT8*)pDest;
00049 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00050 *pd = *ps;
00051 }
00052 break;
00053 case 16:
00054 {
00055 INT16* pd = (INT16*)pDest;
00056 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00057 *pd = (INT16)((INT8)*ps + 0x80) * 0x100;
00058 }
00059 break;
00060 case 24:
00061 {
00062 INT32* pd = (INT32*)pDest;
00063 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00064 *pd = (INT32)((INT8)*ps - 0x80) * 0x10000;
00065 }
00066 break;
00067 case 32:
00068 {
00069 INT32* pd = (INT32*)pDest;
00070 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00071 *pd = (INT32)((INT8)*ps - 0x80) * 0x1000000;
00072 }
00073 break;
00074 }
00075 }
00076 break;
00077
00078
00079 case 16:
00080 {
00081 INT16* ps = (INT16*)pSource;
00082 switch (nDestResolution)
00083 {
00084 case 8:
00085 {
00086 UINT8* pd = (UINT8*)pDest;
00087 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00088 *pd = (UINT8)((*ps / 0x100) + 0x80);
00089 }
00090 break;
00091 case 16:
00092 {
00093 INT16* pd = (INT16*)pDest;
00094 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00095 *pd = *ps;
00096 }
00097 break;
00098 case 24:
00099 {
00100 INT32* pd = (INT32*)pDest;
00101 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00102 *pd = (INT32)*ps * 0x100;
00103 }
00104 break;
00105 case 32:
00106 {
00107 INT32* pd = (INT32*)pDest;
00108 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00109 *pd = (INT32)*ps * 0x10000;
00110 }
00111 break;
00112 }
00113 }
00114 break;
00115
00116
00117 case 24:
00118 {
00119 INT32* ps = (INT32*)pSource;
00120 switch (nDestResolution)
00121 {
00122 case 8:
00123 {
00124 UINT8* pd = (UINT8*)pDest;
00125 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00126 *pd = (UINT8)((*ps / 0x10000) + 0x80);
00127 }
00128 break;
00129 case 16:
00130 {
00131 INT16* pd = (INT16*)pDest;
00132 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00133 *pd = (INT16)(*ps / 0x100);
00134 }
00135 break;
00136 case 24:
00137 {
00138 INT32* pd = (INT32*)pDest;
00139 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00140 *pd = *ps;
00141 }
00142 break;
00143 case 32:
00144 {
00145 INT32* pd = (INT32*)pDest;
00146 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00147 *pd = *ps * 0x100;
00148 }
00149 break;
00150 }
00151 }
00152 break;
00153
00154
00155 case 32:
00156 {
00157 INT32* ps = (INT32*)pSource;
00158 switch (nDestResolution)
00159 {
00160 case 8:
00161 {
00162 UINT8* pd = (UINT8*)pDest;
00163 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00164 *pd = (UINT8)((*ps / 0x1000000) + 0x80);
00165 }
00166 break;
00167 case 16:
00168 {
00169 INT16* pd = (INT16*)pDest;
00170 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00171 *pd = (INT16)(*ps / 0x10000);
00172 }
00173 break;
00174 case 24:
00175 {
00176 INT32* pd = (INT32*)pDest;
00177 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00178 *pd = *ps / 0x100;
00179 }
00180 break;
00181 case 32:
00182 {
00183 INT32* pd = (INT32*)pDest;
00184 for (UINT32 i = 0; i < nSampleCount; ++i, ++ps, ++pd)
00185 *pd = *ps;
00186 }
00187 break;
00188 }
00189 }
00190 break;
00191 }
00192 }
00193
00194 UINT8 CBitResConverter::INT16ToUINT8(INT16 nValue)
00195 {
00196 return (UINT8)(((UINT16)nValue >> 8) + 0x80);
00197 }
00198
00199 UINT8 CBitResConverter::INT24ToUINT8(INT32 nValue)
00200 {
00201 return (UINT8)(((UINT16)nValue >> 16) + 0x80);
00202 }
00203
00204 UINT8 CBitResConverter::INT32ToUINT8(INT32 nValue)
00205 {
00206 return (UINT8)(((UINT16)nValue >> 24) + 0x80);
00207 }
00208
00209 INT16 CBitResConverter::UINT8ToINT16(UINT8 nValue)
00210 {
00211 return (INT16)(((UINT16)nValue + 0x80) << 8);
00212 }
00213
00214 INT16 CBitResConverter::INT24ToINT16(INT32 nValue)
00215 {
00216 return nValue / 0x100;
00217 }
00218
00219 INT16 CBitResConverter::INT32ToINT16(INT32 nValue)
00220 {
00221 return nValue / 0x10000;
00222 }
00223
00224 INT32 CBitResConverter::UINT8ToINT24(UINT8 nValue)
00225 {
00226 return (INT32)(((UINT32)nValue + 0x80) << 16);
00227 }
00228
00229 INT32 CBitResConverter::INT16ToINT24(INT16 nValue)
00230 {
00231 return (INT32)nValue * 0x100;
00232 }
00233
00234 INT32 CBitResConverter::INT32ToINT24(INT32 nValue)
00235 {
00236 return nValue / 0x100;
00237 }
00238
00239 INT32 CBitResConverter::UINT8ToINT32(UINT8 nValue)
00240 {
00241 return (INT32)(((UINT32)nValue + 0x80) << 24);
00242 }
00243
00244 INT32 CBitResConverter::INT16ToINT32(INT16 nValue)
00245 {
00246 return nValue * 0x10000;
00247 }
00248
00249 INT32 CBitResConverter::INT24ToINT32(INT32 nValue)
00250 {
00251 return nValue *0x100;
00252 }
00253
00254 }
00255