14 #ifndef NVDS3D_GST_GST_PLUGINS_H
15 #define NVDS3D_GST_GST_PLUGINS_H
17 #include <ds3d/common/func_utils.h>
18 #include <ds3d/common/config.h>
19 #include <gst/app/gstappsink.h>
20 #include <gst/app/gstappsrc.h>
22 #include <ds3d/common/hpp/obj.hpp>
23 #include <ds3d/common/hpp/dataloader.hpp>
24 #include <ds3d/common/hpp/datarender.hpp>
25 #include <ds3d/common/hpp/datafilter.hpp>
26 #include <ds3d/common/hpp/yaml_config.hpp>
28 #include <ds3d/gst/custom_lib_factory.h>
29 #include <ds3d/gst/nvds3d_gst_ptr.h>
30 #include <ds3d/gst/nvds3d_meta.h>
35 struct DataProcessUserData {
54 namespace ds3d {
namespace gst {
56 template<
class GuardProcess>
57 struct DataProcessInfo {
60 config::ComponentConfig
config;
76 template <
class GuardProcess>
82 using abiRefType =
typename GuardProcess::abiRefType;
85 GuardProcess processor;
86 processor.reset(customLib->CreateCtx<abiRefType>(
94 uData->customlib = customLib.get();
96 uData->configPath = compConfig.
filePath;
97 processor.setUserData(uData.get(), [holder = customLib, uData = uData](
void*)
mutable {
99 if (holder && holder.use_count() == 1) {
100 holder->keepOpen(true);
104 customProcessor = std::move(processor);
105 lib = std::move(customLib);
120 const config::ComponentConfig& compConfig,
DataLoaderSrc& loaderSrc,
bool start)
122 GuardDataLoader loader;
125 "load custom dataloader failed");
127 loaderSrc.config = compConfig;
128 loaderSrc.customProcessor = loader;
129 ElePtr loaderEle =
elementMake(
"appsrc", compConfig.name);
132 loaderSrc.gstElement = loaderEle;
135 constexpr
static size_t kPoolSize = 6;
136 std::string caps = compConfig.gstOutCaps.empty() ? loader.getOutputCaps()
137 : compConfig.gstOutCaps;
139 !caps.empty(),
ErrCode::kConfig,
"caps must be configure for dataloader source");
140 CapsPtr srcCaps(gst_caps_from_string(caps.c_str()));
143 G_OBJECT(loaderEle.get()),
"do-timestamp", TRUE,
"stream-type", GST_APP_STREAM_TYPE_STREAM,
144 "max-bytes", (uint64_t)(kPoolSize *
sizeof(
NvDs3DBuffer)),
"min-percent", 80,
"caps",
145 srcCaps.get(), NULL);
149 "Dataloader start config: %s failed", compConfig.filePath.c_str());
152 GstAppSrc* appSrc = GST_APP_SRC(loaderEle.get());
156 "Set dataloader into GstAppsrc failed.");
163 const config::ComponentConfig& compConfig,
DataRenderSink& renderSink,
bool start)
165 GuardDataRender render;
168 "load custom datarender failed");
170 renderSink.config = compConfig;
171 renderSink.customProcessor = render;
172 ElePtr renderEle =
elementMake(
"appsink", compConfig.name);
175 renderSink.gstElement = renderEle;
178 uint32_t maxBuffers = 4;
179 std::string caps = compConfig.gstInCaps.empty() ? render.getInputCaps()
180 : compConfig.gstInCaps;
182 !caps.empty(),
ErrCode::kConfig,
"caps must be configure for datarender source");
183 CapsPtr sinkCaps(gst_caps_from_string(caps.c_str()));
185 GObject* eleObj = G_OBJECT(renderEle.get());
187 eleObj,
"wait-on-eos", TRUE,
"max-buffers", (uint32_t)maxBuffers,
"caps", sinkCaps.get(),
190 auto setGstProperties = [eleObj, &compConfig]() {
191 YAML::Node node = YAML::Load(compConfig.rawContent);
192 auto properties = node[
"gst_properties"];
194 auto sync = properties[
"sync"];
195 auto async = properties[
"async"];
196 auto drop = properties[
"drop"];
198 g_object_set(eleObj,
"sync", sync.as<
bool>(),
nullptr);
201 g_object_set(eleObj,
"async", async.as<
bool>(),
nullptr);
204 g_object_set(eleObj,
"drop", drop.as<
bool>(),
nullptr);
214 "Dataloader start config: %s failed", compConfig.filePath.c_str());
217 GstAppSink* appSink = GST_APP_SINK(renderEle.get());
221 "Set datarender into GstAppSink failed.");
228 #endif // NVDS3D_GST_GST_PLUGINS_H