Support Request #4306
closedFill sample from char* buffer and include buffer size
Description
Support Anfrage:
ich versuche gerade, in ADTF3 den Inhalt eines char* buffers als Media-Sample zu verschicken. Allerdings finde ich keine Möglichkeit, die Buffer-Size mitzugeben.
Wie wäre der von der ADTF3 API vorgesehene Weg, für einen solchen Use-Case, ohne die Daten unnötig oft hin und her zu kopieren.
C-Structs oder simple Datentypen würde ich normalerweise so versenden:
myType data; // struct to send
object_ptr<ISample> pWriteSample;
RETURN_IF_FAILED(alloc_sample(pWriteSample, timeStamp));
write_to_sample(*pWriteSample, data);
m_pinWriter << pWriteSample;
Allerdings habe ich bei write_to_sample() keine Möglichkeit die größe der zu versendende Daten festzulegen. In der Implementierung wird immer sizeOf(myType) verwendet. Daher habe ich die Implementierung von write_to_sample() als Basis für eine eigene Send-Routine genommen:
tResult EthernetToRDB::SendSample(tTimeStamp timeStamp, const char* buffer, size_t size)
{
{
object_ptr<ISample> pWriteSample;
RETURN_IF_FAILED(alloc_sample(pWriteSample, timeStamp));
// modified version of write_to_sample() to support sending only part of the buffer
adtf::ucom::object_ptr_locked<ISampleBuffer> pSampleBuffer;
RETURN_IF_FAILED(pWriteSample->WriteLock(pSampleBuffer, size));
adtf::base::adtf_memory<const char, size> mem(buffer);
pSampleBuffer->Write(mem);
m_rdbPinWriter << pWriteSample;
}
RETURN_NOERROR;
}
Hier scheitere ich allerdings daran, das bei der Instanziierung von adtf_memory der Parameter size offenbar konstant sein muss.
Wie wäre die korrekte Lösung über die ADTF3-API?
Lösung:
Das geht mit adtf_memory_buffer:
adtf::ucom::object_ptr_locked<ISampleBuffer> pSampleBuffer; RETURN_IF_FAILED(oSample.WriteLock(pSampleBuffer, nDataSize)); return pSampleBuffer->Write(adtf::base::adtf_memory_buffer<const tVoid>(pDataPointer, nDataSize));