Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wip/destroyfuncs #976

Merged
merged 3 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/reference/aravis/porting-0.10.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@ Title: Porting to Aravis 0.10

### Porting to Aravis 0.10

The 0.10 stable series breaks some APIs. Like every stable series, it is
parallel installable with the previous ones.

In most case it is possible to make your code compilable against different
stable versions, by using version checks. For example:

```C
#if ARAVIS_CHECK_VERSION(0,10,0)
stream = arv_camera_create_stream (test_camera->camera,
stream_calback, &callback_data, NULL,
&error);
#else
stream = arv_camera_create_stream (test_camera->camera,
stream_calback, &callback_data,
&error);
#endif
```

#### Acquisition control

`arv_stream_start_thread()` and `arv_stream_stop_thread()` functions have been
Expand Down Expand Up @@ -29,3 +47,10 @@ function, which creates interface native buffers if possible.
[[email protected]_n_owned_buffers] to better reflect what it does, and
has a third out parameter returning the number of buffer owned by the stream
receiving thread.

#### arv_camera_create_stream, arv_device_create_stream and arv_fake_camera_set_fill_pattern

[[email protected]_stream], [[email protected]_stream] and
[[email protected]_fill_pattern] take an additional GDestroyNotify
parameter, that will be called when the callback closure data are not useful
anymore, and can be destroyed.
2 changes: 1 addition & 1 deletion gst/gstaravis.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ gst_aravis_set_caps (GstBaseSrc *src, GstCaps *caps)
if (!error) arv_device_set_features_from_string (arv_camera_get_device (gst_aravis->camera), gst_aravis->features, &error);

if (!error) gst_aravis->payload = arv_camera_get_payload (gst_aravis->camera, &error);
if (!error) gst_aravis->stream = arv_camera_create_stream (gst_aravis->camera, NULL, NULL, &error);
if (!error) gst_aravis->stream = arv_camera_create_stream (gst_aravis->camera, NULL, NULL, NULL, &error);
if (error)
goto errored;

Expand Down
38 changes: 9 additions & 29 deletions src/arvcamera.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,50 +139,30 @@ enum
};

/**
* arv_camera_create_stream: (skip)
* arv_camera_create_stream:
* @camera: a #ArvCamera
* @callback: (scope call) (allow-none) (closure user_data): a frame processing callback
* @callback: (scope notified) (allow-none) (closure user_data) (destroy destroy): a frame processing callback
* @user_data: (allow-none): user data for @callback
* @error: a #GError placeholder, %NULL to ignore
*
* Creates a new [class@ArvStream] for video stream reception. See
* [callback@ArvStreamCallback] for details regarding the callback function.
*
* Returns: (transfer full): a new [class@ArvStream], to be freed after use with [[email protected]].
*
* Since: 0.2.0
*/

ArvStream *
arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, gpointer user_data, GError **error)
{
return arv_camera_create_stream_full(camera, callback, user_data, NULL, error);
}

/**
* arv_camera_create_stream_full: (rename-to arv_camera_create_stream)
* @camera: a #ArvCamera
* @callback: (scope notified) (allow-none) (closure user_data): a frame processing callback
* @user_data: (allow-none): user data for @callback
* @destroy: a #GDestroyNotify placeholder, %NULL to ignore
* @error: a #GError placeholder, %NULL to ignore
* @destroy: (nullable): destroy notifier of @user_data
* @error: return location for a [[email protected]]
*
* Creates a new [class@ArvStream] for video stream reception. See
* [callback@ArvStreamCallback] for details regarding the callback function.
*
* Returns: (transfer full): a new [class@ArvStream], to be freed after use with [[email protected]].
*
* Since: 0.8.23
* Since: 0.10.0
*/

ArvStream *
arv_camera_create_stream_full (ArvCamera *camera, ArvStreamCallback callback, gpointer user_data, GDestroyNotify destroy, GError **error)
arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, gpointer user_data, GDestroyNotify destroy,
GError **error)
{
ArvCameraPrivate *priv = arv_camera_get_instance_private (camera);

g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL);

return arv_device_create_stream_full (priv->device, callback, user_data, destroy, error);
return arv_device_create_stream (priv->device, callback, user_data, destroy, error);
}

/* Device control */
Expand Down Expand Up @@ -900,7 +880,7 @@ arv_camera_acquisition (ArvCamera *camera, guint64 timeout, GError **error)

g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL);

