EDGEMATRIX Stream Toolkit v2.1.0 was released

307 views
Skip to first unread message

ts...@edgematrix.com

unread,
Sep 28, 2021, 9:12:56 AM9/28/21
to EDGEMATRIX Stream Toolkit Forum
Hello developers,

The new version of the EDGEMATRIX Stream Toolkit was released and became available on the private APT repository. It is for the EDGEMATRIX Service v2.1.

As usual, you can update your toolkit by running the following command as described here.

/mnt/nvme/toolkit_home/bin$ ./update_toolkit.sh

This version comes with the following major enhancements.
  1. Onvif Metadata support (Events and Analytics)
  2. Relay Action
  3. VACAN Action
  4. Shared variable between callback and emcustom/empycustom
Also, the Tutorial docuemnt has been updated for this version. There were many out dated places even after the release of the Toolkit v2.0. But all of them were now up-to-date.

Please note that there is one breaking change that is not compatible to previous versions, which was introduced by 4. It is the GStreamer property called events, and which is passed to process and process_ip methods of emcustom/empycustom. So, please make sure to add events as defined in the interface definition to your implementation.

Don't forget to download and update your toolkit_home with the new toolkit_home_v2.1.0b0-1_20210928.tar.gz. It contains many fixes and updates as well as the new interface definitions.

ts...@edgematrix.com

unread,
Oct 11, 2021, 3:26:21 AM10/11/21
to EDGEMATRIX Stream Toolkit Forum
The beta version of the EDGEMATRIX Stream Toolkit v2.2.0 is on its way out. It is for the coming EDGEMATRIX Service v2.2 released in November.

It will come with many new features like the rtsp+udp stream, the cdc-acm usb sensor reading (with the rtsp+idp stream), youtube live, some improvements of emcustom, and more.

Here's an updated template, EMI Vehicle EMCustom, to illustrate a couple of improvements of EMCustom. 
  1. start/stop functions support
  2. external library support
  3. fine-grained out_meta (actually supported in v2.5.2, but not documented nor updated)
pipeline_configuration from emi_stream_config.json

    "pipeline_configuration": {
        "input": {
            "batch-size": 1,
            "width": 640,
            "height": 368
        },
        "primary": {
        },
        "dsmetatransfer": {
            "listen-to": "emi_vehicle_dcf"
        },
        "tracker": {
            "ll-config-file": "tracker_config.yml",
            "ll-lib-file": "libnvds_nvdcf.so"
        },
        "emcustom": {
            "custom-lib": "models/Secondary_AverageIntensity/libaverage_intensity.so",
            "libraries": ["models/Secondary_AverageIntensity/libmultiply.so"],
            "process-interval": 10,
            "options": {"vehicle_class_id": 0}
        },
        "overlay": {
            "display-clock": 1
        },
        "aimeta": {
            "signal-interval": 10
        }
    }

average_intensity.c

/* 
 * Copyright (C) 2020 EDGEMATRIX, Inc.
 */
#include "emcustom.h"
#include <stdio.h>
#include <json-glib/json-glib.h>
#include <multiply.h>

#define RGBA_PIXEL_WIDTH 4
#define I420_N_PLANES 3

void
start (const char *options)
{
  /* not implemented*/
  g_print ("Starting emcustom\n");
};

void
stop (const char *options)
{
 /* not implemented*/
  g_print ("Stopping emcustom\n");
};

void
process (const struct video_data *in_buffer, const char *in_meta,
          struct video_data *out_buffer, char **out_meta, const char *options, 
          const char *events, NvDsBatchMeta *batch_meta)
{
  /* Not implemented in this example */
}

