ADTF  3.18.2
Source Code for Demo Substream Generator Plugin
Location
./src/examples/src/adtf/filters/standard_filters/substream_generator_filter/
Namespace for entire ADTF SDK.
Build Environment
To see how to set up the build environment have a look at ADTF CMake Environment
this implementation shows:
Implementation
using namespace adtf::base;
using namespace adtf::filter;
using namespace adtf::mediadescription;
using namespace adtf::streaming;
using namespace adtf::ucom;
using namespace adtf::util;
using namespace ddl;
class cDemoSubStreamGenerator: public cFilter
{
public:
ADTF_CLASS_ID_NAME(cDemoSubStreamGenerator,
"demo_substream_generator.filter.adtf.cid",
"Demo Substream Generator");
public:
// this structure is the template for the definition of substream "stream4"
struct tExampleStructWithUnit { uint32_t val{}; };
cDemoSubStreamGenerator()
{
// sets a short description for the component
SetDescription("Use this filter to generate data of multiple substreams whenever a timer triggers.");
// set help link to jump to documentation from ADTF Configuration Editor
SetHelpLink("$(ADTF_DIR)/doc/adtf_html/page_demo_substream_generator.html");
CreateRunner("generate_samples");
SetDescription("generate_samples", "Runner to periodically trigger the function which generates the substreams.");
// we create the definition of substream "stream 4" by using the DDL type reflection of ADTF
auto oExampleStructDefinition = structure<tExampleStructWithUnit>("tExampleStructWithUnit").Add("val", &tExampleStructWithUnit::val);
oExampleStructDefinition.setElementUnit("val", ddl::BaseUnit<ddl::unit::Kelvin>());
// we use the helper class cSubStreamTypes to generate a stream type with the
// adtf::streaming::stream_meta_type_substreams meta type that contains
// multiple stream type definitions.
cSubStreamTypes oSubStreams;
oSubStreams.SetSubStream("stream1", 0, stream_type_plain<uint32_t>());
oSubStreams.SetSubStream("stream2", 1, stream_type_plain<uint32_t>());
oSubStreams.SetSubStream("stream3", 2, stream_type_plain<uint32_t>());
oSubStreams.SetSubStream("stream4", 3, oExampleStructDefinition);
m_pWriter = CreateOutputPin("output", oSubStreams);
SetDescription("output", "Provides the generated substreams.");
}
tResult Process(tNanoSeconds tmTrigger, IRunner* /*pRunner*/) override
{
++m_nTriggerCounter;
for (uint32_t nSubStreamId: {0, 1, 2})
{
// when generating samples we set the substream id.
// in this case we just pass it to the output_sample_data constructor.
// Otherwise take a look at adtf::streaming::set_sample_substream_id() and
// adtf::streaming::hollow::ISample::SetSubStreamId().
output_sample_data<uint32_t> oNewData(tmTrigger, m_nTriggerCounter + (nSubStreamId * 1000), nSubStreamId);
m_pWriter->Write(oNewData.Release());
}
// we create a sample containing the time, value and substream id
// the value is copied into the sample buffer in this process
output_sample_data<tExampleStructWithUnit> oExampleOutputSampleData(tmTrigger, tExampleStructWithUnit{m_nTriggerCounter + (3 /*substreamId*/ * 1000)}, 3);
m_pWriter->Write(oExampleOutputSampleData.Release());
}
private:
ISampleWriter* m_pWriter = nullptr;
uint32_t m_nTriggerCounter = 0;
};
// this creates the plugin entry methods and class factories
ADTF_PLUGIN("Demo Substream Generator Plugin", cDemoSubStreamGenerator);
#define ADTF_PLUGIN(__plugin_identifier,...)
The ADTF Plugin Macro will add the code of a adtf::ucom::ant::IPlugin implementation.
Definition: adtf_plugin.h:22
Copyright © Audi Electronics Venture GmbH.
#define RETURN_NOERROR
Return status ERR_NOERROR, which requires the calling function's return type to be tResult.
#define ADTF_CLASS_ID_NAME(_class, _strcid, _strclabel)
Common macro to enable correct treatment of class identifier AND Class Name by IClassInfo.
Definition: class_id.h:33
Namespace for the ADTF Base SDK.
Namespace for the ADTF Filter SDK.
Namespace for the ADTF Media Description SDK.
Namespace for the ADTF Streaming SDK.
Namespace for the ADTF uCOM3 SDK.
alias namespace for the A_UTILS Library.
Generator template to create baseunits.