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 #1

Updated by hidden over 5 years ago

  • Topic set to ADTF::Common
Actions #2

Updated by hidden over 5 years ago

  • Status changed from New to In Progress

Hallo Martin,

kannst Du bei dieser Anfrage weiterhelfen?

Actions #3

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));
Actions #4

Updated by hidden over 5 years ago

Das muss natürlich

RETURN_IF_FAILED(oSample.WriteLock(pSampleBuffer, nDataSize));

lauten.

Actions #5

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.

Actions #6

Updated by hidden over 5 years ago

Hallo Christian,

wurde deine Anfrage beantwortet?
Bitte um Feedback bis zum 05.10.2018

Danke

Actions #7

Updated by hidden over 5 years ago

Hallo Matthias,

Frage wurde beantwortet. Funktioniert wie gewünscht. Ticket kann geschlossen werden.
Vielen Dank!

Christian

Actions #8

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
Actions #9

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
Actions

Also available in: Atom PDF