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));
Updated by hidden over 5 years ago
- Status changed from New to In Progress
Hallo Martin,
kannst Du bei dieser Anfrage weiterhelfen?
Updated by hidden over 5 years ago
Das geht ganz einfach mit adtf_memory_buffer:
adtf::ucom::object_ptr_locked<ISampleBuffer> pSampleBuffer; RETURN_IF_FAILED(oSample.WriteLock(pSampleBuffer, sizeof(oValue))); return pSampleBuffer->Write(adtf::base::adtf_memory_buffer<const tVoid>(pDataPointer, nDataSize));
Updated by hidden over 5 years ago
Das muss natürlich
RETURN_IF_FAILED(oSample.WriteLock(pSampleBuffer, nDataSize));
lauten.
Updated by hidden over 5 years ago
- Status changed from In Progress to Customer Feedback Required
Hallo Christian,
siehe die Kommentare von Martin.
Bitte in jeden Fall um Feedback.
Danke.
Updated by hidden over 5 years ago
Hallo Christian,
wurde deine Anfrage beantwortet?
Bitte um Feedback bis zum 05.10.2018
Danke
Updated by hidden over 5 years ago
Hallo Matthias,
Frage wurde beantwortet. Funktioniert wie gewünscht. Ticket kann geschlossen werden.
Vielen Dank!
Christian
Updated by hidden over 5 years ago
- Subject changed from Sample aus char* buffer befüllen to Fill sample from char* buffer and include buffer size
- Description updated (diff)
- Status changed from Customer Feedback Required to To Be Closed
- Resolution set to Solved Issue
Updated by hidden over 5 years ago
- Project changed from 20 to Public Support
- Status changed from To Be Closed to Closed
- Private changed from Yes to No