Commit 7a3ebeb6 authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Fixes to compact position PI packing and unpacking, add tests for compact position PI

parent eb2f69a6
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -76,8 +76,8 @@ enum MASK_BITS
#ifdef RTP_UPDATES_SA4_134
#define MAX_PI_COMPACT_POSITION_XY_METERS ( 10.24f )
#define MAX_PI_COMPACT_POSITION_Z_METERS  ( 5.12f )
#define FLOAT_FROM_Q11( q11Val )          ( (float) ( q11Val ) / 2048.0f )
#define FLOAT_FROM_Q10( q10Val )          ( (float) ( q10Val ) / 1024.0f )
#define FLOAT_FROM_Q9( q9Val )            ( (float) ( q9Val ) / 512.0f )
#define FLOAT_FROM_Q7( q7Val )            ( (float) ( q7Val ) / 128.0f )
#endif

+29 −29
Original line number Diff line number Diff line
@@ -81,28 +81,28 @@ static int16_t ivasPayload_convertToQ15( float value )

#ifdef RTP_UPDATES_SA4_134
/*-----------------------------------------------------------------------*
 * ivasPayload_convertToQ11()
 * ivasPayload_convertToQ10()
 *
 * Convert a float value into a Q11 encoded value.
 * Convert a float value into a Q10 encoded value.
 *-----------------------------------------------------------------------*/
static int16_t ivasPayload_convertToQ11( float value )
static int16_t ivasPayload_convertToQ10( float value )
{
    value = ( value * 2048.0f );
    value = value > +2048.0f ? +2048.0f : value;
    value = value < -2048.0f ? -2048.0f : value;
    value = ( value * 1024.0f );
    value = value > +1024.0f ? +1024.0f : value;
    value = value < -1024.0f ? -1024.0f : value;
    return (int16_t) ( value );
}

/*-----------------------------------------------------------------------*
 * ivasPayload_convertToQ10()
 * ivasPayload_convertToQ9()
 *
 * Convert a float value into a Q10 encoded value.
 * Convert a float value into a Q9 encoded value.
 *-----------------------------------------------------------------------*/
static int16_t ivasPayload_convertToQ10( float value )
static int16_t ivasPayload_convertToQ9( float value )
{
    value = ( value * 1024.0f );
    value = value > +1024.0f ? +1024.0f : value;
    value = value < -1024.0f ? -1024.0f : value;
    value = ( value * 512.0f );
    value = value > +512.0f ? +512.0f : value;
    value = value < -512.0f ? -512.0f : value;
    return (int16_t) ( value );
}

