Commit 54394aba authored by BOHMRR's avatar BOHMRR Committed by torresjua
Browse files

added CLDFB codec implementation

parent dcc55520
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@
    </Midl>
    <ClCompile>
      <Optimization>Disabled</Optimization>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>ivas_cldfb_trans_codec;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ExceptionHandling />
      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -126,7 +126,7 @@
    </Midl>
    <ClCompile>
      <Optimization>Disabled</Optimization>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>ivas_cldfb_trans_codec;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ExceptionHandling>
      </ExceptionHandling>
@@ -169,7 +169,7 @@
      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
      <OmitFramePointers>false</OmitFramePointers>
      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>ivas_cldfb_trans_codec;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <StringPooling>true</StringPooling>
      <ExceptionHandling />
@@ -197,6 +197,15 @@
    </Lib>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\Bitstream.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\CQMFDecoder.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\CQMFEncoder.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\CQMFHuff.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\NoiseGen.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\PerceptualModel.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\RMSEnvDeltaHuff.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\RMSEnvGrouping.c" />
    <ClCompile Include="..\lib_rend\ivas_cldfb_trans_codec\Tables.c" />
    <ClCompile Include="..\lib_rend\ivas_sba_rendering.c" />
    <ClCompile Include="..\lib_rend\ivas_allrad_dec.c" />
    <ClCompile Include="..\lib_rend\ivas_binauralRenderer.c" />
+3 −3
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@
    </Midl>
    <ClCompile>
      <Optimization>Disabled</Optimization>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;..\lib_rend\ivas_cldfb_trans_codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ExceptionHandling />
      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -130,7 +130,7 @@
    </Midl>
    <ClCompile>
      <Optimization>Disabled</Optimization>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;..\lib_rend\ivas_cldfb_trans_codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ExceptionHandling>
      </ExceptionHandling>
@@ -180,7 +180,7 @@
      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
      <OmitFramePointers>false</OmitFramePointers>
      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_util;..\lib_rend;..\lib_rend\ivas_cldfb_trans_codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <StringPooling>true</StringPooling>
      <ExceptionHandling />
+7 −2
Original line number Diff line number Diff line
@@ -4680,7 +4680,10 @@ void ivas_split_renderer_close(
	SPLIT_REND_WRAPPER *hSplitBinRend);

ivas_error ivas_splitBinLCLDEncOpen(
    BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc );
    BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc,
    int32_t iSampleRate,
    int32_t iChannels,
    int32_t iDataRate );

void ivas_splitBinLCLDEncClose( 
	BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc );
@@ -4692,7 +4695,9 @@ void ivas_splitBinLCLDEncProcess(
    ivas_split_rend_bits_t *pBits );

ivas_error ivas_splitBinLCLDDecOpen(
    BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec );
    BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec,
    int32_t iSampleRate,
    int32_t iChannels );

void ivas_splitBinLCLDDecClose(
    BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec );
+20 −0
Original line number Diff line number Diff line
@@ -42,6 +42,10 @@
#include "ivas_stat_rend.h"
#include "common_api_types.h" // VE2AT: don't we want to avoid this include in the library? I admit that the rules hefre are not 100% clear to me but introducing it just for IVAS_QUATERNION is not necessry I think

#ifdef SPLIT_REND_WITH_HEAD_ROT
#include "ivas_cldfb_trans_codec/CQMFEncoder.h"
#include "ivas_cldfb_trans_codec/CQMFDecoder.h"
#endif

