Project

General

Profile

Actions

Support Request #4306

closed

Fill sample from char* buffer and include buffer size

Added by hidden over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Customer:
VW
Department:
CARMEQ
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
Solved Issue
Product Issue Numbers:
Affected Products:
Platform:
Windows 10 64bit
Topic:
ADTF::Common
FAQ Links:

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));

Actions

Also available in: Atom PDF