[aravis] fake: gv_camera stream W.I.P.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis] fake: gv_camera stream W.I.P.
- Date: Wed, 2 Jun 2010 21:03:15 +0000 (UTC)
commit d3ae85c1729757ca196fd4e120d17819b1b6bde4
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Wed Jun 2 23:02:37 2010 +0200
fake: gv_camera stream W.I.P.
src/arvfakecamera.c | 2 +-
src/arvfakegvcamera.c | 61 +++++++++++++++++++++++++++++++++-
src/arvgvsp.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++
src/arvgvsp.h | 10 +++++
4 files changed, 159 insertions(+), 2 deletions(-)
---
diff --git a/src/arvfakecamera.c b/src/arvfakecamera.c
index 8f7abe8..1e919fa 100644
--- a/src/arvfakecamera.c
+++ b/src/arvfakecamera.c
@@ -164,7 +164,7 @@ arv_fake_camera_fill_buffer (ArvFakeCamera *camera, ArvBuffer *buffer)
y_offset = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_Y_OFFSET);
payload = width * height;
- if (buffer->size != payload) {
+ if (buffer->size < payload) {
buffer->status = ARV_BUFFER_STATUS_SIZE_MISMATCH;
return;
}
diff --git a/src/arvfakegvcamera.c b/src/arvfakegvcamera.c
index 918a9a9..4f061e4 100644
--- a/src/arvfakegvcamera.c
+++ b/src/arvfakegvcamera.c
@@ -30,12 +30,71 @@ void *
arv_fake_gv_camera_thread (void *user_data)
{
ArvFakeGvCamera *gv_camera = user_data;
+ ArvBuffer *image_buffer;
+ GSocketAddress *socket_address;
+ GInetAddress *inet_address;
+ void *packet_buffer;
+ size_t packet_size;
+ size_t payload = 512*512;
+ guint32 frame_id = 0;
+ guint16 block_id;
+ ptrdiff_t offset;
+
+ image_buffer = arv_buffer_new (2048*2048, NULL);
+ packet_buffer = g_malloc (65536);
+ inet_address = g_inet_address_new_from_string ("127.0.0.1");
+ socket_address = g_inet_socket_address_new (inet_address, 58000);
+ g_object_unref (inet_address);
do {
arv_fake_camera_wait_for_next_frame (gv_camera->camera);
- g_print ("new_frame\n");
+ arv_fake_camera_fill_buffer (gv_camera->camera, image_buffer);
+
+ block_id = 0;
+
+ packet_size = 65536;
+ arv_gvsp_packet_new_data_leader (frame_id, block_id, image_buffer->timestamp_ns,
+ image_buffer->pixel_format,
+ image_buffer->width, image_buffer->height,
+ image_buffer->x_offset, image_buffer->y_offset,
+ packet_buffer, &packet_size);
+
+ g_socket_send_to (gv_camera->gvsp_socket, socket_address, packet_buffer, packet_size, NULL, NULL);
+
+ block_id++;
+
+ offset = 0;
+ while (offset < payload) {
+ size_t data_size;
+
+ data_size = MIN (1500, payload - offset);
+
+ packet_size = 65536;
+ arv_gvsp_packet_new_data_block (frame_id, block_id,
+ data_size, image_buffer->data + offset,
+ packet_buffer, &packet_size);
+
+ g_socket_send_to (gv_camera->gvsp_socket, socket_address,
+ packet_buffer, packet_size, NULL, NULL);
+
+ offset += data_size;
+ block_id++;
+ }
+
+ packet_size = 65536;
+ arv_gvsp_packet_new_data_trailer (frame_id, block_id,
+ packet_buffer, &packet_size);
+
+ g_socket_send_to (gv_camera->gvsp_socket, socket_address, packet_buffer, packet_size, NULL, NULL);
+
+ frame_id++;
+
} while (!cancel);
+ g_object_unref (socket_address);
+ g_free (packet_buffer);
+ g_object_unref (image_buffer);
+
return NULL;
}
diff --git a/src/arvgvsp.c b/src/arvgvsp.c
index c0b9d87..46f6fad 100644
--- a/src/arvgvsp.c
+++ b/src/arvgvsp.c
@@ -28,6 +28,94 @@
#include <arvgvsp.h>
#include <arvdebug.h>
#include <arvenumtypes.h>
+#include <string.h>
+
+static ArvGvspPacket *
+arv_gvsp_packet_new (guint32 frame_id, guint16 block_id, size_t data_size, void *buffer, size_t *buffer_size)
+{
+ ArvGvspPacket *packet;
+ size_t packet_size;
+
+ packet_size = sizeof (ArvGvspPacket) + data_size;
+ if (packet_size == 0 || (buffer != NULL && (buffer_size == NULL || packet_size > *buffer_size)))
+ return NULL;
+
+ if (buffer_size != NULL)
+ *buffer_size = packet_size;
+
+ if (buffer != NULL)
+ packet = buffer;
+ else
+ packet = g_malloc (packet_size);
+
+ packet->header.frame_id = frame_id;
+ packet->header.packet_type = ARV_GVSP_PACKET_TYPE_DATA_LEADER;
+ packet->header.block_id = block_id;
+
+ return packet;
+}
+
+ArvGvspPacket *
+arv_gvsp_packet_new_data_leader (guint32 frame_id, guint16 block_id,
+ guint64 timestamp, ArvPixelFormat pixel_format,
+ guint32 width, guint32 height,
+ guint32 x_offset, guint32 y_offset,
+ void *buffer, size_t *buffer_size)
+{
+ ArvGvspPacket *packet;
+
+ packet = arv_gvsp_packet_new (frame_id, block_id, sizeof (ArvGvspDataLeader), buffer, buffer_size);
+
+ if (packet != NULL) {
+ ArvGvspDataLeader *leader;
+
+ leader = (ArvGvspDataLeader *) &packet->data;
+ leader->data0 = 0;
+ leader->timestamp_high = (guint64) (timestamp / 1000000000LL);
+ leader->timestamp_low = (guint64) (timestamp % 1000000000LL);
+ leader->pixel_format = pixel_format;
+ leader->width = width;
+ leader->height = height;
+ leader->x_offset = x_offset;
+ leader->y_offset = y_offset;
+ }
+
+ return packet;
+}
+
+ArvGvspPacket *
+arv_gvsp_packet_new_data_trailer (guint32 frame_id, guint16 block_id,
+ void *buffer, size_t *buffer_size)
+{
+ ArvGvspPacket *packet;
+
+ packet = arv_gvsp_packet_new (frame_id, block_id, sizeof (ArvGvspDataTrailer), buffer, buffer_size);
+
+ if (packet != NULL) {
+ ArvGvspDataTrailer *trailer;
+
+ trailer = (ArvGvspDataTrailer *) &packet->data;
+ trailer->data0 = 0;
+ trailer->data1 = 0;
+ }
+
+ return packet;
+}
+
+ArvGvspPacket *
+arv_gvsp_packet_new_data_block (guint32 frame_id, guint16 block_id,
+ size_t size, void *data,
+ void *buffer, size_t *buffer_size)
+{
+ ArvGvspPacket *packet;
+
+ packet = arv_gvsp_packet_new (frame_id, block_id, size, buffer, buffer_size);
+
+ if (packet != NULL)
+ memcpy (&packet->data, data, size);
+
+ return packet;
+}
static const char *
arv_enum_to_string (GType type,
diff --git a/src/arvgvsp.h b/src/arvgvsp.h
index 6c54858..ca9c501 100644
--- a/src/arvgvsp.h
+++ b/src/arvgvsp.h
@@ -60,6 +60,16 @@ typedef struct {
guint8 data[];
} ArvGvspPacket;
+ArvGvspPacket * arv_gvsp_packet_new_data_leader (guint32 frame_id, guint16 block_id,
+ guint64 timestamp, ArvPixelFormat pixel_format,
+ guint32 width, guint32 height,
+ guint32 x_offset, guint32 y_offset,
+ void *buffer, size_t *buffer_size);
+ArvGvspPacket * arv_gvsp_packet_new_data_trailer (guint32 frame_id, guint16 block_id,
+ void *buffer, size_t *buffer_size);
+ArvGvspPacket * arv_gvsp_packet_new_data_block (guint32 frame_id, guint16 block_id,
+ size_t size, void *data,
+ void *buffer, size_t *buffer_size);
void arv_gvsp_packet_debug (const ArvGvspPacket *packet, size_t packet_size);
static inline ArvGvspPacketType
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]