14 #ifndef NVDS3D_GST_NVDS3D_GST_H
15 #define NVDS3D_GST_NVDS3D_GST_H
22 #include <gst/gstminiobject.h>
23 #include <gst/gstobject.h>
25 namespace ds3d {
namespace gst {
28 static gpointer
ref(gpointer p)
31 return gst_object_ref(p);
36 return gst_object_unref(p);
41 template<
class GstMiniObjDerived>
43 static GstMiniObjDerived*
ref(GstMiniObjDerived* p) {
44 return (GstMiniObjDerived*)gst_mini_object_ref(GST_MINI_OBJECT_CAST(p));
46 static void unref(GstMiniObjDerived* p) {
48 gst_mini_object_unref(GST_MINI_OBJECT_CAST(p));
53 template <
class GstObjT,
class ObjFunc>
56 std::shared_ptr<GstObjT> _gst_obj;
61 GstPtr(GstObjT* obj,
const std::string&
name =
"",
bool takeOwner =
true)
63 reset(obj, takeOwner);
72 _gst_obj = std::move(other._gst_obj);
73 _name = std::move(other._name);
78 _gst_obj = other._gst_obj;
84 _gst_obj = other._gst_obj;
89 void reset(GstObjT* obj =
nullptr,
bool takeOwner =
true)
91 GstObjT* entity = obj;
92 if (!takeOwner && obj) {
93 entity = (GstObjT*)ObjFunc::ref(obj);
95 _gst_obj.reset(entity, ObjFunc::unref);
100 GstObjT* raw =
get();
102 raw = (GstObjT*)ObjFunc::ref(raw);
106 const std::string&
name()
const {
return _name; }
108 operator GstObjT*()
const {
return get(); }
110 GstObjT*
get()
const {
return _gst_obj.get(); }
111 operator bool()
const {
return (
bool)_gst_obj; }
114 template <
class GstObj>
116 template <
class GstMiniObj>
125 PadPtr(GstPad* pad,
bool takeOwner =
true)
126 :
GstObjPtr<GstPad>(pad, (pad && (GST_PAD_NAME(pad)) ? GST_PAD_NAME(pad) :
""), takeOwner)
129 template <
typename... Args>
136 GstPadProbeType mask, GstPadProbeCallback callback, gpointer udata,
137 GDestroyNotify destroyData)
140 return gst_pad_add_probe(
get(), mask, callback, udata, destroyData);
146 gst_pad_remove_probe(
get(),
id);
152 ElePtr(GstElement* ele,
bool takeOwner =
true)
154 ele, ((ele && GST_ELEMENT_NAME(ele)) ? GST_ELEMENT_NAME(ele) :
""), takeOwner)
157 template <
typename... Args>
166 PadPtr pad(gst_element_get_static_pad(
get(), padName.c_str()),
true);
174 name().c_str(), next.
name().c_str());
180 auto srcPad = gst_element_get_static_pad(
get(),
"src");
181 auto sinkPad = gst_element_request_pad_simple(next.
get(), sinkPadName.c_str());
183 gst_pad_link(srcPad, sinkPad) == GST_PAD_LINK_OK,
ErrCode::kGst,
"link element %s[%s] to %s[%s] failed",
184 name().c_str(),
"src", next.
name().c_str(), sinkPadName.c_str());
190 elementMake(
const std::string& factoryName,
const std::string& name =
"")
192 GstElement* ele = gst_element_factory_make(factoryName.c_str(), name.c_str());
194 ele,
nullptr,
"create element: %s, name:%s failed.", factoryName.c_str(), name.c_str());
202 template <
typename... Args>
212 "add element: %s to bin: %s failed", element.
name().c_str(),
name().c_str());
213 _list.push_back(element);
221 "add element: %s to bin: %s failed", element.
name().c_str(),
name().c_str());
222 _list.push_front(element);
229 std::string lastEleName;
231 lastEleName = back.
name();
232 }
else if (!_list.empty()) {
233 lastEle = _list.back();
234 lastEleName = lastEle.
name();
236 gst::ElePtr q(gst_element_factory_make(
"queue", (lastEleName +
"_src_queue").c_str()));
240 if (lastEle &&
link) {
249 std::string firstEleName;
251 firstEleName = front.
name();
252 }
else if (!_list.empty()) {
253 firstEle = _list.front();
254 firstEleName = firstEle.
name();
256 gst::ElePtr q(gst_element_factory_make(
"queue", (firstEleName +
"_sink_queue").c_str()));
260 if (firstEle &&
link) {
268 const char* padName =
"sink";
270 if (!sinkEle && !_list.empty()) {
271 element = _list.front();
278 "Failed to add ghost sink pad into bin");
284 const char* padName =
"src";
286 if (!srcEle && !_list.empty()) {
287 element = _list.back();
294 "Failed to add ghost src pad into bin");
299 std::deque<ElePtr> _list;
304 #endif // NVDS3D_GST_NVDS3D_GST_H