[aravis] Aravis lib & circular buffer

  • From: Arkadiusz Raj <arek.raj@xxxxxxxxx>
  • To: aravis@xxxxxxxxxxxxx
  • Date: Sun, 1 Apr 2018 13:39:35 +0200

Hello,

I am using Aravis library for over 2 years now In my project, which is
about to ready data from camera (of course) detect some movement and then
dump not only frames we are interested in but also some pre & post ones.

I am using OpenCV for image analysis, hence have vector of Mat objects for
my circular buffer.
But this approach intensifies data copy, usually unnecessary ones. I.e.
from camera to internal Aravis Buffer, to local OpenCV buffer and finally
to my circular buffer.

I started to think that while constructing circular buffer, I can
preallocate memory for OpenCV Mat objects, and pass this to Aravis using

auto  payload = arv_camera_get_payload (camera);
for(auto& p : fb) {
            // allocate Mat structure (without diamensions)
            p.image() = Mat::zeros(Size(1,payload), CV_8UC1);
            // register buffer in Aravis
            arv_stream_push_buffer(stream, arv_buffer_new(payload,
p.image().data));
}

Where p.image() is a Mat.

Now my question is: will this work?

I.e. how Aravis handles buffers? Can I assume they will be used in circular
manner?
Those questions are about Glib async queues indeed.

When waiting for next frames, following code is executed:

for(; tries < max_tries; tries ++) {
            arv_buffer = arv_stream_timeout_pop_buffer (stream, 200000);
            if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) !=
ARV_BUFFER_STATUS_SUCCESS) {
                arv_stream_push_buffer (stream, arv_buffer);
            } else break;
}

Which may be understand that if frame is available, the buffer is moved to
the end of queue.

Kind regards

Arkadiusz Raj

Other related posts: