Main Page   Namespace List   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

bitres_converter.cpp

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 } // namespace ac3
00255 //----------------------------------------------------------------------------

Generated on Sat Sep 25 14:06:34 2004 for ac3 by doxygen1.2.18