[aravis] gvsp: packet id is a 24 bit value.



commit 4cdcd2453052afb9a7e20e2f594119fb8aee14a7
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Mon Feb 21 16:28:07 2011 +0100

    gvsp: packet id is a 24 bit value.
    
    Store it in a 32 bit integer, together with the packet type.

 docs/reference/aravis/aravis-sections.txt |    3 ++
 src/arvgvsp.c                             |   28 ++++++++++++++----------
 src/arvgvsp.h                             |   26 +++++++++++++----------
 src/arvgvstream.c                         |   32 ++++++++++++++--------------
 4 files changed, 50 insertions(+), 39 deletions(-)
---
diff --git a/docs/reference/aravis/aravis-sections.txt b/docs/reference/aravis/aravis-sections.txt
index 7b79afb..5d0a292 100644
--- a/docs/reference/aravis/aravis-sections.txt
+++ b/docs/reference/aravis/aravis-sections.txt
@@ -825,6 +825,9 @@ arv_gvsp_packet_new_data_trailer
 <SUBSECTION Private>
 ArvGvspPacket
 ArvGvspPacketType
+ARV_GVSP_PACKET_INFOS_ID_MASK
+ARV_GVSP_PACKET_INFOS_TYPE_MASK
+ARV_GVSP_PACKET_INFOS_TYPE_POS
 </SECTION>
 
 <SECTION>
