Issue while building extension in DeepStream 6.3

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

The header file should be downloaded manually. Even after the header file is downloaded, there is no DeepStream extension library downloadable. It is not supported to build the customized DeepStream extension now.

As I have put in Metadata Not Saved in Redis: Issue with Custom Graph Execution. Currently only GXF extension customization is supported.

I used the following command to generate a codelet:
python3 /opt/nvidia/graph-composer/extension-dev/generate_codelet.py
–output_dir /home/anavid-server/kk
–extn_name amine
–codelet_name codelet_name_amine

After that, I installed the NvDsInterfaceExt extension using these commands:
registry extn import interface -n NvDsInterfaceExt -s 1.3.0 -d extensions
registry extn import interface -n NvDsBaseExt -s 1.4.0 -d extensions

However, I encountered an issue while using this code. Could you please assist me in resolving the problem?

----------------------------------error------------------------------------------------------------------------------------------------------------

E-V2:~/kk/amine/extensions$ bazel build …
INFO: Analyzed 2 targets (0 packages loaded, 0 targets configured).
INFO: Found 2 targets…
ERROR: /home/anavid-server/kk/amine/extensions/amine/BUILD:7:19: Compiling extensions/amine/codelet_name_amine.cpp failed: (Exit 1): g+±9 failed: error executing command (from target //extensions/amine:libgxf_amine.so) /usr/bin/g+±9 -MD -MF bazel-out/k8-opt/bin/extensions/amine/_objs/libgxf_amine.so/codelet_name_amine.d ‘-frandom-seed=bazel-out/k8-opt/bin/extensions/amine/_objs/libgxf_amine.so/codelet_name_amine.o’ … (remaining 50 arguments skipped)

Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
In file included from extensions/amine/codelet_name_amine.cpp:4:
/home/anavid-server/kk/amine/extensions/nvds_probe_connector/nvds_probe_connector.hpp:21:10: fatal error: nvdsinterface/interfaces.hpp: No such file or directory
21 | include “nvdsinterface/interfaces.hpp”
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
INFO: Elapsed time: 0.339s, Critical Path: 0.27s
INFO: 17 processes: 17 internal.
FAILED: Build did NOT complete successfully

------------------------------------------codelet_name_amine.cpp-----------------------------------------------------------------------------------------------

include “codelet_name_amine.hpp” // NOLINT

include “/home/anavid-server/kk/amine/extensions/nvds_probe_connector/nvds_probe_connector.hpp”
include “/home/anavid-server/kk/amine/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

The header file should be downloaded with NvDsInterfaceExt.

Duplicate with Metadata Not Saved in Redis: Issue with Custom Graph Execution - Intelligent Video Analytics / DeepStream SDK - NVIDIA Developer Forums.

Hi @Fiona.Chen ,
I am currently working with the INvDsInPlaceDataHandler class but have encountered an issue. I get errors indicating that the following two packages were not found when I try to execute: include “extensions/nvdsbase/nvds_probe_connector.hpp”

include “extensions/nvdsinterface/interfaces.hpp”

|____third party

|____WORKSPACE

 |____.bazelrc

 |____apps

          | |____app.yaml

 |____extensions
      | |____nvdsinterface
             | |____interfaces.hpp

      | |____nvdsbase
             | |____nvds_probe_connector.hpp

      | |____test

           | | |____BUILD

           | | |____HelloWorld.hpp

           | | |____test.cpp

           | | |____HelloWorld.cpp

I tried placing the missing packages inside the extensions folder (which is at the same level as WORKSPACE and apps), but I am still encountering the same issue.

Could you please advise on how to resolve this?

https://docs.nvidia.com/metropolis/deepstream/6.3/dev-guide/text/DS_Zero_Coding_Developing_Extension.html#implementation-of-invdsinplacedatahandler

This topic is duplicated with Metadata Not Saved in Redis: Issue with Custom Graph Execution - Intelligent Video Analytics / DeepStream SDK - NVIDIA Developer Forums? Which one do you want to keep open for discussion? We need to close one of them.

Hi @Fiona.Chen , I have closed the other topic; please continue with this one.

How can I resolve this issue?

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.