Streaming API

Streaming and decoding can be controlled via the two main API of our SDK: HAL and SDK Stream.

Using HAL C++ API

Streaming events can be done using the HAL module with the I_EventsStream facility which exposes functions to start and stop the streaming as well as getting the raw events stream from the camera. An example can be seen in metavision_hal_showcase sample. Here we show the main statements related to the event stream:

Metavision::I_EventsStream *i_eventsstream = device->get_facility<Metavision::I_EventsStream>();
(...)
i_eventsstream->start();
(...)
while (!stop_decoding) {
    short ret = i_eventsstream->poll_buffer();
    if (ret < 0) {
        i_eventsstream->stop();
        uint8_t *raw_data = i_eventsstream->get_latest_raw_data(n_bytes);
        // do something with the data

To decode the raw events stream, the I_Decoder facility is provided in the HAL module. It offers functions to decode raw buffers into decoded event buffers, which are provided via C++ callbacks registered onto the I_EventDecoder facility. Like for streaming, an example can be seen in metavision_hal_showcase sample. Here we show the main statements related to the event decoding:

Metavision::I_EventDecoder<Metavision::EventCD> *i_cddecoder =
device->get_facility<Metavision::I_EventDecoder<Metavision::EventCD>>();
(...)
if (i_cddecoder) {
    // Register a lambda function to be called on every CD events
    i_cddecoder->add_event_buffer_callback(
        [&any_function](const Metavision::EventCD *begin, const Metavision::EventCD *end) {
            any_function.process_events(begin, end);
        });
}
(...)
Metavision::I_Decoder *i_decoder = device->get_facility<Metavision::I_Decoder>();
while (!stop_decoding) {
        // fetch the data with the event stream
        // then decode the data
        i_decoder->decode(raw_data, raw_data + n_bytes);

Note that in addition to CD events, HAL API can also decode the External Trigger events (see documentation on Accessing External Trigger Events) as shown in metavision_hal_showcase sample.

Note

This HAL API is also available in Python and shown in the metavision_hal_get_started Python sample. Though, if you want to stream and decode events in Python, it might be easier to leverage the EventsIterator presented in the sample Get Started with Python.

Using SDK Stream C++ API

the SDK Stream module provides a higher level Camera class built on the top of the HAL API. With this class, you only have to manage a camera object that you will have to start() and stop() without worrying about the management of the event stream. To get the event, you will register some callbacks on the events that will be automatically decoded for you. An example is shown in the sample Get Started with C++. Here we show the main statements related to the streaming:

cam = Metavision::Camera::from_first_available();
(...)
cam.cd().add_callback([&my_function](const Metavision::EventCD *ev_begin, const Metavision::EventCD *ev_end) {
    my_function.analyze_events(ev_begin, ev_end);
});
(...)
    cam.start();
    // loop until a stopping condition is met
cam.stop();

Note

The SDK Stream API is also available in Python, though, if you want to stream and decode events in Python, it might be easier to leverage the EventsIterator presented in the sample Get Started with Python.