diff --git a/src/arvgvsp.c b/src/arvgvsp.c
index 326c884..cbaefbe 100644
--- a/src/arvgvsp.c
+++ b/src/arvgvsp.c
@@ -32,7 +32,7 @@
 
 static ArvGvspPacket *
 arv_gvsp_packet_new (ArvGvspPacketType packet_type,
-		     guint32 frame_id, guint16 block_id, size_t data_size, void *buffer, size_t *buffer_size)
+		     guint32 frame_id, guint32 packet_id, size_t data_size, void *buffer, size_t *buffer_size)
 {
 	ArvGvspPacket *packet;
 	size_t packet_size;
@@ -50,14 +50,15 @@ arv_gvsp_packet_new (ArvGvspPacketType packet_type,
 		packet = g_malloc (packet_size);
 
 	packet->header.frame_id = g_htonl (frame_id);
-	packet->header.packet_type = g_htons (packet_type);
-	packet->header.block_id = g_htons (block_id);
+	packet->header.packet_infos = g_htonl ((packet_id & ARV_GVSP_PACKET_INFOS_ID_MASK) |
+					       ((packet_type << ARV_GVSP_PACKET_INFOS_TYPE_POS) &
+						ARV_GVSP_PACKET_INFOS_TYPE_MASK));
 
 	return packet;
 }
 
 ArvGvspPacket *
-arv_gvsp_packet_new_data_leader	(guint32 frame_id, guint16 block_id,
+arv_gvsp_packet_new_data_leader	(guint32 frame_id, guint32 packet_id,
 				 guint64 timestamp, ArvPixelFormat pixel_format,
 				 guint32 width, guint32 height,
 				 guint32 x_offset, guint32 y_offset,
@@ -66,7 +67,7 @@ arv_gvsp_packet_new_data_leader	(guint32 frame_id, guint16 block_id,
 	ArvGvspPacket *packet;
 
 	packet = arv_gvsp_packet_new (ARV_GVSP_PACKET_TYPE_DATA_LEADER,
-				      frame_id, block_id, sizeof (ArvGvspDataLeader), buffer, buffer_size);
+				      frame_id, packet_id, sizeof (ArvGvspDataLeader), buffer, buffer_size);
 
 	if (packet != NULL) {
 		ArvGvspDataLeader *leader;
@@ -86,13 +87,13 @@ arv_gvsp_packet_new_data_leader	(guint32 frame_id, guint16 block_id,
 }
 
 ArvGvspPacket *
-arv_gvsp_packet_new_data_trailer (guint32 frame_id, guint16 block_id,
+arv_gvsp_packet_new_data_trailer (guint32 frame_id, guint32 packet_id,
 				  void *buffer, size_t *buffer_size)
 {
 	ArvGvspPacket *packet;
 
 	packet = arv_gvsp_packet_new (ARV_GVSP_PACKET_TYPE_DATA_TRAILER,
-				      frame_id, block_id, sizeof (ArvGvspDataTrailer), buffer, buffer_size);
+				      frame_id, packet_id, sizeof (ArvGvspDataTrailer), buffer, buffer_size);
 
 	if (packet != NULL) {
 		ArvGvspDataTrailer *trailer;
@@ -106,14 +107,14 @@ arv_gvsp_packet_new_data_trailer (guint32 frame_id, guint16 block_id,
 }
 
 ArvGvspPacket *
-arv_gvsp_packet_new_data_block (guint32 frame_id, guint16 block_id,
+arv_gvsp_packet_new_data_block (guint32 frame_id, guint32 packet_id,
 				size_t size, void *data,
 				void *buffer, size_t *buffer_size)
 {
 	ArvGvspPacket *packet;
 
 	packet = arv_gvsp_packet_new (ARV_GVSP_PACKET_TYPE_DATA_BLOCK,
-				      frame_id, block_id, size, buffer, buffer_size);
+				      frame_id, packet_id, size, buffer, buffer_size);
 
 	if (packet != NULL)
 		memcpy (&packet->data, data, size);
@@ -150,16 +151,19 @@ char *
 arv_gvsp_packet_to_string (const ArvGvspPacket *packet, size_t packet_size)
 {
 	ArvGvspDataLeader *leader;
+	ArvGvspPacketType packet_type;
 	GString *string;
 	char *c_string;
 	int i, j, index;
 
 	string = g_string_new ("");
 
-	g_string_append_printf (string, "packet_type  = %s\n",
-				arv_gvsp_packet_type_to_string (g_ntohs (packet->header.packet_type)));
+	packet_type = (g_ntohl (packet->header.packet_infos) & ARV_GVSP_PACKET_INFOS_TYPE_MASK) >>
+		ARV_GVSP_PACKET_INFOS_TYPE_POS;
 
-	switch (g_ntohs (packet->header.packet_type)) {
+	g_string_append_printf (string, "packet_type  = %s\n", arv_gvsp_packet_type_to_string (packet_type));
+
+	switch (packet_type) {
 		case ARV_GVSP_PACKET_TYPE_DATA_LEADER:
 			leader = (ArvGvspDataLeader *) &packet->data;
 			g_string_append_printf (string, "width        = %d\n", g_ntohl (leader->width));
diff --git a/src/arvgvsp.h b/src/arvgvsp.h
index b045fee..a32a86b 100644
--- a/src/arvgvsp.h
+++ b/src/arvgvsp.h
@@ -27,16 +27,19 @@
 
 G_BEGIN_DECLS
 
+#define ARV_GVSP_PACKET_INFOS_ID_MASK		0x00ffffff
+#define ARV_GVSP_PACKET_INFOS_TYPE_MASK		0xff000000
+#define ARV_GVSP_PACKET_INFOS_TYPE_POS		24
+
 typedef enum {
-	ARV_GVSP_PACKET_TYPE_DATA_LEADER = 	0x0100,
-	ARV_GVSP_PACKET_TYPE_DATA_TRAILER = 	0x0200,
-	ARV_GVSP_PACKET_TYPE_DATA_BLOCK =	0x0300
+	ARV_GVSP_PACKET_TYPE_DATA_LEADER = 	0x01,
+	ARV_GVSP_PACKET_TYPE_DATA_TRAILER = 	0x02,
+	ARV_GVSP_PACKET_TYPE_DATA_BLOCK =	0x03
 } ArvGvspPacketType;
 
 typedef struct {
 	guint32 frame_id;
-	guint16 packet_type;
-	guint16 block_id;
+	guint32 packet_infos;
 } __attribute__((__packed__)) ArvGvspHeader;
 
 typedef struct {
@@ -60,14 +63,14 @@ typedef struct {
 	guint8 data[];
 } ArvGvspPacket;
 
-ArvGvspPacket *		arv_gvsp_packet_new_data_leader		(guint32 frame_id, guint16 block_id,
+ArvGvspPacket *		arv_gvsp_packet_new_data_leader		(guint32 frame_id, guint32 packet_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,
+ArvGvspPacket *		arv_gvsp_packet_new_data_trailer	(guint32 frame_id, guint32 packet_id,
 								 void *buffer, size_t *buffer_size);
-ArvGvspPacket *		arv_gvsp_packet_new_data_block		(guint32 frame_id, guint16 block_id,
+ArvGvspPacket *		arv_gvsp_packet_new_data_block		(guint32 frame_id, guint32 packet_id,
 								 size_t size, void *data,
 								 void *buffer, size_t *buffer_size);
 void 			arv_gvsp_packet_debug 			(const ArvGvspPacket *packet, size_t packet_size);
@@ -75,13 +78,14 @@ void 			arv_gvsp_packet_debug 			(const ArvGvspPacket *packet, size_t packet_siz
 static inline ArvGvspPacketType
 arv_gvsp_packet_get_packet_type	(const ArvGvspPacket *packet)
 {
-	return (ArvGvspPacketType) g_ntohs (packet->header.packet_type);
+	return (ArvGvspPacketType) ((g_ntohl (packet->header.packet_infos) & ARV_GVSP_PACKET_INFOS_TYPE_MASK) >>
+				    ARV_GVSP_PACKET_INFOS_TYPE_POS);
 }
 
 static inline guint16
-arv_gvsp_packet_get_block_id (const ArvGvspPacket *packet)
+arv_gvsp_packet_get_packet_id (const ArvGvspPacket *packet)
 {
-	return g_ntohs (packet->header.block_id);
+	return g_ntohl (packet->header.packet_infos) & ARV_GVSP_PACKET_INFOS_ID_MASK;
 }
 
 static inline guint32
diff --git a/src/arvgvstream.c b/src/arvgvstream.c
index 5a805eb..5bcb73a 100644
--- a/src/arvgvstream.c
+++ b/src/arvgvstream.c
@@ -145,7 +145,7 @@ typedef struct {
 	gint32 n_missing_blocks;
 	gint32 n_late_blocks;
 	gint32 last_block_size;
-	gint32 last_block_id;
+	gint32 last_packet_id;
 	gint64 last_time_us;
 	guint64 last_timestamp_ns;
 	guint32 statistic_count;
@@ -238,7 +238,7 @@ _process_data_leader (ArvGvStreamThreadData *thread_data, ArvGvStreamThreadState
 	state->read_data_size = 0;
 	state->n_missing_blocks = 0;
 	state->last_block_size = 0;
-	state->last_block_id = 0;
+	state->last_packet_id = 0;
 
 	g_get_current_time (&current_time);
 	state->leader_time_us = current_time.tv_sec * 1000000 + current_time.tv_usec;
@@ -255,7 +255,7 @@ _process_data_block (ArvGvStreamThreadData *thread_data, ArvGvStreamThreadState
 	size_t block_size;
 	ptrdiff_t block_offset;
 	ptrdiff_t block_end;
-	int block_id;
+	guint32 packet_id;
 
 	if (state->buffer == NULL ||
 	    state->buffer->status != ARV_BUFFER_STATUS_FILLING)
@@ -266,13 +266,13 @@ _process_data_block (ArvGvStreamThreadData *thread_data, ArvGvStreamThreadState
 		return;
 	}
 
-	block_id = arv_gvsp_packet_get_block_id (state->packet);
-	if (block_id <= state->last_block_id) {
-		arv_debug ("stream-thread", "[GvStream::thread] Receive resent block (%d) frame %d",
-			   block_id, state->buffer->frame_id);
+	packet_id = arv_gvsp_packet_get_packet_id (state->packet);
+	if (packet_id <= state->last_packet_id) {
+		arv_debug ("stream-thread", "[GvStream::thread] Receive resent packet (%d) frame %d",
+			   packet_id, state->buffer->frame_id);
 
 		block_size = arv_gvsp_packet_get_data_size (read_count);
-		block_offset = state->last_block_size * (block_id - 1);
+		block_offset = state->last_block_size * (packet_id - 1);
 		block_end = block_size + block_offset;
 
 		if (block_end  > state->buffer->size) {
@@ -288,25 +288,25 @@ _process_data_block (ArvGvStreamThreadData *thread_data, ArvGvStreamThreadState
 		return;
 	}
 
-	if (block_id != (state->last_block_id + 1)) {
+	if (packet_id != (state->last_packet_id + 1)) {
 		gint32 n_misses;
 
-		n_misses = block_id - state->last_block_id - 1;
+		n_misses = packet_id - state->last_packet_id - 1;
 
 		arv_gvsp_packet_debug (state->packet, read_count);
 		arv_debug ("stream-thread", "[GvStream::thread] Missing block (expected %d - %d) frame %d",
-			   state->last_block_id + 1,
-			   block_id, state->buffer->frame_id);
+			   state->last_packet_id + 1,
+			   packet_id, state->buffer->frame_id);
 		thread_data->n_missing_blocks += n_misses;
 		state->n_missing_blocks += n_misses;
 
 		if (thread_data->packet_resend != ARV_GV_STREAM_PACKET_RESEND_NEVER)
 			_send_packet_request (thread_data, state->buffer->frame_id,
-					      state->last_block_id + 1, block_id - 1);
+					      state->last_packet_id + 1, packet_id - 1);
 	}
 
 	block_size = arv_gvsp_packet_get_data_size (read_count);
-	block_offset = state->last_block_size * (block_id - 1);
+	block_offset = state->last_block_size * (packet_id - 1);
 	block_end = block_size + block_offset;
 
 	if (block_end  > state->buffer->size) {
@@ -318,7 +318,7 @@ _process_data_block (ArvGvStreamThreadData *thread_data, ArvGvStreamThreadState
 
 	state->read_data_size += block_size;
 	state->last_block_size = block_size;
-	state->last_block_id =  block_id;
+	state->last_packet_id =  packet_id;
 }
 
 static void
@@ -354,7 +354,7 @@ arv_gv_stream_thread (void *data)
 	state.packet = g_malloc0 (ARV_GV_STREAM_INCOMING_BUFFER_SIZE);
 	state.n_missing_blocks = 0;
 	state.last_block_size = 0;
-	state.last_block_id = 0;
+	state.last_packet_id = 0;
 	state.statistic_count = 0;
 	g_get_current_time (&current_time);
 	state.last_time_us = current_time.tv_sec * 1000000 + current_time.tv_usec;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]