From 8bf57a3e20318f0404251850ce51fd22718911ec Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Mon, 10 Nov 2025 00:04:17 +0100 Subject: [PATCH 1/3] fix size for verification, hard-coded source 127.0.0.1:5000 --- lib_util/mime_io.c | 2 +- lib_util/rtpdump.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib_util/mime_io.c b/lib_util/mime_io.c index 1ecd603b32..e5e17f3ee7 100644 --- a/lib_util/mime_io.c +++ b/lib_util/mime_io.c @@ -322,7 +322,7 @@ static bool readLong( { char buffer[4] = { 0 }; - if ( fread( buffer, 1, 4, file ) != 1U ) + if ( fread( buffer, 1, 4, file ) != 4U ) { return false; } diff --git a/lib_util/rtpdump.c b/lib_util/rtpdump.c index f89b36f82a..768a6772ef 100644 --- a/lib_util/rtpdump.c +++ b/lib_util/rtpdump.c @@ -80,7 +80,7 @@ static unsigned char *parseByte( unsigned char *buffer, unsigned char *value ) static int readLong( FILE *file, unsigned int *value ) { char buffer[4] = { 0 }; - if ( fread( buffer, 1, 4, file ) != 1U ) + if ( fread( buffer, 1, 4, file ) != 4U ) { return -1; } @@ -96,7 +96,7 @@ static int readLong( FILE *file, unsigned int *value ) static int readShort( FILE *file, unsigned short *value ) { char buffer[2] = { 0 }; - if ( fread( buffer, 1, 2, file ) != 1U ) + if ( fread( buffer, 1, 2, file ) != 2U ) { return -1; } @@ -210,14 +210,18 @@ static int readHeader( struct RTPDUMP *hRTPDUMP ) static int writeHeader( struct RTPDUMP *hRTPDUMP ) { /* write rtpdump header */ - fprintf( hRTPDUMP->file, "#!rtpplay%s %s/%d\n", "1.0", "127.0.0.1", 5000 ); - if ( !writeLong( hRTPDUMP->file, hRTPDUMP->startSeconds ) && - !writeLong( hRTPDUMP->file, hRTPDUMP->startMicroSeconds ) && - !writeLong( hRTPDUMP->file, hRTPDUMP->source ) && - !writeShort( hRTPDUMP->file, hRTPDUMP->port ) && - !writeShort( hRTPDUMP->file, 0 ) ) { - return 0; + hRTPDUMP->source = 0x7F000001u; /* 127.0.0.1 */ + hRTPDUMP->port = 5000u; + fprintf( hRTPDUMP->file, "#!rtpplay%s %s/%d\n", "1.0", "127.0.0.1", hRTPDUMP->port ); + if ( !writeLong( hRTPDUMP->file, hRTPDUMP->startSeconds ) && + !writeLong( hRTPDUMP->file, hRTPDUMP->startMicroSeconds ) && + !writeLong( hRTPDUMP->file, hRTPDUMP->source ) && + !writeShort( hRTPDUMP->file, hRTPDUMP->port ) && + !writeShort( hRTPDUMP->file, 0 ) ) + { + return 0; + } } return -1; } -- GitLab From f3e8e616b036f7948a13a2f64f7766802bbc268a Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Mon, 10 Nov 2025 00:41:40 +0100 Subject: [PATCH 2/3] wip - add back using rtpdump.c/.h to use the real RTPDUMP format --- lib_util/ivas_rtp_file.c | 151 ++++++++++++++++++++++++++++++++++++++- lib_util/ivas_rtp_file.h | 12 +++- 2 files changed, 160 insertions(+), 3 deletions(-) diff --git a/lib_util/ivas_rtp_file.c b/lib_util/ivas_rtp_file.c index f7d6d5d867..dd84f46bc1 100644 --- a/lib_util/ivas_rtp_file.c +++ b/lib_util/ivas_rtp_file.c @@ -29,11 +29,18 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ + + + #include #include #include "ivas_rtp_file.h" #include "ivas_error_utils.h" +#ifdef USE_RTPDUMP +#include "rtpdump.h" +#endif +#ifndef USE_RTPDUMP struct IVAS_RTP_FILE { bool isFileWriter; @@ -135,6 +142,7 @@ static ivas_error IvasRtpFile_Read( return IVAS_ERR_OK; } +#endif static const char *const PiDataNames[IVAS_PI_MAX_ID] = { "SCENE_ORIENTATION", "DEVICE_ORIENTATION_COMPENSATED", "DEVICE_ORIENTATION_UNCOMPENSATED", @@ -611,6 +619,44 @@ void IVAS_RTP_Term( { if ( rtp->hPack != NULL ) { +#ifdef USE_RTPDUMP + /* Flush any remaining RTP packets */ + while ( IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) > 0 ) + { + ivas_error error; + uint32_t numFramesInPayload = 0; + error = IVAS_RTP_PACK_GetPacket( rtp->hPack, &rtp->rtpPacket, &numFramesInPayload ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while packing RTP packet\n", ivas_error_to_string( error ) ); + break; + } + if ( numFramesInPayload > 0 ) + { + RTPDUMP_RTPPACKET pkt; + RTPDUMP_SetDefaultRtpPacketHeader( &pkt ); + + unsigned len = rtp->rtpPacket.length; + if ( len > sizeof( pkt.data ) ) + len = sizeof( pkt.data ); + memcpy( pkt.data, rtp->rtpPacket.buffer, len ); + RTPDUMP_ParseRTPHeader( &pkt ); + pkt.ssrc = rtp->ssrc; + pkt.payloadTypeId = rtp->pt; + pkt.payloadSize = (unsigned short) ( len - pkt.headerSize ); + /* override sequence number to enforce 1-step increments */ + pkt.sequenceNumber = rtp->nextSeq++; + /* compute time offset in ms from RTP timestamp (16kHz clock) */ + uint32_t offset_ms = pkt.timeStamp / 16; + RTPDUMP_ERROR werr = RTPDUMP_WritePacket( rtp->dump, &pkt, offset_ms ); + if ( werr != RTPDUMP_NO_ERROR ) + { + fprintf( stderr, "\nError writing RTPDump packet: %d\n", werr ); + break; + } + } + } +#else /* Complete the last packet */ if ( IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) != 0 ) { @@ -629,6 +675,7 @@ void IVAS_RTP_Term( } } } +#endif IVAS_RTP_PACK_Close( &rtp->hPack ); } @@ -650,10 +697,17 @@ void IVAS_RTP_Term( rtp->f_piExtOut = NULL; } +#ifdef USE_RTPDUMP + if ( rtp->dump ) + { + RTPDUMP_Close( &rtp->dump, 1 ); + } +#else if ( rtp->hRtpFile != NULL ) { IvasRtpFile_Close( &rtp->hRtpFile ); } +#endif } } @@ -684,12 +738,26 @@ ivas_error IVAS_RTP_WRITER_Init( if ( error == IVAS_ERR_OK ) { /* Open the output file for RTPDump writing */ +#ifdef USE_RTPDUMP + { + RTPDUMP_ERROR rderr = RTPDUMP_OpenForWriting( &rtp->dump, outputBitstreamFilename ); + if ( rderr != RTPDUMP_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_OPEN, "rtpdump open error %d", rderr ); + } + /* start sequence numbering at zero */ + rtp->nextSeq = 0; + } +#else error = IvasRtpFile_Open( outputBitstreamFilename, true, &rtp->hRtpFile ); if ( error != IVAS_ERR_OK ) { return error; } +#endif + /* initialize RTP packer header sequence only in file-based mode */ +#ifndef USE_RTPDUMP #ifdef FIXED_RTP_SEQUENCE_NUM error = IVAS_RTP_PACK_UpdateHeader( rtp->hPack, seqNumInitVal, SSRC, 0, NULL, 0, 0, NULL ); #else @@ -699,6 +767,13 @@ ivas_error IVAS_RTP_WRITER_Init( { fprintf( stderr, "error in IVAS_RTP_PACK_UpdateHeader(): %d\n", error ); } +#else + rtp->ssrc = SSRC; + rtp->pt = 96; /* hard-coded for now */ +#ifdef FIXED_RTP_SEQUENCE_NUM + rtp->nextSeq = seqNumInitVal; +#endif +#endif } return error; @@ -727,11 +802,22 @@ ivas_error IVAS_RTP_READER_Init( error = IVAS_RTP_UNPACK_Open( &rtp->hUnpack, &rtp->unpackCfg ); if ( error == IVAS_ERR_OK ) { + /* Open the output file for RTPDump writing */ +#ifdef USE_RTPDUMP + { + RTPDUMP_ERROR rderr = RTPDUMP_OpenForReading( &rtp->dump, inputBitstreamFilename ); + if ( rderr != RTPDUMP_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_OPEN, "rtpdump open failed %d", rderr ); + } + } +#else error = IvasRtpFile_Open( inputBitstreamFilename, false, &rtp->hRtpFile ); if ( error != IVAS_ERR_OK ) { return error; } +#endif if ( piOutputFilename != NULL ) { @@ -811,7 +897,43 @@ ivas_error IVAS_RTP_WriteNextFrame( } rtp->nWrittenPiData--; } - +#ifdef USE_RTPDUMP + /* flush packets when packet full or forced */ + if ( forcePacket || IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) == rtp->packCfg.maxFramesPerPacket ) + { + while ( 1 ) + { + uint32_t numFramesInPayload = 0; + /* attempt to get a packet from packer */ + ivas_error pkErr = IVAS_RTP_PACK_GetPacket( rtp->hPack, &rtp->rtpPacket, &numFramesInPayload ); + if ( pkErr != IVAS_ERR_OK || numFramesInPayload == 0 ) + { + break; + } + /* write this packet via RTPDump */ + RTPDUMP_RTPPACKET pkt; + memset( &pkt, 0, sizeof( pkt ) ); + unsigned len = rtp->rtpPacket.length; + if ( len > sizeof( pkt.data ) ) + len = sizeof( pkt.data ); + memcpy( pkt.data, rtp->rtpPacket.buffer, len ); + RTPDUMP_ParseRTPHeader( &pkt ); + /* set proper header and payload sizes */ + pkt.headerSize = 12; + pkt.payloadSize = (unsigned short) ( len - pkt.headerSize ); + /* override sequence number to enforce 1-step increments */ + pkt.sequenceNumber = rtp->nextSeq++; + /* compute time offset in ms from RTP timestamp (16kHz clock) */ + uint32_t offset_ms = pkt.timeStamp / 16; + RTPDUMP_ERROR werr = RTPDUMP_WritePacket( rtp->dump, &pkt, offset_ms ); + if ( werr != RTPDUMP_NO_ERROR ) + { + fprintf( stderr, "\nError writing RTPDump packet: %d\n", werr ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + } + } +#else if ( forcePacket || IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) == rtp->packCfg.maxFramesPerPacket ) { uint32_t numFramesInPayload = 0; @@ -829,7 +951,7 @@ ivas_error IVAS_RTP_WriteNextFrame( return error; } } - +#endif return error; } @@ -856,11 +978,36 @@ ivas_error IVAS_RTP_ReadNextFrame( packedFrame.capacity = ( IVAS_MAX_BITS_PER_FRAME / 8 ); if ( rtp->numFramesInPacket == 0 ) { +#ifdef USE_RTPDUMP + /* Read next packet via RTPDUMP library */ + { + RTPDUMP_RTPPACKET pd; + uint32_t offset_ms; + RTPDUMP_ERROR rderr = RTPDUMP_ReadPacket( rtp->dump, &pd, &offset_ms ); + if ( rderr == RTPDUMP_READ_ENDOFFILE ) + return IVAS_ERR_END_OF_FILE; + if ( rderr != RTPDUMP_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_OPEN, "rtpdump read error %d", rderr ); + } + /* copy raw data to unpack buffer */ + unsigned total = pd.headerSize + pd.payloadSize; + if ( total > rtp->rtpPacket.capacity ) + { + return IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE; + } + memcpy( rtp->rtpPacket.buffer, pd.data, total ); + rtp->rtpPacket.length = total; + if ( nextPacketRcvTime_ms ) + *nextPacketRcvTime_ms = offset_ms; + } +#else rtp->rtpPacket.length = 0; if ( ( error = IvasRtpFile_Read( rtp->hRtpFile, rtp->rtpPacket.buffer, &rtp->rtpPacket.length, rtp->rtpPacket.capacity ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( ( error = IVAS_RTP_UNPACK_PushPacket( rtp->hUnpack, &rtp->rtpPacket, &rtp->numFramesInPacket, &rtp->numPiDataInPacket, diff --git a/lib_util/ivas_rtp_file.h b/lib_util/ivas_rtp_file.h index 70f8c99f0e..97045b6e93 100644 --- a/lib_util/ivas_rtp_file.h +++ b/lib_util/ivas_rtp_file.h @@ -33,10 +33,14 @@ #ifndef IVAS_RTP_FILE_H #define IVAS_RTP_FILE_H +#define USE_RTPDUMP 1 + #include "common_api_types.h" #include "ivas_rtp_api.h" #include "ivas_rtp_pi_data.h" - +#ifdef USE_RTPDUMP +#include "rtpdump.h" +#endif typedef struct IVAS_RTP_FILE *IVAS_RTP_FILE_HANDLE; typedef struct @@ -65,6 +69,12 @@ typedef struct IVAS_RTP_UNPACK_HANDLE hUnpack; IVAS_RTP_PACK_CONFIG packCfg; IVAS_RTP_UNPACK_CONFIG unpackCfg; +#ifdef USE_RTPDUMP + RTPDUMP_HANDLE dump; + uint16_t nextSeq; + uint32_t ssrc; + uint8_t pt; +#endif #ifdef RTP_S4_251135_CR26253_0016_REV1 IVAS_RTP_SR_INFO srInfo; #endif -- GitLab From 13b5a58678609568a225f6284ddb2097415586e1 Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Mon, 10 Nov 2025 01:20:33 +0100 Subject: [PATCH 3/3] clang-format --- lib_util/ivas_rtp_file.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_util/ivas_rtp_file.c b/lib_util/ivas_rtp_file.c index dd84f46bc1..9d3e5beb49 100644 --- a/lib_util/ivas_rtp_file.c +++ b/lib_util/ivas_rtp_file.c @@ -31,7 +31,6 @@ *******************************************************************************************************/ - #include #include #include "ivas_rtp_file.h" @@ -635,7 +634,7 @@ void IVAS_RTP_Term( { RTPDUMP_RTPPACKET pkt; RTPDUMP_SetDefaultRtpPacketHeader( &pkt ); - + unsigned len = rtp->rtpPacket.length; if ( len > sizeof( pkt.data ) ) len = sizeof( pkt.data ); @@ -772,7 +771,7 @@ ivas_error IVAS_RTP_WRITER_Init( rtp->pt = 96; /* hard-coded for now */ #ifdef FIXED_RTP_SEQUENCE_NUM rtp->nextSeq = seqNumInitVal; -#endif +#endif #endif } -- GitLab