/**
 * Sample out_meta
 * {'frame': [
 *   {
 *     'frame_num': 901, 
 *     'buf_pts': 30047227431,
 *     'timestamp': '2021-10-07T17:56:25.072+0900',
 *     'frame_width': 1280,
 *     'frame_height': 720,
 *     'object': [
 *       {'class_id': 0, 'object_id': -7224174170563674100, 'confidence': -0.10000000149011612, 'rect_params': {'left': 750, 'top': 11, 'width': 27, 'height': 24}, 'text_params': {'display_text': 'Car 11222569903145877516'}, 'classifier': [], 'emcustom': {'average_intensity': 77}}, 
 *       {'class_id': 0, 'object_id': -7224174170563674099, 'confidence': -0.10000000149011612, 'rect_params': {'left': 805, 'top': 0, 'width': 40, 'height': 38}, 'text_params': {'display_text': 'Car 11222569903145877517'}, 'classifier': [], 'emcustom': {'average_intensity': 97}
 *     ], 
 *     'emcustom': {'my_frame_meta': 'this is my frame meta value'}
 *   }
 * ], 
 * 'emcustom': {'my_batch_meta': 'this is my batch meta value'}}
**/
void
process_ip (struct video_data *io_buffer, const char *in_meta,
         char **out_meta, const char *options, const char *events, 
         NvDsBatchMeta *batch_meta)
{
  GError *error = NULL;
  unsigned char *in_data;
  int i, j, k, vehicle_class_id, frame_width, frame_height, multiplied;

  JsonBuilder *builder = json_builder_new ();
  JsonNode *input_node, *output_node, *options_node;
  JsonArray *in_array;
  JsonObject *in_object;

  GList *l, *object_list;
  int intensity = 0, count = 0;
  int left, top, width, height, class_id;

  /* Extract the input data, this assumes RGBA data */
  in_data = (unsigned char *) io_buffer->channels[0].data;

  /* Parsing input Meta */
  /* Frame node */
  input_node = json_from_string (in_meta, &error);
  printf ("emcustom received in_meta = %s\n", in_meta);
  frame_width = json_object_get_int_member(json_node_get_object (input_node), "frame_width");
  frame_height = json_object_get_int_member(json_node_get_object (input_node), "frame_height");
  printf ("emcustom received a frame of (%d, %d)\n", frame_width, frame_height);

  if (error) {
    printf ("ERROR in JSON parsing: %s\n", error->message);
    g_error_free (error);
    goto out;
  }

  /* Parsing Options */
  vehicle_class_id = 0;
  if (options) {
    error = NULL;
    options_node = json_from_string (options, &error);
    if (error) {
      printf ("ERROR in JSON parsing: %s\n", error->message);
      g_error_free (error);
      goto out;
    } else {
      vehicle_class_id =
          json_object_get_int_member (json_node_get_object (options_node),
          "vehicle_class_id");
    }
  }
  /* Frame Array */
  in_array =
      json_object_get_array_member (json_node_get_object (input_node), "frame");

  /* First Element in frame array */
  in_object = json_array_get_object_element (in_array, 0);
  multiplied = multiply(10, json_object_get_int_member(in_object, "frame_num"));

  /* Get object array */
  in_array = json_object_get_array_member (in_object, "object");

  /* Get object list, this is a list of JsonNode */
  object_list = json_array_get_elements (in_array);

  /* Prepare output array */

  /* Writing output to meta */
  builder = json_builder_begin_object (builder);

  /* top level object */
  json_builder_begin_object (builder);

  /* batch meta */
  json_builder_set_member_name (builder, "meta");
  json_builder_begin_object (builder);
  json_builder_set_member_name (builder, "my_batch_meta");
  json_builder_add_string_value (builder, "this is my batch meta value");
  json_builder_end_object (builder);

  /* frames */
  json_builder_set_member_name (builder, "frame");
  json_builder_begin_array (builder);

  /* frame */
  json_builder_begin_object (builder);
  /* frame meta */
  json_builder_set_member_name (builder, "meta");
  json_builder_begin_object (builder);
  json_builder_set_member_name (builder, "my_frame_meta");
  json_builder_add_int_value (builder, multiplied);
  json_builder_end_object (builder);

  /* objects */
  json_builder_set_member_name (builder, "object");
  json_builder_begin_array (builder);

  for (l = object_list; l != NULL; l = l->next) {
    in_object = json_node_get_object (l->data);

    class_id =
        json_node_get_int (json_object_get_member (in_object, "class_id"));
    /* Filter people only */
    if (class_id == vehicle_class_id) {
      in_object = json_object_get_object_member (in_object, "rect_params");

      left = json_node_get_int (json_object_get_member (in_object, "left"));
      top = json_node_get_int (json_object_get_member (in_object, "top"));
      width = json_node_get_int (json_object_get_member (in_object, "width"));
      height = json_node_get_int (json_object_get_member (in_object, "height"));

      /**
       * Running custom processing
       *
       * This function will get the average intensity for each of the
       * input rectangles.
       */
      intensity = 0;
      count = 0;
      for (j = top; j < (top + width); j++) {
        for (k = left; k < (left + height); k++) {
          for (i = 0; i < RGBA_PIXEL_WIDTH; i++) {
            intensity +=
                in_data[j * io_buffer->channels[0].stride +
                k * RGBA_PIXEL_WIDTH + i];
            count++;
          }
        }
      }
      /* object meta */
      json_builder_begin_object (builder);
      json_builder_set_member_name (builder, "average_intensity");
      json_builder_add_int_value (builder, (intensity / count));
      json_builder_end_object (builder);
    }
  }

  /* objects */
  json_builder_end_array (builder);
  /* frame */
  json_builder_end_object (builder);

  /* frames */
  json_builder_end_array (builder);

  /* top level object */
  json_builder_end_object (builder);

  output_node = json_builder_get_root (builder);

  *out_meta = json_to_string (output_node, TRUE);

  g_list_free (object_list);
  json_node_unref (output_node);
out:
  json_node_unref (input_node);
}