stream = arv_camera_create_stream (camera, NULL, NULL, &local_error);
stream = arv_camera_create_stream (camera, NULL, NULL, NULL, &local_error);
if (ARV_IS_STREAM(stream)) {
payload = arv_camera_get_payload (camera, &local_error);
if (local_error == NULL) {
Expand Down
4 changes: 2 additions & 2 deletions src/arvcamera.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ ARV_API ArvCamera * arv_camera_new (const char *name, GError **error);
ARV_API ArvCamera * arv_camera_new_with_device (ArvDevice *device, GError **error);
ARV_API ArvDevice * arv_camera_get_device (ArvCamera *camera);

ARV_API ArvStream * arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, void *user_data, GError **error);
ARV_API ArvStream * arv_camera_create_stream_full (ArvCamera *camera, ArvStreamCallback callback, void *user_data, GDestroyNotify destroy, GError **error);
ARV_API ArvStream * arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, void *user_data,
GDestroyNotify destroy, GError **error);

/* Device informations */

Expand Down
2 changes: 1 addition & 1 deletion src/arvcameratest.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ main (int argc, char **argv)
}

if (success) {
stream = arv_camera_create_stream (camera, stream_cb, NULL, &error);
stream = arv_camera_create_stream (camera, stream_cb, NULL, NULL, &error);

if (arv_camera_is_gv_device (camera)) {
guint gv_packet_size;
Expand Down
43 changes: 10 additions & 33 deletions src/arvdevice.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,50 +71,27 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ArvDevice, arv_device, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, arv_device_initable_iface_init))

/**
* arv_device_create_stream: (skip)
* arv_device_create_stream:
* @device: a #ArvDevice
* @callback: (scope call) (closure user_data) : a frame processing callback
* @callback: (scope notified) (nullable) (closure user_data) (destroy destroy): a frame processing callback
* @user_data: (allow-none) : user data for @callback
* @error: a #GError placeholder, %NULL to ignore
* @destroy: (nullable): destroy notifier of @user_data
* @error: return location for a [[email protected]]
*
* Creates a new #ArvStream for video stream handling. See
* @ArvStreamCallback for details regarding the callback function.
* Creates a new [class@ArvStream] for video stream handling. See
* [callback@ArvStreamCallback] for details regarding the callback function.
*
* Return value: (transfer full): a new #ArvStream.
* Return value: (transfer full): a new [class@ArvStream].
*
* Since: 0.2.0
* Since: 0.10.0
*/

ArvStream *
arv_device_create_stream (ArvDevice *device,
ArvStreamCallback callback, void *user_data,
ArvStreamCallback callback, void *user_data, GDestroyNotify destroy,
GError **error)
{
return arv_device_create_stream_full(device, callback, user_data, NULL, error);
}

/**
* arv_device_create_stream_full: (rename-to arv_device_create_stream)
* @device: a #ArvDevice
* @callback: (scope notified) (closure user_data) : a frame processing callback
* @user_data: (allow-none) : user data for @callback
* @destroy: a #GDestroyNotify placeholder, %NULL to ignore
* @error: a #GError placeholder, %NULL to ignore
*
* Creates a new #ArvStream for video stream handling. See
* @ArvStreamCallback for details regarding the callback function.
*
* Return value: (transfer full): a new #ArvStream.
*
* Since: 0.8.23
*/

