18 #ifndef NVDS3D_GST_NVDS3D_GST_H
19 #define NVDS3D_GST_NVDS3D_GST_H
21 #include <ds3d/common/hpp/dataloader.hpp>
22 #include <ds3d/common/hpp/datamap.hpp>
26 #include <gst/gstminiobject.h>
27 #include <gst/gstobject.h>
29 namespace ds3d {
namespace gst {
32 static gpointer
ref(gpointer p)
35 return gst_object_ref(p);
40 return gst_object_unref(p);
45 template<
class GstMiniObjDerived>
47 static GstMiniObjDerived*
ref(GstMiniObjDerived* p) {
48 return (GstMiniObjDerived*)gst_mini_object_ref(GST_MINI_OBJECT_CAST(p));
50 static void unref(GstMiniObjDerived* p) {
52 gst_mini_object_unref(GST_MINI_OBJECT_CAST(p));
57 template <
class GstObjT,
class ObjFunc>
60 std::shared_ptr<GstObjT> _gst_obj;
65 GstPtr(GstObjT* obj,
const std::string&
name =
"",
bool takeOwner =
true)
67 reset(obj, takeOwner);
76 _gst_obj = std::move(other._gst_obj);
77 _name = std::move(other._name);
82 _gst_obj = other._gst_obj;
88 _gst_obj = other._gst_obj;
93 void reset(GstObjT* obj =
nullptr,
bool takeOwner =
true)
95 GstObjT* entity = obj;
96 if (!takeOwner && obj) {
97 entity = (GstObjT*)ObjFunc::ref(obj);
99 _gst_obj.reset(entity, ObjFunc::unref);
104 GstObjT* raw =
get();
106 raw = (GstObjT*)ObjFunc::ref(raw);
110 const std::string&
name()
const {
return _name; }
112 operator GstObjT*()
const {
return get(); }
114 GstObjT*
get()
const {
return _gst_obj.get(); }
115 operator bool()
const {
return (
bool)_gst_obj; }
118 template <
class GstObj>
120 template <
class GstMiniObj>
129 PadPtr(GstPad* pad,
bool takeOwner =
true)
130 :
GstObjPtr<GstPad>(pad, (pad && (GST_PAD_NAME(pad)) ? GST_PAD_NAME(pad) :
""), takeOwner)
133 template <
typename... Args>
140 GstPadProbeType mask, GstPadProbeCallback callback, gpointer udata,
141 GDestroyNotify destroyData)
144 return gst_pad_add_probe(
get(), mask, callback, udata, destroyData);
150 gst_pad_remove_probe(
get(),
id);
156 ElePtr(GstElement* ele,
bool takeOwner =
true)
158 ele, ((ele && GST_ELEMENT_NAME(ele)) ? GST_ELEMENT_NAME(ele) :
""), takeOwner)
161 template <
typename... Args>
170 PadPtr pad(gst_element_get_static_pad(
get(), padName.c_str()),
true);
178 name().c_str(), next.
name().c_str());
184 auto srcPad = gst_element_get_static_pad(
get(),
"src");
185 auto sinkPad = gst_element_request_pad_simple(next.
get(), sinkPadName.c_str());
187 gst_pad_link(srcPad, sinkPad) == GST_PAD_LINK_OK,
ErrCode::kGst,
"link element %s[%s] to %s[%s] failed",
188 name().c_str(),
"src", next.
name().c_str(), sinkPadName.c_str());
194 elementMake(
const std::string& factoryName,
const std::string& name =
"")
196 GstElement* ele = gst_element_factory_make(factoryName.c_str(), name.c_str());
198 ele,
nullptr,
"create element: %s, name:%s failed.", factoryName.c_str(), name.c_str());
206 template <
typename... Args>
216 "add element: %s to bin: %s failed", element.
name().c_str(),
name().c_str());
217 _list.push_back(element);
225 "add element: %s to bin: %s failed", element.
name().c_str(),
name().c_str());
226 _list.push_front(element);
233 std::string lastEleName;
235 lastEleName = back.
name();
236 }
else if (!_list.empty()) {
237 lastEle = _list.back();
238 lastEleName = lastEle.
name();
240 gst::ElePtr q(gst_element_factory_make(
"queue", (lastEleName +
"_src_queue").c_str()));
244 if (lastEle &&
link) {
253 std::string firstEleName;
255 firstEleName = front.
name();
256 }
else if (!_list.empty()) {
257 firstEle = _list.front();
258 firstEleName = firstEle.
name();
260 gst::ElePtr q(gst_element_factory_make(
"queue", (firstEleName +
"_sink_queue").c_str()));
264 if (firstEle &&
link) {
272 const char* padName =
"sink";
274 if (!sinkEle && !_list.empty()) {
275 element = _list.front();
282 "Failed to add ghost sink pad into bin");
288 const char* padName =
"src";
290 if (!srcEle && !_list.empty()) {
291 element = _list.back();
298 "Failed to add ghost src pad into bin");
303 std::deque<ElePtr> _list;
308 #endif // NVDS3D_GST_NVDS3D_GST_H