meson.build

example_lib_sources = [
    'average_intensity.c'
]

example_libs = [
    '-L/mnt/nvme/toolkit_home/libs/gst-emcustom/examples',
    '-lmultiply'
]

passthrough_lib_sources = [
    'passthrough.c'
]

segmentation_lib_sources = [
    'segmentation.c'
]

includes = include_directories('.', '../gst/')
library('average_intensity',
        example_lib_sources,
        c_args: c_args,
        link_args: example_libs,
        dependencies : example_deps,
        include_directories: includes
)

library('passthrough',
        passthrough_lib_sources,
        c_args: c_args,
        dependencies : example_deps,
        include_directories: includes
)

library('segmentation',
        segmentation_lib_sources,
        c_args: c_args,
        dependencies : example_deps,
        include_directories: includes
)

2021年9月28日火曜日 22:12:56 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Oct 14, 2021, 2:00:48 AM10/14/21
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com
> the cdc-acm usb sensor reading (with the rtsp+idp stream),

The next example is the rtsp + udp stream (there was a typo above). This will allow you to develop an app that works with any udp data in general. In particular, it could be forwarded through cdc-acm sensor device readings at an edge location.

emi_stream_config.json

{
  "stream_id": "udp_stream",
  "created": "2019-07-23T09:10:29.842496+09:00",
  "last_updated": "2019-07-24T10:11:30.842496+09:00",
  "revision": 1,
  "stream_type": "rtsp+udp",
  "location": "rtsp://127.0.0.1:8554/test",
  "udp_location": "127.0.0.1:3333",
  "roi": {
    "left": 0,
    "right": 0,
    "top": 0,
    "bottom": 0
  },

emi_signal_callback.py

"""
Example Signal:
{'frame': [{'frame_num': 1054, 'buf_pts': 42152906220, 'timestamp': '2021-10-08T11:37:57.599+0900', 'frame_width': 1920, 'frame_height': 1080, 'object': []}], 'emcustom': {'data': 'udp hello', 'timestamp': '2021-10-08T11:37:51.189+0900'}}
"""
def update_sensor(signal):
    """ a signal callback function """
    global last_updated_timestamp
    debug_string = ''
    events = []
    frame_list = signal["frame"]
    if "emcustom" in signal:
        emcustom = signal["emcustom"]
        if "data" in emcustom:
            data = emcustom["data"]
            last_timestamp = emcustom["timestamp"]
            # do something on data
            debug_string = debug_string + "\nreceived " + str(data)
            if last_timestamp != last_updated_timestamp:
                # there is an update
                last_updated_timestamp = last_timestamp
                event = {
                    'data': data,
                    'timestamp': last_updated_timestamp
                }
                debug_string = debug_string + "\nwill raise " + str(event)
                events.append(event)

    overlay = create_overlay(events)
    if overlay:
        signal.update({"custom-overlay": overlay})

    return events, debug_string

screen shot

udp.png

2021年10月11日月曜日 16:26:21 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Oct 15, 2021, 2:29:51 AM10/15/21
to EDGEMATRIX Stream Toolkit Forum
> youtube live

The next example is yet another output of an EDGEMATRIX Stream, which is YouTube Live. It can be easily configured as follows. 

YouTube Live is supported for any EDGEMATRIX Stream. So, as a developer, you don't need to write any code.

stream config file

{
    "stream_id": "WV-S6532L-192-168-0-11",
         ...
    "rtmp": { 
        "enabled": true, 
        "url": "rtmp://a.rtmp.youtube.com/live2/{YOUTUBE_STREAM_KEY}", 
        "bitrate": 500000, 
        "iframeinterval": 10 
    }
}

YouTube Studio

スクリーンショット 2021-10-15 15.23.09.png

2021年10月14日木曜日 15:00:48 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Oct 29, 2021, 12:22:25 AM10/29/21
to EDGEMATRIX Stream Toolkit Forum
Hello,

The beta version of the Toolkit v2.2.0 was supposed to be released in this week.

But we had to delay the release because one issue still has a problem to be resolved. I would appreciate if I could get your feedbacks.

This issue is about EMCustom. It will allow a developer to access GstBuffer not only NvDsBatchMeta as follows. It replaces NvDsBatchMeta with GstBuffer.

void process (const struct video_data *in_buffer, const char *in_meta,
    struct video_data *out_buffer, char **out_meta, const char *options,
    const char *events, GstBuffer * buffer);

void process_ip (struct video_data *io_buffer, const char *in_meta,
    char **out_meta, const char *options, const char *events,
    GstBuffer * buffer);

With this change, you will be able to:
  1. (AI Camera Integration) access EMCustomMeta to get Onvif Metadata streamed from an AI Camera such as i-PRO WV-S1536 series in order to convert them to detection meta in the NvDsBatchMeta for trackers/secondaries to seamlessly work together
  2. (IoT Sensor Integration) access EMCustomMeta to get UDP sensor data to make a complex analysis using existing libraries in EMCustom
  3. (Nested EMCustom) access EMCustomMeta to get an output from EMCustom(s) in the upstream for further post processing
Then, we found a problem to achieve this. The nvvideoconvert released from NVIDIA, which does a conversion of data type in GStreamer, removes all the elements in a GstBuffer except for NvDsBatchMeta. This is not an expected behavior as a GStreamer element, but asking for the change won't be done in the current version. So, as a workaround, we're considering two options.
  1. Change emcustom and empycustom caps to support only video/x-raw(memory:NVMM), format=NV12. Even a conversion from NVMM NV12 to RGBA will trigger this bug.
  2. Migrate emcustom meta to be part of DeepStream meta. We already do something like this in empycustom because we can't add new meta in python.
The option 1 is to pass buffer in GPU memory. So, you could do CUDA operations directly on GPU memory without bringing it back to CPU memory. You will still be able to bring a buffer to CPU memory as required. But as far as we have seen, very few developers write directly in CUDA. This will remove nvvideoconvert when emcustom is placed in a pipeline.

The option 2 is straightforward without additional benefits. The meta in empycustom is stored in batch_meta -> frame_meta_list -> user_meta_list -> event_msg_meta -> otherAttrs. We use the similar approach for emcustom as well. This will keep using nvvideoconvert when emcustom is placed in a pipeline.

Anyway, run_toolkit.sh will come with -b option that allows you to go to a beta distribution. Once this issue is clarified, not necessarily implemented depending on the complexity, the beta version will be released next week. 
  
2021年10月15日金曜日 15:29:51 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Nov 10, 2021, 1:19:50 AM11/10/21
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com
  1. Change emcustom and empycustom caps to support only video/x-raw(memory:NVMM), format=NV12. Even a conversion from NVMM NV12 to RGBA will trigger this bug.
  2. Migrate emcustom meta to be part of DeepStream meta. We already do something like this in empycustom because we can't add new meta in python.
We decided to choose the option 2. The function definitions of emcustom stays the same as announced (see below).

void process (const struct video_data *in_buffer, const char *in_meta,
    struct video_data *out_buffer, char **out_meta, const char *options,
    const char *events, GstBuffer * buffer);

void process_ip (struct video_data *io_buffer, const char *in_meta,
    char **out_meta, const char *options, const char *events,
    GstBuffer * buffer);

But the option 2 will not be included in the beta release of Toolkit v2.2 because it requires a significant amount of changes internally. The delayed beta release will be done tomorrow.

2021年10月29日金曜日 13:22:25 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Nov 11, 2021, 6:45:43 AM11/11/21
to EDGEMATRIX Stream Toolkit Forum
> The delayed beta release will be done tomorrow.

The beta version of the Toolkit v2.2.0b4 is now available.

If you are developing an app with EMCustom, upgrading to the beta version is recommended because of the changes of the function definitions as explained.

Please follow the following steps to give it a try. But note that you can not downgrade the version. So, if you have anything left to do with the stable version, please wait for the stable release. It is expected to be done by the end of this month when the EDGEMATRIX Service v2.2 will be released.

1. download the new toolkit_home for v2.2


2. extract the downloaded file to your existing /mnt/nvme/toolkit_home

3. run update_toolkit.sh as follows (-b means the beta version)

/mnt/nvme/toolkit_home/bin$ ./update_toolkit.sh -b

a local proxy is launching...
a local proxy is launching...
a local proxy is launching...
updating to beta/from/to=true/r32.4/qa
removing the old distribution
adding the new distribution
Hit:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease                                                          
Hit:2 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease                                                  
Get:3 https://apt.console.edgematrix.com/airbase/apt/debian qa InRelease [2,405 B]                                  
Get:4 https://repo.download.nvidia.com/jetson/common r32.4 InRelease [2,552 B]                                             
Get:5 https://repo.download.nvidia.com/jetson/t210 r32.4 InRelease [2,565 B]                                                      
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease                                 
Hit:7 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease                                  
Get:9 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 Packages [6,675 B]          
Hit:8 https://packagecloud.io/github/git-lfs/ubuntu bionic InRelease                                  
Fetched 14.2 kB in 3s (4,997 B/s)                  
Reading package lists... Done
Get:1 https://repo.download.nvidia.com/jetson/common r32.4 InRelease [2,552 B]
Get:2 https://apt.console.edgematrix.com/airbase/apt/debian qa InRelease [2,405 B]                          
Get:3 https://repo.download.nvidia.com/jetson/t210 r32.4 InRelease [2,565 B]                                              
Hit:5 http://ports.ubuntu.com/ubuntu-ports bionic InRelease                                                                      
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease             
Hit:7 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease    
Hit:8 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease     
Hit:4 https://packagecloud.io/github/git-lfs/ubuntu bionic InRelease     
Fetched 7,522 B in 2s (3,303 B/s)                  
Reading package lists... Done
Building dependency tree       
Reading state information... Done
295 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  edgematrix-stream emi-plugins-good libev4 libgstaimeta libgstdsmetatransfer libgstemcustom libgstwebrtcwrapper libwebsockets8
  python3-emitools
The following NEW packages will be installed:
  libev4 libwebsockets8
The following packages will be upgraded:
  edgematrix-stream emi-plugins-good libgstaimeta libgstdsmetatransfer libgstemcustom libgstwebrtcwrapper
  python3-edgematrix-stream-toolkit python3-emitools
8 upgraded, 2 newly installed, 0 to remove and 287 not upgraded.
Need to get 418 kB of archives.
After this operation, 332 kB of additional disk space will be used.
Get:1 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 libgstemcustom arm64 0.5.1-1 [15.2 kB]
Get:2 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 libgstaimeta arm64 0.7.0-1 [12.5 kB]
Get:3 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 libgstwebrtcwrapper arm64 0.9.2-1 [89.1 kB]
Get:4 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 libgstdsmetatransfer arm64 0.4.2-1 [8,612 B]
Get:5 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 emi-plugins-good arm64 1.14.7-8 [81.9 kB]
Get:6 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 edgematrix-stream arm64 2.6.4-1 [65.2 kB]
Get:7 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 python3-emitools all 1.0.11b2-1 [18.7 kB]
Get:8 https://apt.console.edgematrix.com/airbase/apt/debian qa/main arm64 python3-edgematrix-stream-toolkit all 2.2.0b4-2 [41.4 kB]
Get:9 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libev4 arm64 1:4.22-1 [22.3 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libwebsockets8 arm64 2.0.3-3build1 [63.2 kB]
Fetched 418 kB in 2s (264 kB/s)           
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 146948 files and directories currently installed.)
Preparing to unpack .../0-libgstemcustom_0.5.1-1_arm64.deb ...
Unpacking libgstemcustom:arm64 (0.5.1-1) over (0.4.0-1) ...
Preparing to unpack .../1-libgstaimeta_0.7.0-1_arm64.deb ...
Unpacking libgstaimeta:arm64 (0.7.0-1) over (0.6.1-1) ...
Selecting previously unselected package libev4.
Preparing to unpack .../2-libev4_1%3a4.22-1_arm64.deb ...
Unpacking libev4 (1:4.22-1) ...
Selecting previously unselected package libwebsockets8:arm64.
Preparing to unpack .../3-libwebsockets8_2.0.3-3build1_arm64.deb ...
Unpacking libwebsockets8:arm64 (2.0.3-3build1) ...
Preparing to unpack .../4-libgstwebrtcwrapper_0.9.2-1_arm64.deb ...
Unpacking libgstwebrtcwrapper:arm64 (0.9.2-1) over (0.9.1-1) ...
Preparing to unpack .../5-libgstdsmetatransfer_0.4.2-1_arm64.deb ...
Unpacking libgstdsmetatransfer:arm64 (0.4.2-1) over (0.4.0-1) ...
Preparing to unpack .../6-emi-plugins-good_1.14.7-8_arm64.deb ...
Unpacking emi-plugins-good (1.14.7-8) over (1.14.7-7) ...
Preparing to unpack .../7-edgematrix-stream_2.6.4-1_arm64.deb ...
Unpacking edgematrix-stream (2.6.4-1) over (2.5.2-1) ...
Preparing to unpack .../8-python3-emitools_1.0.11b2-1_all.deb ...
prerms: case:upgrade
stopping SUB502 server...
stopped USB502 server
Unpacking python3-emitools (1.0.11b2-1) over (1.0.9b3-1) ...
Preparing to unpack .../9-python3-edgematrix-stream-toolkit_2.2.0b4-2_all.deb ...
Unpacking python3-edgematrix-stream-toolkit (2.2.0b4-2) over (2.1.0b0-1) ...
Setting up libev4 (1:4.22-1) ...
Setting up libwebsockets8:arm64 (2.0.3-3build1) ...
Setting up python3-emitools (1.0.11b2-1) ...
postinst: case:configure
installing sudo user name/group: nvidia/nvidia
found /usr/bin/runusb502command in sudo list

# Allow members of group sudo to use /usr/bin/runcdcacmserver without a password
%sudo ALL=(ALL) NOPASSWD: /usr/bin/runcdcacmserver
Setting up emi-plugins-good (1.14.7-8) ...
Setting up libgstwebrtcwrapper:arm64 (0.9.2-1) ...
Setting up libgstemcustom:arm64 (0.5.1-1) ...
running install
running build
running build_py
running install_lib
running install_egg_info
Removing /usr/local/lib/python3.6/dist-packages/pyds-1.0.1.egg-info
Writing /usr/local/lib/python3.6/dist-packages/pyds-1.0.1.egg-info
Setting up libgstdsmetatransfer:arm64 (0.4.2-1) ...
Setting up libgstaimeta:arm64 (0.7.0-1) ...
Setting up edgematrix-stream (2.6.4-1) ...
Setting up python3-edgematrix-stream-toolkit (2.2.0b4-2) ...
Processing triggers for libc-bin (2.27-3ubuntu1.2) ...
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 287 not upgraded.

4. run an app using emcustom out of templates (e.g. EMI Vehicle PrePost EMCustom)

Please note that EMI Vehicle EMCustom is a more advanced example, but which should be run after its parent app (EMI Vehicle Counter) gets launched.

5. updated to the stable distribution after the stable version becomes available (no -b)

/mnt/nvme/toolkit_home/bin$ ./update_toolkit.sh

2021年11月10日水曜日 15:19:50 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Feb 15, 2022, 7:58:26 PM2/15/22
to EDGEMATRIX Stream Toolkit Forum
The v2.2 beta was released as a stable version with a little fix* as v2.2.1b0 on the production repository.

So, please update your toolkit as instructed below. The beta version will be updated for v2.3 soon.

> 5. updated to the stable distribution after the stable version becomes available (no -b)
> /mnt/nvme/toolkit_home/bin$ ./update_toolkit.sh

* A test-launch binary is now correctly called based on a type of platform(arm64, amd64)

2021年11月11日木曜日 20:45:43 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Mar 7, 2022, 4:03:51 AM3/7/22
to EDGEMATRIX Stream Toolkit Forum
The document of the Toolkit will be updated when v2.3 is released at the end of March.

Until then, please refer to this thread about updates.

2022年2月16日水曜日 9:58:26 UTC+9 ts...@edgematrix.com:
Reply all
Reply to author
Forward
0 new messages