/*----------------------------------------------------------------------------------*
 * Output configuration for renderer (e.g. DirAC, MASA, Binaural Renderer...)
@@ -1344,11 +1348,27 @@ typedef struct ivas_binaural_head_rot_split_post_rendering_struct
typedef struct ivas_binaural_head_rot_split_rendering_lcld_enc_struct
{
    void *pLcld_enc;
	int32_t iChannels;
	CQMFEncoder *psCQMFEncoder;
	float ***pppfCQMFReal;
	float ***pppfCQMFImag;
#ifdef CLDFB_DEBUG
	FILE *cldfbIn;
	int numFrame;
#endif
} BIN_HR_SPLIT_LCLD_ENC, *BIN_HR_SPLIT_LCLD_ENC_HANDLE;

typedef struct ivas_binaural_head_rot_split_rendering_lcld_dec_struct
{
    void *pLcld_dec;
	int32_t iChannels;
	CQMFDecoder *psCQMFDecoder;
	float ***pppfDecCQMFReal;
	float ***pppfDecCQMFImag;
#ifdef CLDFB_DEBUG
	FILE *cldfbOut;
	int numFrame;
#endif
} BIN_HR_SPLIT_LCLD_DEC, *BIN_HR_SPLIT_LCLD_DEC_HANDLE;

typedef struct
+226 −0
Original line number Diff line number Diff line
#include "Bitstream.h"

#include <stdlib.h>
#include <memory.h>
#include "wmops.h"

#define MAX_BUFFER    1024

static const unsigned int MASKS[] =
{
    0x00000000,    0x00000001,    0x00000003,    0x00000007,    0x0000000f,    0x0000001f,    0x0000003f,    0x0000007f,
    0x000000ff,    0x000001ff,    0x000003ff,    0x000007ff,    0x00000fff,    0x00001fff,    0x00003fff,    0x00007fff,
    0x0000ffff,    0x0001ffff,    0x0003ffff,    0x0007ffff,    0x000fffff,    0x001fffff,    0x003fffff,    0x007fffff,
    0x00ffffff,    0x01ffffff,    0x03ffffff,    0x07ffffff,    0x0fffffff,    0x1fffffff,    0x3fffffff,    0x7fffffff,
};

Bitstream* CreateBitstream(const int  iDirection,
                           const int  iMaxBuffer)

{
    
    int n;
    Bitstream *psBitstream;
    
    psBitstream = (Bitstream*)malloc(sizeof(Bitstream));
    
    psBitstream->iDirection =iDirection;
    psBitstream->iMaxBuffer = iMaxBuffer;
    psBitstream->iIndex = 0;
    psBitstream->iBufferEnd = 0;
    psBitstream->iBufferStart = 0;
    psBitstream->iError = BS_ERROR_NONE;
    
    if(psBitstream->iMaxBuffer == -1){
        psBitstream->iMaxBuffer = MAX_BUFFER;
    }
    
    psBitstream->puchBuffer = (unsigned char*)malloc(sizeof(unsigned char) * psBitstream->iMaxBuffer);
    
    for(n = 0; n < psBitstream->iMaxBuffer; n ++){
        psBitstream->puchBuffer[n] = 0;
    }
    
    return psBitstream;
}

void DeleteBitstream(Bitstream *psBitstream)
{
    free(psBitstream->puchBuffer);
    free(psBitstream);
}

void BSFlushBuffer(Bitstream *psBitstream)
{
    memset(psBitstream->puchBuffer,0,psBitstream->iMaxBuffer);
    psBitstream->iIndex = 0;
    psBitstream->iBufferEnd = 0;
    psBitstream->iBufferStart = 0;
    psBitstream->iError = BS_ERROR_NONE;
}

int BSPutBytes(Bitstream           *psBitstream,
               const unsigned char *puchBytes,
               const int           iByteCount)
{
    int n;
    for(n = 0; n < iByteCount; n ++){
        psBitstream->puchBuffer[psBitstream->iBufferEnd] = puchBytes[n];
        psBitstream->iBufferEnd ++;
    }
    if(psBitstream->iDirection != BS_READ){
        psBitstream->iError = BS_ERROR_FAIL;
    }
    
    return psBitstream->iError;
}

int BSGetBytes(Bitstream     *psBitstream,
               unsigned char *puchBytes,
               int           iByteCount)
{
    int n;
    for(n = 0; n < iByteCount; n++){
        puchBytes[n] = psBitstream->puchBuffer[psBitstream->iBufferStart];
        psBitstream->puchBuffer[psBitstream->iBufferStart] = 0;
        psBitstream->iBufferStart ++;
    }
    if(psBitstream->iDirection != BS_WRITE){
        psBitstream->iError = BS_ERROR_FAIL;
    }
    
    return psBitstream->iError;
}

int BSByteAlign(Bitstream *psBitstream)
{
    if(psBitstream->iDirection == BS_WRITE){
        if(psBitstream->iIndex & 0x7){
            int iByte;
            int iRem;
            
            iByte = psBitstream->iIndex >> 3;
            iRem = 8 - (psBitstream->iIndex - (iByte<<3));
            psBitstream->puchBuffer[iByte] &= (0xff ^ MASKS[iRem]);
            psBitstream->iIndex += iRem;
        }
    }
    else{
        if(psBitstream->iIndex & 0x7){
            int iByte;
            int iRem;
            
            iByte = psBitstream->iIndex >> 3;
            iRem = 8 - (psBitstream->iIndex - (iByte<<3));
            psBitstream->iIndex += iRem;
        }
    }
    
    return psBitstream->iError;
}

int BSPutBits(Bitstream   *psBitstream,
              int         iValue,
              int         iBitCount)
{
    iValue &= MASKS[iBitCount];
    while(iBitCount){
        int iByte;
        int iRem;
        int iShift;
        
        iByte = psBitstream->iIndex >> 3;
        iRem = 8 - (psBitstream->iIndex - (iByte<<3)); //8 - psBitstream->iIndex & 0x7;
        
        iShift = iBitCount-iRem;
        if(iShift <= 0){
            iShift *= -1;
            psBitstream->puchBuffer[iByte] += (unsigned char) (iValue<<iShift);
            psBitstream->iIndex += iBitCount;
            iBitCount = 0;
        }
        else{
            psBitstream->puchBuffer[iByte] += (unsigned char) (iValue>>iShift);
            iValue &= MASKS[iShift];
            psBitstream->iIndex += iRem;
            iBitCount -= iRem;
        }
    }
    
    if(psBitstream->iDirection != BS_WRITE){
        psBitstream->iError = BS_ERROR_FAIL;
    }
    
    return psBitstream->iError;
}

int BSGetBits(Bitstream   *psBitstream,
              int         iBitCount)
{
    int iValue = 0;
    
    while(iBitCount){
        unsigned char   uchByte;
        int             iByte;
        int             iRem;
        int             iShift;
        
        iByte = psBitstream->iIndex >> 3;
        iRem = 8 - (psBitstream->iIndex - (iByte << 3)); //8 - psBitstream->iIndex & 0x7;
        uchByte = psBitstream->puchBuffer[iByte];
        iShift = iBitCount - iRem;
        
        if(iShift <= 0){
            iShift *= -1;
            iValue += (int)((uchByte >> iShift) & MASKS[iBitCount]);
            psBitstream->iIndex += iBitCount;
            iBitCount = 0;
        }
        else{
            uchByte &= MASKS[iRem];
            iValue += (((int)uchByte)<<iShift);
            psBitstream->iIndex += iRem;
            iBitCount -= iRem;
        }
    }
    
    if(psBitstream->iDirection != BS_READ){
        psBitstream->iError = BS_ERROR_FAIL;
    }
    
    return iValue;
}

int BSForceBack(Bitstream *psBitstream,
                int       iValue,
                int       iBitCount)
{
    psBitstream->iIndex -= iBitCount;
    return (iValue>>iBitCount);
}

int BSGetByteCount(Bitstream *psBitstream)
{
    int iBytes;
    iBytes = psBitstream->iIndex>>3;
    if((iBytes << 3) != psBitstream->iIndex){
        iBytes ++;
    }
    
    return iBytes;
}

unsigned char* BSGetBuffer(Bitstream *psBitstream)
{
    return psBitstream->puchBuffer;
}

int BSGetAvailableBytes(Bitstream *psBitstream)
{
    return psBitstream->iBufferEnd;
}

int BSGetError(Bitstream *psBitstream)
{
    return psBitstream->iError;
}
Loading