Hi,
I am using DeepStream 6.3, and I tried to build an extension. However, I encountered an error. Could you please help me resolve this issue?
Thank you!
ORUS-ELITE-V2:~/Downloads/test4/test4/extensions$ bazel build …
Starting local Bazel server and connecting to it…
INFO: Analyzed 2 targets (44 packages loaded, 474 targets configured).
INFO: Found 2 targets…
ERROR: /home/anavid-server/Downloads/test4/test4/extensions/test4/BUILD:7:19: Compiling extensions/test4/HelloWorld.cpp failed: (Exit 1): g+±9 failed: error executing command (from target //extensions/test4:libgxf_test4.so) /usr/bin/g+±9 -MD -MF bazel-out/k8-opt/bin/extensions/test4/_objs/libgxf_test4.so/HelloWorld.d ‘-frandom-seed=bazel-out/k8-opt/bin/extensions/test4/_objs/libgxf_test4.so/HelloWorld.o’ … (remaining 50 arguments skipped)
Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
extensions/test4/HelloWorld.cpp:4:10: fatal error: extensions/nvdsbase/nvds_probe_connector.hpp: No such file or directory
4 | include “extensions/nvdsbase/nvds_probe_connector.hpp”
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
INFO: Elapsed time: 7.620s, Critical Path: 1.43s
INFO: 116 processes: 98 internal, 17 linux-sandbox, 1 local.
FAILED: Build did NOT complete successfully
include “HelloWorld.hpp” // NOLINT
include “extensions/nvdsbase/nvds_probe_connector.hpp”
include “extensions/nvdsinterface/interfaces.hpp”
include “nvdsmeta.h”
include “nvds_obj_meta.h”
include “nvds_batch_meta.h”
include “nvds_video_meta.h”
namespace nvidia {
namespace deepstream {
class NvDsSampleInPlaceDataHandler : public INvDsInPlaceDataHandler {
nvidia::gxf::Parameter<nvidia::gxf::Handle> probe_connector_;
gxf_result_t registerInterface(nvidia::gxf::Registrar *registrar) {
gxf_result_t result = GXF_SUCCESS;
// Enregistrer le paramètre probe_connector_ (connecteur de probe)
result &= registrar->parameter(
probe_connector_, “probe-connector”, “Probe Connector”,
“Handle to a nvidia::deepstream::NvDsProbeConnector component”,
std::nullopt, GXF_PARAMETER_FLAGS_OPTIONAL);
return result;
}
gxf_result_t initialize() override {
gxf_result_t result = GXF_SUCCESS;
if (probe_connector_.try_get() != std::nullopt) {
probe_connector_.try_get().value()->set_handler(this);
probe_connector_.try_get().value()->set_flags(static_cast<NvDsProbeFlags>(
NvDsProbeFlags::BUFFER | NvDsProbeFlags::EVENT));
}
return result;
}
bool handle_buffer(GstPad *pad, nvidia::gxf::Entity buffer_data) override {
// Vérifier la présence de NvDsBatchMeta et NvBufSurface dans le buffer_data
if (!buffer_data.get(BUF_DATA_KEY_VIDEO_BATCH_META)) {
return true;
}
if (!buffer_data.get(BUF_DATA_KEY_NVBUFSURFACE)) {
return true;
}
// Extraire les métadonnées du lot (batch)
NvDsBatchMeta *batch_meta =
*(buffer_data.get<NvDsBatchMetaHandle>(BUF_DATA_KEY_VIDEO_BATCH_META).value());
// Parcourir les frames du lot
NvDsMetaList *l_frame = nullptr;
for (l_frame = batch_meta->frame_meta_list; l_frame != nullptr; l_frame = l_frame->next) {
NvDsFrameMeta *frame_meta = (NvDsFrameMeta *)(l_frame->data);
// Parcourir les objets détectés dans chaque frame
NvDsMetaList *l_obj = nullptr;
for (l_obj = frame_meta->obj_meta_list; l_obj != nullptr; l_obj = l_obj->next) {
NvDsObjectMeta *obj_meta = (NvDsObjectMeta *)(l_obj->data);
// Vérifier si l'objet est une personne
if (obj_meta->unique_component_id == PERSON_COMPONENT_ID) { // Remplacer PERSON_CLASS_ID par l'ID de classe approprié
uint64_t tracking_id = obj_meta->object_id;
// Accéder aux résultats de classification (âge, genre)
const gchar *age_label = nullptr;
const gchar *gender_label = nullptr;
NvDsClassifierMeta *classifier_meta = nullptr;
NvDsMetaList *l_classifier = nullptr;
for (l_classifier = obj_meta->classifier_meta_list; l_classifier != nullptr; l_classifier = l_classifier->next) {
classifier_meta = (NvDsClassifierMeta *)(l_classifier->data);
// Extraire les informations de classification
if (classifier_meta->unique_component_id == AGE_COMPONENT_ID) {
age_label = classifier_meta->label_info_list->data->result_label;
} else if (classifier_meta->unique_component_id == GENDER_COMPONENT_ID) {
gender_label = classifier_meta->label_info_list->data->result_label;
}
}
// Organiser les métadonnées dans un format spécifique
std::cout << "{ \"person\": [ { \"id-tracking\": " << tracking_id
<< ", \"age\": \"" << (age_label ? age_label : "unknown")
<< "\", \"gender\": \"" << (gender_label ? gender_label : "unknown")
<< "\" } ] }" << std::endl;
}
}
}
return true; // Permet de laisser passer le buffer
}
bool handle_event(GstPad *pad, GstEvent *event) override {
// Traitez les événements ici si nécessaire
return true; // Permet de laisser passer l’événement
}
};
} // namespace deepstream
} // namespace nvidia
----------------------------------------------------------------------------.hpp------------------------------------------
#pragma once
include “gxf/std/codelet.hpp”
namespace sample {
namespace test4 {
// Logs a message in start() and tick()
class HelloWorld : public nvidia::gxf::Codelet {
public:
gxf_result_t start() override;
gxf_result_t tick() override;
gxf_result_t stop() override { return GXF_SUCCESS; }
};
} // namespace test4
} // namespace sample