ArvStream *
arv_device_create_stream_full (ArvDevice *device,
ArvStreamCallback callback, void *user_data, GDestroyNotify destroy,
GError **error)
{
ArvDevicePrivate *priv = arv_device_get_instance_private (device);
ArvDevicePrivate *priv = arv_device_get_instance_private (device);
ArvStream *stream;
GWeakRef *stream_weak_ref;

Expand Down
8 changes: 5 additions & 3 deletions src/arvdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ ARV_API G_DECLARE_DERIVABLE_TYPE (ArvDevice, arv_device, ARV, DEVICE, GObject)
struct _ArvDeviceClass {
GObjectClass parent_class;

ArvStream * (*create_stream) (ArvDevice *device, ArvStreamCallback callback, void *user_data, GDestroyNotify destroy, GError **error);
ArvStream * (*create_stream) (ArvDevice *device, ArvStreamCallback callback, void *user_data,
GDestroyNotify destroy, GError **error);

const char * (*get_genicam_xml) (ArvDevice *device, size_t *size);
ArvGc * (*get_genicam) (ArvDevice *device);
Expand All @@ -108,8 +109,9 @@ struct _ArvDeviceClass {
gpointer padding[10];
};

ARV_API ArvStream * arv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data, GError **error);
ARV_API ArvStream * arv_device_create_stream_full (ArvDevice *device, ArvStreamCallback callback, void *user_data, GDestroyNotify destroy, GError **error);
ARV_API ArvStream * arv_device_create_stream (ArvDevice *device,
ArvStreamCallback callback, void *user_data,
GDestroyNotify destroy, GError **error);

ARV_API gboolean arv_device_start_acquisition (ArvDevice *device, GError **error);
ARV_API gboolean arv_device_stop_acquisition (ArvDevice *device, GError **error);
Expand Down
23 changes: 20 additions & 3 deletions src/arvfakecamera.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ typedef struct {

ArvFakeCameraFillPattern fill_pattern_callback;
void *fill_pattern_data;
GDestroyNotify fill_pattern_destroy;
} ArvFakeCameraPrivate;

struct _ArvFakeCamera {
Expand Down Expand Up @@ -716,27 +717,35 @@ arv_fake_camera_diagonal_ramp (ArvBuffer *buffer, void *fill_pattern_data,
/**
* arv_fake_camera_set_fill_pattern:
* @camera: a #ArvFakeCamera
* @fill_pattern_callback: (scope call) (closure fill_pattern_data) : callback for image filling
* @fill_pattern_data: image filling user data
* @fill_pattern_callback: (nullable) (scope call) (closure fill_pattern_data) (destroy destroy): callback for image filling
* @fill_pattern_data: (allow-none): image filling user data
* @destroy: (nullable): destroy notifier of @fill_pattern_data
*
* Sets the fill pattern callback for custom test images.
*/

void
arv_fake_camera_set_fill_pattern (ArvFakeCamera *camera,
ArvFakeCameraFillPattern fill_pattern_callback,
void *fill_pattern_data)
void *fill_pattern_data,
GDestroyNotify destroy)
{
g_return_if_fail (ARV_IS_FAKE_CAMERA (camera));

g_mutex_lock (&camera->priv->fill_pattern_mutex);

if (camera->priv->fill_pattern_data != NULL &&
camera->priv->fill_pattern_destroy != NULL)
camera->priv->fill_pattern_destroy (camera->priv->fill_pattern_data);

if (fill_pattern_callback != NULL) {
camera->priv->fill_pattern_callback = fill_pattern_callback;
camera->priv->fill_pattern_data = fill_pattern_data;
camera->priv->fill_pattern_destroy = destroy;
} else {
camera->priv->fill_pattern_callback = arv_fake_camera_diagonal_ramp;
camera->priv->fill_pattern_data = NULL;
camera->priv->fill_pattern_destroy = NULL;
}

g_mutex_unlock (&camera->priv->fill_pattern_mutex);
Expand Down Expand Up @@ -1106,6 +1115,14 @@ arv_fake_camera_finalize (GObject *object)
{
ArvFakeCamera *fake_camera = ARV_FAKE_CAMERA (object);

g_mutex_lock (&fake_camera->priv->fill_pattern_mutex);

if (fake_camera->priv->fill_pattern_data != NULL &&
fake_camera->priv->fill_pattern_destroy != NULL)
fake_camera->priv->fill_pattern_destroy (fake_camera->priv->fill_pattern_data);

g_mutex_unlock (&fake_camera->priv->fill_pattern_mutex);

g_mutex_clear (&fake_camera->priv->fill_pattern_mutex);
g_clear_pointer (&fake_camera->priv->memory, g_free);
g_clear_pointer (&fake_camera->priv->genicam_xml, g_free);
Expand Down
3 changes: 2 additions & 1 deletion src/arvfakecamera.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ ARV_API guint32 arv_fake_camera_get_heartbeat_timeout (ArvFakeCamera *camera)

ARV_API void arv_fake_camera_set_fill_pattern (ArvFakeCamera *camera,
ArvFakeCameraFillPattern fill_pattern_callback,
void *fill_pattern_data);
void *fill_pattern_data,
GDestroyNotify destroy);
ARV_API void arv_fake_camera_set_trigger_frequency (ArvFakeCamera *camera, double frequency);
ARV_API gboolean arv_fake_camera_is_in_free_running_mode (ArvFakeCamera *camera);
ARV_API gboolean arv_fake_camera_is_in_software_trigger_mode (ArvFakeCamera *camera);
Expand Down
2 changes: 1 addition & 1 deletion src/arvstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ struct _ArvStreamClass {

/**
* ArvStreamCallback:
* @user_data: a pointer to user data associated to this callback
* @user_data: (closure): a pointer to user data associated to this callback
* @type: reason of the callback call
* @buffer: a [class@ArvBuffer] object
*
Expand Down
4 changes: 2 additions & 2 deletions src/arvtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ _multiple_acquisition (ArvTest *test, const char *test_name, ArvTestCamera *test
callback_data.n_done = 0;
callback_data.n_success = 0;
callback_data.n_exit = 0;
stream = arv_camera_create_stream (test_camera->camera, _stream_calback, &callback_data, &error);
stream = arv_camera_create_stream (test_camera->camera, _stream_calback, &callback_data, NULL, &error);
if (error == NULL)
payload_size = arv_camera_get_payload (test_camera->camera, &error);
if (error == NULL) {
Expand Down Expand Up @@ -872,7 +872,7 @@ arv_test_software_trigger (ArvTest *test, const char *test_name, ArvTestCamera *
callback_data.n_done = 0;
callback_data.n_success = 0;
callback_data.n_exit = 0;
stream = arv_camera_create_stream (test_camera->camera, _stream_calback, &callback_data, &error);
stream = arv_camera_create_stream (test_camera->camera, _stream_calback, &callback_data, NULL, &error);
if (error == NULL)
payload_size = arv_camera_get_payload (test_camera->camera, &error);
if (error == NULL) {
Expand Down
2 changes: 1 addition & 1 deletion tests/arvchunkparsertest.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ main (int argc, char **argv)
payload = arv_camera_get_payload (camera, NULL);

/* Create a new stream object */
stream = arv_camera_create_stream (camera, NULL, NULL, &error);
stream = arv_camera_create_stream (camera, NULL, NULL, NULL, &error);

if (ARV_IS_STREAM (stream)) {
ArvBuffer *buffer;
Expand Down
2 changes: 1 addition & 1 deletion tests/arvdevicetest.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ main (int argc, char **argv)
g_print ("reverse x = %s\n", v_boolean ? "TRUE" : "FALSE");
}

stream = arv_device_create_stream (device, NULL, NULL, NULL);
stream = arv_device_create_stream (device, NULL, NULL, NULL, NULL);
if (arv_option_auto_buffer)
g_object_set (stream,
"socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO,
Expand Down
2 changes: 1 addition & 1 deletion tests/arvexample.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ main (int argc, char **argv)
payload = arv_camera_get_payload (camera, NULL);

/* Create a new stream object */
stream = arv_camera_create_stream (camera, NULL, NULL, &error);
stream = arv_camera_create_stream (camera, NULL, NULL, NULL, &error);

if (ARV_IS_STREAM (stream)) {
/* Push 50 buffer in the stream input buffer queue */
Expand Down
2 changes: 1 addition & 1 deletion tests/arvheartbeattest.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ int main(int argc, char *argv[])

device = arv_camera_get_device (camera);

stream = arv_camera_create_stream (camera, NULL, NULL, &error);
stream = arv_camera_create_stream (camera, NULL, NULL, NULL, &error);
if (!ARV_IS_STREAM (stream)) {
printf ("Invalid device%s%s\n",
error != NULL ? ": " : "",
Expand Down
2 changes: 1 addition & 1 deletion tests/arvroitest.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ main (int argc, char **argv)
printf ("image width = %d\n", width);
printf ("image height = %d\n", height);

data.stream = arv_camera_create_stream (data.camera, NULL, NULL, &error);
data.stream = arv_camera_create_stream (data.camera, NULL, NULL, NULL, &error);

if (ARV_IS_STREAM (data.stream)) {
g_signal_connect (data.stream, "new-buffer", G_CALLBACK (new_buffer_cb), &data);
Expand Down
6 changes: 3 additions & 3 deletions tests/fake.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,11 +346,11 @@ fake_stream_test (void)
fake_camera = arv_fake_device_get_fake_camera (ARV_FAKE_DEVICE (device));
g_assert (ARV_IS_FAKE_CAMERA (fake_camera));

stream = arv_camera_create_stream (camera, NULL, NULL, &error);
stream = arv_camera_create_stream (camera, NULL, NULL, NULL, &error);
g_assert (ARV_IS_STREAM (stream));
g_assert (error == NULL);

arv_fake_camera_set_fill_pattern (fake_camera, fill_pattern_cb, &counter);
arv_fake_camera_set_fill_pattern (fake_camera, fill_pattern_cb, &counter, NULL);

payload = arv_camera_get_payload (camera, NULL);
arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL));
Expand All @@ -359,7 +359,7 @@ fake_stream_test (void)
buffer = arv_stream_pop_buffer (stream);
arv_camera_stop_acquisition (camera, NULL);

arv_fake_camera_set_fill_pattern (fake_camera, NULL, NULL);
arv_fake_camera_set_fill_pattern (fake_camera, NULL, NULL, NULL);

g_assert_cmpint (counter, ==, 1);

Expand Down
Loading
Loading