Loading apps/decoder.c +32 −4 Original line number Diff line number Diff line Loading @@ -216,8 +216,8 @@ static const char *PiDataNames[IVAS_PI_MAX_ID] = { "SCENE_ORIENTATION", "DEVICE_ORIENTATION_COMPENSATED", "DEVICE_ORIENTATION_UNCOMPENSATED", "ACOUSTIC_ENVIRONMENT", "AUDIO_DESCRIPTION", "ISM_NUM", "ISM_ID", "ISM_GAIN", "ISM_ORIENTATION", "ISM_POSITION", "ISM_DISTANCE_ATTENUATION", "ISM_DIRECTIVITY", "DIEGETIC_TYPE", "RESERVED13", "RESERVED14", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION", "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_DIRECTION", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN", "AUDIO_FOCUS_INDICATION", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION", "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_REQUEST", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN", "R_ISM_ORIENTATION", "R_ISM_POSITION", "R_ISM_DIRECTION", "RESERVED27", "RESERVED28", "RESERVED29", "RESERVED30", "NO_DATA" }; Loading Loading @@ -261,7 +261,6 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n #ifdef RTP_S4_251135_CR26253_0016_REV1 case IVAS_PI_PLAYBACK_DEVICE_ORIENTATION: case IVAS_PI_HEAD_ORIENTATION: case IVAS_PI_AUDIO_FOCUS_DIRECTION: case IVAS_PI_R_ISM_ORIENTATION: #endif { Loading Loading @@ -327,6 +326,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n fprintf( f_piDataOut, "\t\t\t]\n\t\t}" ); } break; case IVAS_PI_AUDIO_FOCUS_INDICATION: { fprintf( f_piDataOut, "{\n" ); if ( cur->data.focusIndication.availDirection ) { fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t", cur->data.focusIndication.direction.w, cur->data.focusIndication.direction.x, cur->data.focusIndication.direction.y, cur->data.focusIndication.direction.z ); } if ( cur->data.focusIndication.availLevel ) { fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusIndication.flvl ); } fprintf( f_piDataOut, "\n\t\t}" ); } break; case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION: { IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppression; Loading @@ -339,7 +353,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n } break; case IVAS_PI_RESERVED13: case IVAS_PI_RESERVED14: case IVAS_PI_AUDIO_FOCUS_REQUEST: { fprintf( f_piDataOut, "{\n" ); if ( cur->data.focusRequest.availDirection ) { fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t", cur->data.focusRequest.direction.w, cur->data.focusRequest.direction.x, cur->data.focusRequest.direction.y, cur->data.focusRequest.direction.z ); } if ( cur->data.focusRequest.availLevel ) { fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusRequest.flvl ); } fprintf( f_piDataOut, "\n\t\t}" ); } break; case IVAS_PI_RESERVED15: case IVAS_PI_RESERVED27: case IVAS_PI_RESERVED28: Loading lib_util/ivas_rtp_pi_data.c +96 −7 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ static ivas_error packOrientation( const IVAS_PIDATA_GENERIC *piData, uint8_t *b if ( ( piData->piDataType != IVAS_PI_SCENE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_COMPENSATED ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED ) #ifdef RTP_S4_251135_CR26253_0016_REV1 && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) && ( piData->piDataType != IVAS_PI_AUDIO_FOCUS_DIRECTION ) && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) #endif /* RTP_S4_251135_CR26253_0016_REV1 */ ) { Loading Loading @@ -544,6 +544,95 @@ static ivas_error unpackDiegetic( const uint8_t *buffer, uint32_t numDataBytes, return IVAS_ERR_OK; } static ivas_error packAudioFocusCommon( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) { uint32_t nBytes = 0; uint8_t packedSize = 1; const IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (const IVAS_PIDATA_AUDIO_FOCUS *) piData; *nBytesWritten = 0; if ( piData->size != sizeof( IVAS_PIDATA_AUDIO_FOCUS ) ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in PI data of type Audio Focus" ); } if ( audioFocus->availDirection && audioFocus->availLevel ) { packedSize = 9; } else if ( audioFocus->availDirection ) { packedSize = 8; } else if ( audioFocus->availLevel ) { packedSize = 1; } else { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Neither direction or level is available for packing Audio Focus" ); } /* Audio Focus data is packedSize bytes, header is 2 bytes */ if ( maxDataBytes < (uint32_t) packedSize + 2 ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Insufficient space to pack Audio Focus PI data" ); } buffer[nBytes++] = ( audioFocus->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ buffer[nBytes++] = packedSize; if ( packedSize == 9 || packedSize == 8 ) { nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.w ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.x ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.y ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.z ) ); } if ( packedSize == 9 || packedSize == 1) { buffer[nBytes++] = ( (uint8_t) audioFocus->flvl & MASK_4BIT ) << 4; } *nBytesWritten = nBytes; return IVAS_ERR_OK; } static ivas_error unpackAudioFocusCommon( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) { IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (IVAS_PIDATA_AUDIO_FOCUS *) piData; /* Audio Focus data is either 1, 8 or 9 bytes */ if ( numDataBytes != 1 && numDataBytes != 8 && numDataBytes != 9 ) { return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI data of type Audio Focus" ); } piData->size = sizeof( IVAS_PIDATA_AUDIO_FOCUS ); audioFocus->availDirection = ( numDataBytes >= 8 ); audioFocus->availLevel = ( numDataBytes == 1 || numDataBytes == 9 ); if ( numDataBytes == 1 ) { audioFocus->flvl = ( buffer[0] >> 4 ); } else { audioFocus->direction.w = FLOAT_FROM_Q15( readInt16( &buffer[0] ) ); audioFocus->direction.x = FLOAT_FROM_Q15( readInt16( &buffer[2] ) ); audioFocus->direction.y = FLOAT_FROM_Q15( readInt16( &buffer[4] ) ); audioFocus->direction.z = FLOAT_FROM_Q15( readInt16( &buffer[6] ) ); if ( numDataBytes == 9 ) { audioFocus->flvl = ( buffer[8] >> 4 ); } } return IVAS_ERR_OK; } #endif /* RTP_S4_251135_CR26253_0016_REV1 */ Loading @@ -570,14 +659,14 @@ static const PACK_PI_FN packPiDataFuntions[IVAS_PI_MAX_ID] = { packUnsupportedData, /* DIEGETIC_TYPE */ #endif packUnsupportedData, /* RESERVED13 */ packUnsupportedData, /* RESERVED14 */ packAudioFocusCommon,/* AUDIO_FOCUS_INDICATION */ packUnsupportedData, /* RESERVED15 */ #ifdef RTP_S4_251135_CR26253_0016_REV1 packOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ packOrientation, /* HEAD_ORIENTATION */ packListenerPosition, /* LISTENER_POSITION */ packDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION */ packOrientation, /* AUDIO_FOCUS_DIRECTION */ packAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ #else packUnsupportedData, /* PLAYBACK_DEVICE_ORIENTATION */ packUnsupportedData, /* HEAD_ORIENTATION */ Loading Loading @@ -625,14 +714,14 @@ static const UNPACK_PI_FN unpackPiDataFuntions[IVAS_PI_MAX_ID] = { unpackUnsupportedData, /* DIEGETIC_TYPE */ #endif unpackUnsupportedData, /* RESERVED13 */ unpackUnsupportedData, /* RESERVED14 */ unpackAudioFocusCommon,/* AUDIO_FOCUS_INDICATION */ unpackUnsupportedData, /* RESERVED15 */ #ifdef RTP_S4_251135_CR26253_0016_REV1 unpackOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ unpackOrientation, /* HEAD_ORIENTATION */ unpackListenerPosition, /* LISTENER_POSITION */ unpackDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION */ unpackOrientation, /* AUDIO_FOCUS_DIRECTION */ unpackAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ #else unpackUnsupportedData, /* PLAYBACK_DEVICE_ORIENTATION */ unpackUnsupportedData, /* HEAD_ORIENTATION */ Loading Loading @@ -672,13 +761,13 @@ static const uint32_t maxPiDataSize[IVAS_PI_MAX_ID] = { 8, /* IVAS_PI_ISM_DIRECTIVITY */ 1, /* IVAS_PI_DIEGETIC_TYPE */ 0, /* IVAS_PI_RESERVED13 */ 0, /* IVAS_PI_RESERVED14 */ 9, /* IVAS_PI_AUDIO_FOCUS_INDICATION */ 0, /* IVAS_PI_RESERVED15 */ 8, /* IVAS_PI_PLAYBACK_DEVICE_ORIENTATION */ 8, /* IVAS_PI_HEAD_ORIENTATION */ 6, /* IVAS_PI_LISTENER_POSITION */ 2, /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION */ 8, /* IVAS_PI_AUDIO_FOCUS_DIRECTION */ 9, /* IVAS_PI_AUDIO_FOCUS_REQUEST */ 4, /* IVAS_PI_PI_LATENCY */ 1, /* IVAS_PI_R_ISM_ID */ 1, /* IVAS_PI_R_ISM_GAIN */ Loading lib_util/ivas_rtp_pi_data.h +38 −4 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ extern "C" IVAS_PI_ISM_DIRECTIVITY, /* directivity of each object */ IVAS_PI_DIEGETIC_TYPE, /* digetic audio indication */ IVAS_PI_RESERVED13, /* reserved */ IVAS_PI_RESERVED14, /* reserved */ IVAS_PI_AUDIO_FOCUS_INDICATION, /* audio focus indication (direction in Quaternions and/or level) */ IVAS_PI_RESERVED15, /* reserved */ /* Reverse direction PI types */ Loading @@ -72,7 +72,7 @@ extern "C" IVAS_PI_HEAD_ORIENTATION, /* head orientation of the listener in Quaternions */ IVAS_PI_LISTENER_POSITION, /* position of the listener in 3D space */ IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION, /* receiver’s preference with respect to audio suppression */ IVAS_PI_AUDIO_FOCUS_DIRECTION, /* direction of interest for the listener in Quaternions */ IVAS_PI_AUDIO_FOCUS_REQUEST, /* direction of interest for the listener in Quaternions and/or audio focus level */ IVAS_PI_PI_LATENCY, /* round-trip latency for PI frames */ IVAS_PI_R_ISM_ID, /* id of an object for editing */ IVAS_PI_R_ISM_GAIN, /* editing request for gain factor for received object */ Loading Loading @@ -100,7 +100,6 @@ extern "C" * - IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED * - IVAS_PI_PLAYBACK_DEVICE_ORIENTATION * - IVAS_PI_HEAD_ORIENTATION * - IVAS_PI_AUDIO_FOCUS_DIRECTION * - IVAS_PI_R_ISM_ORIENTATION * * piDataType is used to identify the correct pi data type contained here Loading Loading @@ -293,6 +292,40 @@ extern "C" bool isDiegetic[1 + IVAS_PI_MAX_OBJECTS]; /* diegetic indication as per audio format */ } IVAS_PIDATA_DIEGETIC; /* Audio focus direction indicates a direction of interest. * The audio focus level indicates the amount of suppression applied to the * directions other than the audio focus direction. */ typedef enum { IVAS_FLVL_NO_AUDIO_FOCUS = 0, /* Apply no audio focus */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_1, /* Audio focus level 1 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_2, /* Audio focus level 2 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_3, /* Audio focus level 3 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_4, /* Audio focus level 4 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_5, /* Audio focus level 5 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_6, /* Audio focus level 6 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_7, /* Audio focus level 7 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_8, /* Audio focus level 8 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_9, /* Audio focus level 9 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_10, /* Audio focus level 10 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_11, /* Audio focus level 11 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_12, /* Audio focus level 12 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_13, /* Audio focus level 13 */ IVAS_FLVL_DEFAULT_AUDIO_FOCUS, /* Default audio focus */ IVAS_FLVL_MAX_AUDIO_FOCUS, /* Apply max audio focus */ } IVAS_FLVL; typedef struct { size_t size; /* sizeof(IVAS_PIDATA_AUDIO_FOCUS) */ uint32_t piDataType; /* IVAS_PI_AUDIO_FOCUS_INDCATION or IVAS_PI_AUDIO_FOCUS_REQUEST */ bool availDirection; /* audio focus contains direction */ bool availLevel; /* audio focus contains level */ IVAS_QUATERNION direction; /* direction data expressed as quarternions */ IVAS_FLVL flvl; /* audio focus level */ } IVAS_PIDATA_AUDIO_FOCUS; /* Listener position */ typedef struct { Loading Loading @@ -416,12 +449,13 @@ extern "C" IVAS_PIDATA_ISM_ATTENUATION ismAttenuation; IVAS_PIDATA_ISM_DIRECTIVITY ismDirectivity; IVAS_PIDATA_DIEGETIC digeticIndicator; IVAS_PIDATA_AUDIO_FOCUS focusIndication; IVAS_PIDATA_ORIENTATION playbackOrientation; IVAS_PIDATA_ORIENTATION headOrientation; IVAS_PIDATA_LISTENER_POSITION listnerPosition; IVAS_PIDATA_DYNAMIC_SUPPRESSION dynSuppression; IVAS_PIDATA_ORIENTATION focusDirection; IVAS_PIDATA_AUDIO_FOCUS focusRequest; IVAS_PIDATA_REVERSE_PI_LATENCY piLatency; IVAS_PIDATA_ISM_EDIT_ID ismEditId; IVAS_PIDATA_ISM_EDIT_GAIN ismEditGain; Loading tests/rtp/ivasrtp.py +30 −4 Original line number Diff line number Diff line Loading @@ -170,13 +170,13 @@ class PIDATAS(str, Enum): ISM_DIRECTIVITY = "ISM_DIRECTIVITY" DIEGETIC_TYPE = "DIEGETIC_TYPE" RESERVED13 = "RESERVED13" RESERVED14 = "RESERVED14" AUDIO_FOCUS_INDICATION = "AUDIO_FOCUS_INDICATION" RESERVED15 = "RESERVED15" PLAYBACK_DEVICE_ORIENTATION = "PLAYBACK_DEVICE_ORIENTATION" HEAD_ORIENTATION = "HEAD_ORIENTATION" LISTENER_POSITION = "LISTENER_POSITION" DYNAMIC_AUDIO_SUPPRESSION = "DYNAMIC_AUDIO_SUPPRESSION" AUDIO_FOCUS_DIRECTION = "AUDIO_FOCUS_DIRECTION" AUDIO_FOCUS_REQUEST = "AUDIO_FOCUS_REQUEST" PI_LATENCY = "PI_LATENCY" R_ISM_ID = "R_ISM_ID" R_ISM_GAIN = "R_ISM_GAIN" Loading Loading @@ -207,6 +207,24 @@ class SUPPRESSION_LEVEL(int, Enum): SUPPRESSION_LEVEL_14 = 14 SUPPRESSION_LEVEL_MAX = 15 class AUDIO_FOCUS_LEVEL(int, Enum): AUDIO_FOCUS_LEVEL_NONE = 0 AUDIO_FOCUS_LEVEL_1 = 1 AUDIO_FOCUS_LEVEL_2 = 2 AUDIO_FOCUS_LEVEL_3 = 3 AUDIO_FOCUS_LEVEL_4 = 4 AUDIO_FOCUS_LEVEL_5 = 5 AUDIO_FOCUS_LEVEL_6 = 6 AUDIO_FOCUS_LEVEL_7 = 7 AUDIO_FOCUS_LEVEL_8 = 8 AUDIO_FOCUS_LEVEL_9 = 9 AUDIO_FOCUS_LEVEL_10 = 10 AUDIO_FOCUS_LEVEL_11 = 11 AUDIO_FOCUS_LEVEL_12 = 12 AUDIO_FOCUS_LEVEL_13 = 13 AUDIO_FOCUS_LEVEL_DEFAULT = 14 AUDIO_FOCUS_LEVEL_NO_PREFERENCE = 15 @dataclass class RTPHDR: Loading Loading @@ -343,6 +361,14 @@ class ACOUSTIC_ENVIRONMENT: dim: tuple[float, float, float] = () abscoeff: tuple[float, float, float, float, float, float] = () @dataclass class AUDIO_FOCUS: w: float = 0.0 x: float = 0.0 y: float = 0.0 z: float = 0.0 level: AUDIO_FOCUS_LEVEL = AUDIO_FOCUS_LEVEL.AUDIO_FOCUS_LEVEL_DEFAULT @dataclass class PIDATA: timestamp: int = 0 Loading Loading @@ -589,13 +615,13 @@ PIDataUnpacker = [ unpackUnsupported, # ISM_DIRECTIVITY unpackDiegetic, # DIEGETIC_TYPE unpackUnsupported, # RESERVED13 unpackUnsupported, # RESERVED14 unpackAudioFocusCommon, # AUDIO_FOCUS_INDICATION unpackUnsupported, # RESERVED15 unpackOrientation, # PLAYBACK_DEVICE_ORIENTATION unpackOrientation, # HEAD_ORIENTATION unpackPosition, # LISTENER_POSITION unpackDAS, # DYNAMIC_AUDIO_SUPPRESSION unpackOrientation, # AUDIO_FOCUS_DIRECTION unpackAudioFocusCommon, # AUDIO_FOCUS_REQUEST unpackUnsupported, # PI_LATENCY unpackUnsupported, # R_ISM_ID unpackUnsupported, # R_ISM_GAIN Loading tests/rtp/test_rtp.py +2 −1 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ def generatePiData(startTs: int, endTs: int) -> dict: someDesc = lambda : AUDIO_DESCRIPTION(isSpeech=bool(random.getrandbits(1)), isMusic=bool(random.getrandbits(1)), isAmbiance=bool(random.getrandbits(1)), isEditable=bool(random.getrandbits(1)), isBinaural=bool(random.getrandbits(1))) someDAS = lambda : DYNAMIC_AUDIO_SUPPRESSION(preferSpeech=bool(random.getrandbits(1)), preferMusic=bool(random.getrandbits(1)), preferAmbiance=bool(random.getrandbits(1)), level=random.randint(0, 15)) someDIG = lambda : DIEGETIC_TYPE(isDigetic=[ bool(random.getrandbits(1)) for _ in range(random.randint(1, 5)) ]) someAFocus = lambda : AUDIO_FOCUS(w=2*random.random()-1.0, x=2*random.random()-1.0, y=2*random.random()-1.0, z=2*random.random()-1.0, level=random.randint(0, 15)) for ts in range(startTs, endTs, 320): pidata = dict() Loading @@ -172,7 +173,7 @@ def generatePiData(startTs: int, endTs: int) -> dict: pidata["DEVICE_ORIENTATION_UNCOMPENSATED"] = someOrientation() pidata["PLAYBACK_DEVICE_ORIENTATION"] = someOrientation() pidata["HEAD_ORIENTATION"] = someOrientation() pidata["AUDIO_FOCUS_DIRECTION"] = someOrientation() pidata["AUDIO_FOCUS_REQUEST"] = someAFocus() pidata["LISTENER_POSITION"] = somePosition() pidata["DYNAMIC_AUDIO_SUPPRESSION"] = someDAS() pidata["AUDIO_DESCRIPTION"] = [someDesc() for n in range(random.randint(1, 5))] Loading Loading
apps/decoder.c +32 −4 Original line number Diff line number Diff line Loading @@ -216,8 +216,8 @@ static const char *PiDataNames[IVAS_PI_MAX_ID] = { "SCENE_ORIENTATION", "DEVICE_ORIENTATION_COMPENSATED", "DEVICE_ORIENTATION_UNCOMPENSATED", "ACOUSTIC_ENVIRONMENT", "AUDIO_DESCRIPTION", "ISM_NUM", "ISM_ID", "ISM_GAIN", "ISM_ORIENTATION", "ISM_POSITION", "ISM_DISTANCE_ATTENUATION", "ISM_DIRECTIVITY", "DIEGETIC_TYPE", "RESERVED13", "RESERVED14", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION", "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_DIRECTION", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN", "AUDIO_FOCUS_INDICATION", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION", "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_REQUEST", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN", "R_ISM_ORIENTATION", "R_ISM_POSITION", "R_ISM_DIRECTION", "RESERVED27", "RESERVED28", "RESERVED29", "RESERVED30", "NO_DATA" }; Loading Loading @@ -261,7 +261,6 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n #ifdef RTP_S4_251135_CR26253_0016_REV1 case IVAS_PI_PLAYBACK_DEVICE_ORIENTATION: case IVAS_PI_HEAD_ORIENTATION: case IVAS_PI_AUDIO_FOCUS_DIRECTION: case IVAS_PI_R_ISM_ORIENTATION: #endif { Loading Loading @@ -327,6 +326,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n fprintf( f_piDataOut, "\t\t\t]\n\t\t}" ); } break; case IVAS_PI_AUDIO_FOCUS_INDICATION: { fprintf( f_piDataOut, "{\n" ); if ( cur->data.focusIndication.availDirection ) { fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t", cur->data.focusIndication.direction.w, cur->data.focusIndication.direction.x, cur->data.focusIndication.direction.y, cur->data.focusIndication.direction.z ); } if ( cur->data.focusIndication.availLevel ) { fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusIndication.flvl ); } fprintf( f_piDataOut, "\n\t\t}" ); } break; case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION: { IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppression; Loading @@ -339,7 +353,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n } break; case IVAS_PI_RESERVED13: case IVAS_PI_RESERVED14: case IVAS_PI_AUDIO_FOCUS_REQUEST: { fprintf( f_piDataOut, "{\n" ); if ( cur->data.focusRequest.availDirection ) { fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t", cur->data.focusRequest.direction.w, cur->data.focusRequest.direction.x, cur->data.focusRequest.direction.y, cur->data.focusRequest.direction.z ); } if ( cur->data.focusRequest.availLevel ) { fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusRequest.flvl ); } fprintf( f_piDataOut, "\n\t\t}" ); } break; case IVAS_PI_RESERVED15: case IVAS_PI_RESERVED27: case IVAS_PI_RESERVED28: Loading
lib_util/ivas_rtp_pi_data.c +96 −7 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ static ivas_error packOrientation( const IVAS_PIDATA_GENERIC *piData, uint8_t *b if ( ( piData->piDataType != IVAS_PI_SCENE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_COMPENSATED ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED ) #ifdef RTP_S4_251135_CR26253_0016_REV1 && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) && ( piData->piDataType != IVAS_PI_AUDIO_FOCUS_DIRECTION ) && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) #endif /* RTP_S4_251135_CR26253_0016_REV1 */ ) { Loading Loading @@ -544,6 +544,95 @@ static ivas_error unpackDiegetic( const uint8_t *buffer, uint32_t numDataBytes, return IVAS_ERR_OK; } static ivas_error packAudioFocusCommon( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) { uint32_t nBytes = 0; uint8_t packedSize = 1; const IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (const IVAS_PIDATA_AUDIO_FOCUS *) piData; *nBytesWritten = 0; if ( piData->size != sizeof( IVAS_PIDATA_AUDIO_FOCUS ) ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in PI data of type Audio Focus" ); } if ( audioFocus->availDirection && audioFocus->availLevel ) { packedSize = 9; } else if ( audioFocus->availDirection ) { packedSize = 8; } else if ( audioFocus->availLevel ) { packedSize = 1; } else { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Neither direction or level is available for packing Audio Focus" ); } /* Audio Focus data is packedSize bytes, header is 2 bytes */ if ( maxDataBytes < (uint32_t) packedSize + 2 ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Insufficient space to pack Audio Focus PI data" ); } buffer[nBytes++] = ( audioFocus->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ buffer[nBytes++] = packedSize; if ( packedSize == 9 || packedSize == 8 ) { nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.w ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.x ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.y ) ); nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.z ) ); } if ( packedSize == 9 || packedSize == 1) { buffer[nBytes++] = ( (uint8_t) audioFocus->flvl & MASK_4BIT ) << 4; } *nBytesWritten = nBytes; return IVAS_ERR_OK; } static ivas_error unpackAudioFocusCommon( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) { IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (IVAS_PIDATA_AUDIO_FOCUS *) piData; /* Audio Focus data is either 1, 8 or 9 bytes */ if ( numDataBytes != 1 && numDataBytes != 8 && numDataBytes != 9 ) { return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI data of type Audio Focus" ); } piData->size = sizeof( IVAS_PIDATA_AUDIO_FOCUS ); audioFocus->availDirection = ( numDataBytes >= 8 ); audioFocus->availLevel = ( numDataBytes == 1 || numDataBytes == 9 ); if ( numDataBytes == 1 ) { audioFocus->flvl = ( buffer[0] >> 4 ); } else { audioFocus->direction.w = FLOAT_FROM_Q15( readInt16( &buffer[0] ) ); audioFocus->direction.x = FLOAT_FROM_Q15( readInt16( &buffer[2] ) ); audioFocus->direction.y = FLOAT_FROM_Q15( readInt16( &buffer[4] ) ); audioFocus->direction.z = FLOAT_FROM_Q15( readInt16( &buffer[6] ) ); if ( numDataBytes == 9 ) { audioFocus->flvl = ( buffer[8] >> 4 ); } } return IVAS_ERR_OK; } #endif /* RTP_S4_251135_CR26253_0016_REV1 */ Loading @@ -570,14 +659,14 @@ static const PACK_PI_FN packPiDataFuntions[IVAS_PI_MAX_ID] = { packUnsupportedData, /* DIEGETIC_TYPE */ #endif packUnsupportedData, /* RESERVED13 */ packUnsupportedData, /* RESERVED14 */ packAudioFocusCommon,/* AUDIO_FOCUS_INDICATION */ packUnsupportedData, /* RESERVED15 */ #ifdef RTP_S4_251135_CR26253_0016_REV1 packOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ packOrientation, /* HEAD_ORIENTATION */ packListenerPosition, /* LISTENER_POSITION */ packDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION */ packOrientation, /* AUDIO_FOCUS_DIRECTION */ packAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ #else packUnsupportedData, /* PLAYBACK_DEVICE_ORIENTATION */ packUnsupportedData, /* HEAD_ORIENTATION */ Loading Loading @@ -625,14 +714,14 @@ static const UNPACK_PI_FN unpackPiDataFuntions[IVAS_PI_MAX_ID] = { unpackUnsupportedData, /* DIEGETIC_TYPE */ #endif unpackUnsupportedData, /* RESERVED13 */ unpackUnsupportedData, /* RESERVED14 */ unpackAudioFocusCommon,/* AUDIO_FOCUS_INDICATION */ unpackUnsupportedData, /* RESERVED15 */ #ifdef RTP_S4_251135_CR26253_0016_REV1 unpackOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ unpackOrientation, /* HEAD_ORIENTATION */ unpackListenerPosition, /* LISTENER_POSITION */ unpackDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION */ unpackOrientation, /* AUDIO_FOCUS_DIRECTION */ unpackAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ #else unpackUnsupportedData, /* PLAYBACK_DEVICE_ORIENTATION */ unpackUnsupportedData, /* HEAD_ORIENTATION */ Loading Loading @@ -672,13 +761,13 @@ static const uint32_t maxPiDataSize[IVAS_PI_MAX_ID] = { 8, /* IVAS_PI_ISM_DIRECTIVITY */ 1, /* IVAS_PI_DIEGETIC_TYPE */ 0, /* IVAS_PI_RESERVED13 */ 0, /* IVAS_PI_RESERVED14 */ 9, /* IVAS_PI_AUDIO_FOCUS_INDICATION */ 0, /* IVAS_PI_RESERVED15 */ 8, /* IVAS_PI_PLAYBACK_DEVICE_ORIENTATION */ 8, /* IVAS_PI_HEAD_ORIENTATION */ 6, /* IVAS_PI_LISTENER_POSITION */ 2, /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION */ 8, /* IVAS_PI_AUDIO_FOCUS_DIRECTION */ 9, /* IVAS_PI_AUDIO_FOCUS_REQUEST */ 4, /* IVAS_PI_PI_LATENCY */ 1, /* IVAS_PI_R_ISM_ID */ 1, /* IVAS_PI_R_ISM_GAIN */ Loading
lib_util/ivas_rtp_pi_data.h +38 −4 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ extern "C" IVAS_PI_ISM_DIRECTIVITY, /* directivity of each object */ IVAS_PI_DIEGETIC_TYPE, /* digetic audio indication */ IVAS_PI_RESERVED13, /* reserved */ IVAS_PI_RESERVED14, /* reserved */ IVAS_PI_AUDIO_FOCUS_INDICATION, /* audio focus indication (direction in Quaternions and/or level) */ IVAS_PI_RESERVED15, /* reserved */ /* Reverse direction PI types */ Loading @@ -72,7 +72,7 @@ extern "C" IVAS_PI_HEAD_ORIENTATION, /* head orientation of the listener in Quaternions */ IVAS_PI_LISTENER_POSITION, /* position of the listener in 3D space */ IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION, /* receiver’s preference with respect to audio suppression */ IVAS_PI_AUDIO_FOCUS_DIRECTION, /* direction of interest for the listener in Quaternions */ IVAS_PI_AUDIO_FOCUS_REQUEST, /* direction of interest for the listener in Quaternions and/or audio focus level */ IVAS_PI_PI_LATENCY, /* round-trip latency for PI frames */ IVAS_PI_R_ISM_ID, /* id of an object for editing */ IVAS_PI_R_ISM_GAIN, /* editing request for gain factor for received object */ Loading Loading @@ -100,7 +100,6 @@ extern "C" * - IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED * - IVAS_PI_PLAYBACK_DEVICE_ORIENTATION * - IVAS_PI_HEAD_ORIENTATION * - IVAS_PI_AUDIO_FOCUS_DIRECTION * - IVAS_PI_R_ISM_ORIENTATION * * piDataType is used to identify the correct pi data type contained here Loading Loading @@ -293,6 +292,40 @@ extern "C" bool isDiegetic[1 + IVAS_PI_MAX_OBJECTS]; /* diegetic indication as per audio format */ } IVAS_PIDATA_DIEGETIC; /* Audio focus direction indicates a direction of interest. * The audio focus level indicates the amount of suppression applied to the * directions other than the audio focus direction. */ typedef enum { IVAS_FLVL_NO_AUDIO_FOCUS = 0, /* Apply no audio focus */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_1, /* Audio focus level 1 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_2, /* Audio focus level 2 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_3, /* Audio focus level 3 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_4, /* Audio focus level 4 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_5, /* Audio focus level 5 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_6, /* Audio focus level 6 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_7, /* Audio focus level 7 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_8, /* Audio focus level 8 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_9, /* Audio focus level 9 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_10, /* Audio focus level 10 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_11, /* Audio focus level 11 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_12, /* Audio focus level 12 */ IVAS_FLVL_FOCUS_LEVEL_LEVEL_13, /* Audio focus level 13 */ IVAS_FLVL_DEFAULT_AUDIO_FOCUS, /* Default audio focus */ IVAS_FLVL_MAX_AUDIO_FOCUS, /* Apply max audio focus */ } IVAS_FLVL; typedef struct { size_t size; /* sizeof(IVAS_PIDATA_AUDIO_FOCUS) */ uint32_t piDataType; /* IVAS_PI_AUDIO_FOCUS_INDCATION or IVAS_PI_AUDIO_FOCUS_REQUEST */ bool availDirection; /* audio focus contains direction */ bool availLevel; /* audio focus contains level */ IVAS_QUATERNION direction; /* direction data expressed as quarternions */ IVAS_FLVL flvl; /* audio focus level */ } IVAS_PIDATA_AUDIO_FOCUS; /* Listener position */ typedef struct { Loading Loading @@ -416,12 +449,13 @@ extern "C" IVAS_PIDATA_ISM_ATTENUATION ismAttenuation; IVAS_PIDATA_ISM_DIRECTIVITY ismDirectivity; IVAS_PIDATA_DIEGETIC digeticIndicator; IVAS_PIDATA_AUDIO_FOCUS focusIndication; IVAS_PIDATA_ORIENTATION playbackOrientation; IVAS_PIDATA_ORIENTATION headOrientation; IVAS_PIDATA_LISTENER_POSITION listnerPosition; IVAS_PIDATA_DYNAMIC_SUPPRESSION dynSuppression; IVAS_PIDATA_ORIENTATION focusDirection; IVAS_PIDATA_AUDIO_FOCUS focusRequest; IVAS_PIDATA_REVERSE_PI_LATENCY piLatency; IVAS_PIDATA_ISM_EDIT_ID ismEditId; IVAS_PIDATA_ISM_EDIT_GAIN ismEditGain; Loading
tests/rtp/ivasrtp.py +30 −4 Original line number Diff line number Diff line Loading @@ -170,13 +170,13 @@ class PIDATAS(str, Enum): ISM_DIRECTIVITY = "ISM_DIRECTIVITY" DIEGETIC_TYPE = "DIEGETIC_TYPE" RESERVED13 = "RESERVED13" RESERVED14 = "RESERVED14" AUDIO_FOCUS_INDICATION = "AUDIO_FOCUS_INDICATION" RESERVED15 = "RESERVED15" PLAYBACK_DEVICE_ORIENTATION = "PLAYBACK_DEVICE_ORIENTATION" HEAD_ORIENTATION = "HEAD_ORIENTATION" LISTENER_POSITION = "LISTENER_POSITION" DYNAMIC_AUDIO_SUPPRESSION = "DYNAMIC_AUDIO_SUPPRESSION" AUDIO_FOCUS_DIRECTION = "AUDIO_FOCUS_DIRECTION" AUDIO_FOCUS_REQUEST = "AUDIO_FOCUS_REQUEST" PI_LATENCY = "PI_LATENCY" R_ISM_ID = "R_ISM_ID" R_ISM_GAIN = "R_ISM_GAIN" Loading Loading @@ -207,6 +207,24 @@ class SUPPRESSION_LEVEL(int, Enum): SUPPRESSION_LEVEL_14 = 14 SUPPRESSION_LEVEL_MAX = 15 class AUDIO_FOCUS_LEVEL(int, Enum): AUDIO_FOCUS_LEVEL_NONE = 0 AUDIO_FOCUS_LEVEL_1 = 1 AUDIO_FOCUS_LEVEL_2 = 2 AUDIO_FOCUS_LEVEL_3 = 3 AUDIO_FOCUS_LEVEL_4 = 4 AUDIO_FOCUS_LEVEL_5 = 5 AUDIO_FOCUS_LEVEL_6 = 6 AUDIO_FOCUS_LEVEL_7 = 7 AUDIO_FOCUS_LEVEL_8 = 8 AUDIO_FOCUS_LEVEL_9 = 9 AUDIO_FOCUS_LEVEL_10 = 10 AUDIO_FOCUS_LEVEL_11 = 11 AUDIO_FOCUS_LEVEL_12 = 12 AUDIO_FOCUS_LEVEL_13 = 13 AUDIO_FOCUS_LEVEL_DEFAULT = 14 AUDIO_FOCUS_LEVEL_NO_PREFERENCE = 15 @dataclass class RTPHDR: Loading Loading @@ -343,6 +361,14 @@ class ACOUSTIC_ENVIRONMENT: dim: tuple[float, float, float] = () abscoeff: tuple[float, float, float, float, float, float] = () @dataclass class AUDIO_FOCUS: w: float = 0.0 x: float = 0.0 y: float = 0.0 z: float = 0.0 level: AUDIO_FOCUS_LEVEL = AUDIO_FOCUS_LEVEL.AUDIO_FOCUS_LEVEL_DEFAULT @dataclass class PIDATA: timestamp: int = 0 Loading Loading @@ -589,13 +615,13 @@ PIDataUnpacker = [ unpackUnsupported, # ISM_DIRECTIVITY unpackDiegetic, # DIEGETIC_TYPE unpackUnsupported, # RESERVED13 unpackUnsupported, # RESERVED14 unpackAudioFocusCommon, # AUDIO_FOCUS_INDICATION unpackUnsupported, # RESERVED15 unpackOrientation, # PLAYBACK_DEVICE_ORIENTATION unpackOrientation, # HEAD_ORIENTATION unpackPosition, # LISTENER_POSITION unpackDAS, # DYNAMIC_AUDIO_SUPPRESSION unpackOrientation, # AUDIO_FOCUS_DIRECTION unpackAudioFocusCommon, # AUDIO_FOCUS_REQUEST unpackUnsupported, # PI_LATENCY unpackUnsupported, # R_ISM_ID unpackUnsupported, # R_ISM_GAIN Loading
tests/rtp/test_rtp.py +2 −1 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ def generatePiData(startTs: int, endTs: int) -> dict: someDesc = lambda : AUDIO_DESCRIPTION(isSpeech=bool(random.getrandbits(1)), isMusic=bool(random.getrandbits(1)), isAmbiance=bool(random.getrandbits(1)), isEditable=bool(random.getrandbits(1)), isBinaural=bool(random.getrandbits(1))) someDAS = lambda : DYNAMIC_AUDIO_SUPPRESSION(preferSpeech=bool(random.getrandbits(1)), preferMusic=bool(random.getrandbits(1)), preferAmbiance=bool(random.getrandbits(1)), level=random.randint(0, 15)) someDIG = lambda : DIEGETIC_TYPE(isDigetic=[ bool(random.getrandbits(1)) for _ in range(random.randint(1, 5)) ]) someAFocus = lambda : AUDIO_FOCUS(w=2*random.random()-1.0, x=2*random.random()-1.0, y=2*random.random()-1.0, z=2*random.random()-1.0, level=random.randint(0, 15)) for ts in range(startTs, endTs, 320): pidata = dict() Loading @@ -172,7 +173,7 @@ def generatePiData(startTs: int, endTs: int) -> dict: pidata["DEVICE_ORIENTATION_UNCOMPENSATED"] = someOrientation() pidata["PLAYBACK_DEVICE_ORIENTATION"] = someOrientation() pidata["HEAD_ORIENTATION"] = someOrientation() pidata["AUDIO_FOCUS_DIRECTION"] = someOrientation() pidata["AUDIO_FOCUS_REQUEST"] = someAFocus() pidata["LISTENER_POSITION"] = somePosition() pidata["DYNAMIC_AUDIO_SUPPRESSION"] = someDAS() pidata["AUDIO_DESCRIPTION"] = [someDesc() for n in range(random.randint(1, 5))] Loading