[aravis] fake: gv_camera stream W.I.P.



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]