@@ -751,9 +751,9 @@ static ivas_error packPositionCompact( const IVAS_PIDATA_GENERIC *piData, uint8_

    buffer[nBytes++] = ( position->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */
    buffer[nBytes++] = 4;
    posX = (uint16_t) ivasPayload_convertToQ11( position->position.x / MAX_PI_COMPACT_POSITION_XY_METERS );
    posY = (uint16_t) ivasPayload_convertToQ11( position->position.y / MAX_PI_COMPACT_POSITION_XY_METERS );
    posZ = (uint16_t) ivasPayload_convertToQ10( position->position.z / MAX_PI_COMPACT_POSITION_Z_METERS );
    posX = (uint16_t) ivasPayload_convertToQ10( position->position.x / MAX_PI_COMPACT_POSITION_XY_METERS );
    posY = (uint16_t) ivasPayload_convertToQ10( position->position.y / MAX_PI_COMPACT_POSITION_XY_METERS );
    posZ = (uint16_t) ivasPayload_convertToQ9( position->position.z / MAX_PI_COMPACT_POSITION_Z_METERS );
    buffer[nBytes++] = (uint8_t) ( posX >> 8 );
    buffer[nBytes++] = (uint8_t) ( ( ( posX & MASK_3BIT ) << 5 ) | posY >> 6 );
    buffer[nBytes++] = (uint8_t) ( ( ( posY & MASK_6BIT ) << 2 ) | posZ >> 8 );
@@ -767,7 +767,7 @@ static ivas_error packPositionCompact( const IVAS_PIDATA_GENERIC *piData, uint8_
static ivas_error unpackPositionCompact( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData )
{
    IVAS_PIDATA_POSITION *position = (IVAS_PIDATA_POSITION *) piData;
    uint32_t compactRead = 0;
    int32_t compactRead = 0;

    /* Compact position data is 4 bytes */
    if ( numDataBytes != 4 )
@@ -777,10 +777,10 @@ static ivas_error unpackPositionCompact( const uint8_t *buffer, uint32_t numData

    position->size = sizeof( IVAS_PIDATA_POSITION );

    compactRead = ( (uint32_t) buffer[0] << 24 ) | ( (uint32_t) buffer[1] << 16 ) | ( (uint32_t) buffer[2] << 8 ) | ( (uint32_t) buffer[3] );
    position->position.x = FLOAT_FROM_Q11( compactRead >> 21 ) * MAX_PI_COMPACT_POSITION_XY_METERS;
    position->position.y = FLOAT_FROM_Q11( ( compactRead >> 10 ) & MASK_11BIT ) * MAX_PI_COMPACT_POSITION_XY_METERS;
    position->position.z = FLOAT_FROM_Q10( compactRead & MASK_10BIT ) * MAX_PI_COMPACT_POSITION_Z_METERS;
    compactRead = ( (int32_t) buffer[0] << 24 ) | ( (int32_t) buffer[1] << 16 ) | ( (int32_t) buffer[2] << 8 ) | ( (int32_t) buffer[3] );
    position->position.x = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS;
    position->position.y = FLOAT_FROM_Q10( ( (int16_t) ( compactRead >> 10 ) ) & MASK_11BIT ) * MAX_PI_COMPACT_POSITION_XY_METERS;
    position->position.z = FLOAT_FROM_Q9( (int16_t) ( compactRead & MASK_10BIT ) ) * MAX_PI_COMPACT_POSITION_Z_METERS;

    return IVAS_ERR_OK;
}
@@ -876,9 +876,9 @@ static ivas_error packISMPositionCompact( const IVAS_PIDATA_GENERIC *piData, uin
    buffer[nBytes++] = (uint8_t) ism_position->numObjects * 4;
    for ( n = 0; n < ism_position->numObjects; n++ )
    {
        posX = (uint16_t) ivasPayload_convertToQ11( ism_position->position[n].x / MAX_PI_COMPACT_POSITION_XY_METERS );
        posY = (uint16_t) ivasPayload_convertToQ11( ism_position->position[n].y / MAX_PI_COMPACT_POSITION_XY_METERS );
        posZ = (uint16_t) ivasPayload_convertToQ10( ism_position->position[n].z / MAX_PI_COMPACT_POSITION_Z_METERS );
        posX = (uint16_t) ivasPayload_convertToQ10( ism_position->position[n].x / MAX_PI_COMPACT_POSITION_XY_METERS );
        posY = (uint16_t) ivasPayload_convertToQ10( ism_position->position[n].y / MAX_PI_COMPACT_POSITION_XY_METERS );
        posZ = (uint16_t) ivasPayload_convertToQ9( ism_position->position[n].z / MAX_PI_COMPACT_POSITION_Z_METERS );
        buffer[nBytes++] = (uint8_t) ( posX >> 8 );
        buffer[nBytes++] = (uint8_t) ( ( ( posX & MASK_3BIT ) << 5 ) | posY >> 6 );
        buffer[nBytes++] = (uint8_t) ( ( ( posY & MASK_6BIT ) << 2 ) | posZ >> 8 );
@@ -891,7 +891,7 @@ static ivas_error packISMPositionCompact( const IVAS_PIDATA_GENERIC *piData, uin
static ivas_error unpackISMPositionCompact( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData )
{
    uint16_t n;
    uint32_t compactRead = 0;
    int32_t compactRead = 0;
    IVAS_PIDATA_ISM_POSITION *ism_position = (IVAS_PIDATA_ISM_POSITION *) piData;

    /* Compact position data is 4 bytes */
@@ -901,15 +901,15 @@ static ivas_error unpackISMPositionCompact( const uint8_t *buffer, uint32_t numD
    }

    ism_position->size = sizeof( IVAS_PIDATA_ISM_POSITION );
    ism_position->piDataType = IVAS_PI_ISM_POSITION;
    ism_position->piDataType = IVAS_PI_ISM_POSITION_COMPACT;
    ism_position->numObjects = (uint16_t) numDataBytes / 4;

    for ( n = 0; n < ism_position->numObjects; n++ )
    {
        compactRead = ( (uint32_t) buffer[0] << 24 ) | ( (uint32_t) buffer[1] << 16 ) | ( (uint32_t) buffer[2] << 8 ) | ( (uint32_t) buffer[3] );
        ism_position->position[n].x = FLOAT_FROM_Q11( compactRead >> 21 ) * MAX_PI_COMPACT_POSITION_XY_METERS;
        ism_position->position[n].y = FLOAT_FROM_Q11( ( compactRead >> 10 ) & MASK_11BIT ) * MAX_PI_COMPACT_POSITION_XY_METERS;
        ism_position->position[n].z = FLOAT_FROM_Q10( compactRead & MASK_10BIT ) * MAX_PI_COMPACT_POSITION_Z_METERS;
        compactRead = ( (int32_t) buffer[0] << 24 ) | ( (int32_t) buffer[1] << 16 ) | ( (int32_t) buffer[2] << 8 ) | ( (int32_t) buffer[3] );
        ism_position->position[n].x = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS;
        ism_position->position[n].y = FLOAT_FROM_Q10( ( (int16_t) ( compactRead >> 10 ) ) & MASK_11BIT ) * MAX_PI_COMPACT_POSITION_XY_METERS;
        ism_position->position[n].z = FLOAT_FROM_Q9( (int16_t) ( compactRead & MASK_10BIT ) ) * MAX_PI_COMPACT_POSITION_Z_METERS;
    }
    return IVAS_ERR_OK;
}
+4 −4
Original line number Diff line number Diff line
@@ -730,8 +730,8 @@ cmrLookup = [
]

q15 = lambda x: int(min(32767.0, max(-32768.0, x * 32768.0)))
q11 = lambda x: int(min(2047.0, max(-2048.0, x * 2048.0)))
q10 = lambda x: int(min(1023.0, max(-1024.0, x * 1024.0)))
q9 = lambda x: int(min(511.0, max(-512.0, x * 512.0)))
q7 = lambda x: int(min(127.0, max(-128.0, x * 128.0)))


@@ -822,9 +822,9 @@ def packPositionsCompact(bitstrm: BitStream, data: any):
        assert (
                type(position) == POSITION
        ), "Compact position PI Data expects a data of type list[POSITIONS]"
        bitstrm.append(f"intbe:11={q11(position.x / 20.48)}")
        bitstrm.append(f"intbe:11={q11(position.y / 20.48)}")
        bitstrm.append(f"intbe:10={q10(position.z / 10.24)}")
        bitstrm.append(f"int:11={q10(position.x / 10.24)}")
        bitstrm.append(f"int:11={q10(position.y / 10.24)}")
        bitstrm.append(f"int:10={q9(position.z / 5.12)}")


def unpackOrientation(bitstrm: ConstBitStream, piSize: int) -> ORIENTATION:
+8 −0
Original line number Diff line number Diff line
@@ -193,6 +193,11 @@ def generatePiData(startTs: int, endTs: int) -> dict:
        y=random.randint(-32788, 32767) / 100.0,
        z=random.randint(-32788, 32767) / 100.0,
    )
    somePositionCompact = lambda: POSITION(
        x=random.randint(-1024, 1023) / 100.0,
        y=random.randint(-1024, 1023) / 100.0,
        z=random.randint(-512, 511) / 100.0,
    )
    someDesc = lambda: AUDIO_DESCRIPTION(
        isSpeech=bool(random.getrandbits(1)),
        isMusic=bool(random.getrandbits(1)),
@@ -275,6 +280,7 @@ def generatePiData(startTs: int, endTs: int) -> dict:
    someISMGains = lambda num_ism : ISM_GAIN(gains=[random.choice([int(random.randint(-24,12)), -128]) for _ in range(num_ism)]) # -128 corresponds to -Inf
    someISMOrientations = lambda num_ism : [ORIENTATION(w=2*random.random()-1.0, x=2*random.random()-1.0, y=2*random.random()-1.0, z=2*random.random()-1.0) for _ in range(num_ism)]
    someISMPositions = lambda num_ism : [POSITION( x=random.randint(-32788, 32767)/100.0, y=random.randint(-32788, 32767)/100.0, z=random.randint(-32788, 32767)/100.0) for _ in range(num_ism)]
    someISMPositionsCompact = lambda num_ism : [POSITION( x=random.randint(-1024, 1023)/100.0, y=random.randint(-1024, 1023)/100.0, z=random.randint(-512, 511)/100.0) for _ in range(num_ism)]
    someISMDistanceAttenuations = lambda num_ism : [DISTANCE_ATTENUATION(ref_dist=random.randint(1,64)/10.0, max_dist=random.randint(1,64), roll_off=random.randint(0,40)/10.0) for _ in range(num_ism)]
    someISMDirectivities = lambda num_ism : [DIRECTIVITY(inner_ang=random.randint(0,24)*15, outer_ang=random.randint(0,24)*15, outer_att=random.choice([random.randint(-30,0)*3, -128])) for _ in range(num_ism)] # -128 corresponds to -Inf

@@ -301,6 +307,7 @@ def generatePiData(startTs: int, endTs: int) -> dict:
        pidata["ISM_GAIN"] = someISMGains(pidata["ISM_NUM"].num)
        pidata["ISM_ORIENTATION"] = someISMOrientations(pidata["ISM_NUM"].num)
        pidata["ISM_POSITION"] = someISMPositions(pidata["ISM_NUM"].num)
        pidata["ISM_POSITION_COMPACT"] = someISMPositionsCompact(pidata["ISM_NUM"].num)
        pidata["ISM_DISTANCE_ATTENUATION"] = someISMDistanceAttenuations(pidata["ISM_NUM"].num)
        pidata["ISM_DIRECTIVITY"] = someISMDirectivities(pidata["ISM_NUM"].num)

@@ -308,6 +315,7 @@ def generatePiData(startTs: int, endTs: int) -> dict:
        pidata["R_ISM_GAIN"] = someReverseISMGain()
        pidata["R_ISM_ORIENTATION"] = someOrientation()
        pidata["R_ISM_POSITION"] = somePosition()
        pidata["R_ISM_POSITION_COMPACT"] = somePositionCompact()
        pidata["R_ISM_DIRECTION"] = someReverseISMDirection()
        data[str(ts)] = pidata
    return data