MX Foundation 4
Transmission with Record Relative Timing

Transmission with relative record timing means the records are scheduled one after another based on the delta time tag set.

The option MXF_TXAPERIODIC_FLAG_USE_RECORD_RELATIVE_TIME is used to perform this function.

For instance, for an array of n records to transmit, the records transmit timing is as follows:

Time record 1 = record 1 time tag (offset from current time)
Time record 2 = Time record 1 + (record 2 time tag - record 1 time tag)
Time record 3 = Time record 2 + (record 3 time tag - record 2 time tag)
......
Time record n = Time record n-1 + (record n time tag - record n-1 time tag)

Each time tag becomes relative to the previous record sent.

csdb_aperiodic.c

#define BUFFER_SIZE 4096 // 4KB
#define MAX_TX_RECORDS_TO_TRANSMIT 8
#define BLOCKCOUNT 6
HMXF_SERVER server;
HMXF_DEVICE device;
HMXF_CHANNEL txChannel;
HMXF_BUFFER txBuffer=0;
HMXF_CSDB_DATAREC *recCsdb=NULL;
HMXF_CSDB_DATAREC *rec;
uint32 record;
uint64 delay100ms = 100000;
uint32 rc;
uint64 currentTime;
...
// Set timebase to 64-bit microseconds
if (!rc)
rc = mxfSystemTimeBaseSet(server, MXF_TIMEBASE_DEVICE_USEC);
// Allocate Aperiodic TX static buffer for HIGH priority queue
if (!rc)
rc = mxfTxAperiodicBufferAlloc(txChannel, MXF_TXAPERIODIC_PRIORITY_HIGH, BUFFER_SIZE, &txBuffer, NULL);
// Allocate host buffer
if (!rc)
{
recCsdb = (MXF_CSDB_DATAREC*)malloc(BUFFER_SIZE);
if (!recCsdb)
rc = MAXT_ERROR_MEM;
}
// Set the record
rec = recCsdb;
for (record=0, currentTime=100000; record<MAX_TX_RECORDS_TO_TRANSMIT; record++)
{
if(record == 0)
{
// Set sync block
rec->timeTag = currentTime+((record+1)*10000LL);
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
for(dataIdx=0; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = 0xA5;
}
else
{
// Set each record: LABEL=8, SI=1
rec->timeTag = currentTime+((record+1)*10000LL);
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
rec->data[0] = 8;
rec->data[1] = 1;
for(dataIdx=2; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = (uint8)(3*record);
}
}
// Transmit the array of records
if (!rc)
rc = mxfCSDBTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_RELATIVE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, recCsdb);
if (recCsdb)
free(recCsdb);
...
Updated 10/23/2023