[aravis] gvsp: packet id is a 24 bit value.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis] gvsp: packet id is a 24 bit value.
- Date: Mon, 21 Feb 2011 15:29:20 +0000 (UTC)
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 (¤t_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 (¤t_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]