[aravis] buffer: make data private



commit f7c5fd5da5a0374c0db7d4cad72f00b23d1fded3
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Tue Aug 19 12:13:42 2014 +0200

    buffer: make data private
    
    All image related data are specific to the IMAGE payload. It's better
    to access them using accessors, which allows to emit warnings in case
    of payload type mismatch.

 docs/reference/aravis/Makefile.am         |    5 +-
 docs/reference/aravis/aravis-sections.txt |   11 ++
 gst-0.10/gstaravis.c                      |   33 ++++---
 gst/gstaravis.c                           |   37 ++++---
 src/arvbuffer.c                           |  161 ++++++++++++++++++++++++-----
 src/arvbuffer.h                           |   79 +++++++++-----
 src/arvbufferprivate.h                    |   56 ++++++++++
 src/arvfakecamera.c                       |   32 +++---
 src/arvfakegvcamera.c                     |   19 ++--
 src/arvfakestream.c                       |    4 +-
 src/arvgvsp.h                             |    6 +-
 src/arvgvstream.c                         |   90 +++++++++--------
 tests/arvcameratest.c                     |    2 +-
 tests/arvexample.c                        |    2 +-
 tests/arvtest.c                           |    2 +
 tests/buffer.c                            |   31 +++---
 tests/genicam.c                           |    9 +-
 viewer/arvviewer.c                        |   46 +++++----
 18 files changed, 425 insertions(+), 200 deletions(-)
---
diff --git a/docs/reference/aravis/Makefile.am b/docs/reference/aravis/Makefile.am
index cccdb16..b1e826c 100644
--- a/docs/reference/aravis/Makefile.am
+++ b/docs/reference/aravis/Makefile.am
@@ -61,8 +61,9 @@ EXTRA_HFILES=
 # Header files to ignore when scanning. Use base file name, no paths
 # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
 IGNORE_HFILES=\
-       arvenumtypes.h  \
-       arvconfig.h     \
+       arvenumtypes.h          \
+       arvconfig.h             \
+       arvbufferprivate.h      \
        arv.h
 
 # Images to copy into HTML directory.
diff --git a/docs/reference/aravis/aravis-sections.txt b/docs/reference/aravis/aravis-sections.txt
index ed42b68..49649ba 100644
--- a/docs/reference/aravis/aravis-sections.txt
+++ b/docs/reference/aravis/aravis-sections.txt
@@ -74,12 +74,22 @@ ArvCameraClass
 ArvFrameCallback
 ArvBufferStatus
 ArvBuffer
+ArvBufferPayloadType
 ArvPixelFormat
 arv_buffer_new
 arv_buffer_new_full
 arv_buffer_new_allocate
 arv_buffer_get_data
 arv_buffer_get_chunk_data
+arv_buffer_get_image_height
+arv_buffer_get_image_pixel_format
+arv_buffer_get_image_region
+arv_buffer_get_timestamp
+arv_buffer_get_image_width
+arv_buffer_get_image_x
+arv_buffer_get_image_y
+arv_buffer_get_payload_type
+arv_buffer_get_status
 ARV_PIXEL_FORMAT_BIT_PER_PIXEL
 ARV_PIXEL_FORMAT_BAYER_BG_10
 ARV_PIXEL_FORMAT_BAYER_BG_12
@@ -144,6 +154,7 @@ ARV_IS_BUFFER_CLASS
 ARV_BUFFER_GET_CLASS
 <SUBSECTION Private>
 ArvBufferClass
+ArvBufferPrivate
 </SECTION>
 
 <SECTION>
diff --git a/gst-0.10/gstaravis.c b/gst-0.10/gstaravis.c
index 5a73119..b3fc7cc 100644
--- a/gst-0.10/gstaravis.c
+++ b/gst-0.10/gstaravis.c
@@ -359,21 +359,28 @@ gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer)
        GstAravis *gst_aravis;
        ArvBuffer *arv_buffer;
        int arv_row_stride;
+       int width, height;
+       char *buffer_data;
+       size_t buffer_size;
+       guint64 timestamp_ns;
 
        gst_aravis = GST_ARAVIS (push_src);
 
        do {
                arv_buffer = arv_stream_timeout_pop_buffer (gst_aravis->stream, 
gst_aravis->buffer_timeout_us);
-               if (arv_buffer != NULL && arv_buffer->status != ARV_BUFFER_STATUS_SUCCESS)
+               if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS)
                        arv_stream_push_buffer (gst_aravis->stream, arv_buffer);
-       } while (arv_buffer != NULL && arv_buffer->status != ARV_BUFFER_STATUS_SUCCESS);
+       } while (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS);
 
        if (arv_buffer == NULL)
                return GST_FLOW_ERROR;
 
        *buffer = gst_buffer_new ();
 
-       arv_row_stride = arv_buffer->width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer->pixel_format) / 8;
+       buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size);
+       arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height);
+       arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format 
(arv_buffer)) / 8;
+       timestamp_ns = arv_buffer_get_image_timestamp (arv_buffer);
 
        /* Gstreamer requires row stride to be a multiple of 4 */
        if ((arv_row_stride & 0x3) != 0) {
@@ -384,31 +391,31 @@ gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer)
 
                gst_row_stride = (arv_row_stride & ~(0x3)) + 4;
 
-               size = arv_buffer->height * gst_row_stride;
+               size = height * gst_row_stride;
                data = g_malloc (size);
 
-               for (i = 0; i < arv_buffer->height; i++)
-                       memcpy (((char *) data) + i * gst_row_stride, ((char *) arv_buffer->data) + i * 
arv_row_stride, arv_row_stride);
+               for (i = 0; i < height; i++)
+                       memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * arv_row_stride, 
arv_row_stride);
 
                GST_BUFFER_DATA (buffer) = data;
                GST_BUFFER_MALLOCDATA (buffer) = data;
                GST_BUFFER_SIZE (buffer) = size;
        } else {
-               GST_BUFFER_DATA (*buffer) = arv_buffer->data;
+               GST_BUFFER_DATA (*buffer) = buffer_data;
                GST_BUFFER_MALLOCDATA (*buffer) = NULL;
-               GST_BUFFER_SIZE (*buffer) = arv_buffer->size;
+               GST_BUFFER_SIZE (*buffer) = buffer_size;
        }
 
        if (!gst_base_src_get_do_timestamp(GST_BASE_SRC(push_src))) {
                if (gst_aravis->timestamp_offset == 0) {
-                       gst_aravis->timestamp_offset = arv_buffer->timestamp_ns;
-                       gst_aravis->last_timestamp = arv_buffer->timestamp_ns;
+                       gst_aravis->timestamp_offset = timestamp_ns;
+                       gst_aravis->last_timestamp = timestamp_ns;
                }
 
-               GST_BUFFER_TIMESTAMP (*buffer) = arv_buffer->timestamp_ns - gst_aravis->timestamp_offset;
-               GST_BUFFER_DURATION (*buffer) = arv_buffer->timestamp_ns - gst_aravis->last_timestamp;
+               GST_BUFFER_TIMESTAMP (*buffer) = timestamp_ns - gst_aravis->timestamp_offset;
+               GST_BUFFER_DURATION (*buffer) = timestamp_ns - gst_aravis->last_timestamp;
 
-               gst_aravis->last_timestamp = arv_buffer->timestamp_ns;
+               gst_aravis->last_timestamp = timestamp_ns;
        }
 
        arv_stream_push_buffer (gst_aravis->stream, arv_buffer);
diff --git a/gst/gstaravis.c b/gst/gstaravis.c
index 3624588..99fb953 100644
--- a/gst/gstaravis.c
+++ b/gst/gstaravis.c
@@ -347,19 +347,26 @@ gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer)
        GstAravis *gst_aravis;
        ArvBuffer *arv_buffer;
        int arv_row_stride;
+       int width, height;
+       char *buffer_data;
+       size_t buffer_size;
+       guint64 timestamp_ns;
 
        gst_aravis = GST_ARAVIS (push_src);
 
        do {
                arv_buffer = arv_stream_timeout_pop_buffer (gst_aravis->stream, 
gst_aravis->buffer_timeout_us);
-               if (arv_buffer != NULL && arv_buffer->status != ARV_BUFFER_STATUS_SUCCESS)
+               if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS)
                        arv_stream_push_buffer (gst_aravis->stream, arv_buffer);
-       } while (arv_buffer != NULL && arv_buffer->status != ARV_BUFFER_STATUS_SUCCESS);
+       } while (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS);
 
        if (arv_buffer == NULL)
                return GST_FLOW_ERROR;
 
-       arv_row_stride = arv_buffer->width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer->pixel_format) / 8;
+       buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size);
+       arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height);
+       arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format 
(arv_buffer)) / 8;
+       timestamp_ns = arv_buffer_get_image_timestamp (arv_buffer);
 
        /* Gstreamer requires row stride to be a multiple of 4 */
        if ((arv_row_stride & 0x3) != 0) {
@@ -370,33 +377,27 @@ gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer)
 
                gst_row_stride = (arv_row_stride & ~(0x3)) + 4;
 
-               size = arv_buffer->height * gst_row_stride;
+               size = height * gst_row_stride;
                data = g_malloc (size);
 
-               for (i = 0; i < arv_buffer->height; i++)
-                       memcpy (((char *) data) + i * gst_row_stride, ((char *) arv_buffer->data) + i * 
arv_row_stride, arv_row_stride);
+               for (i = 0; i < height; i++)
+                       memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * arv_row_stride, 
arv_row_stride);
 
                *buffer = gst_buffer_new_wrapped (data, size);
        } else {
-               *buffer = gst_buffer_new_wrapped_full (0,
-                       arv_buffer->data,
-                       arv_buffer->size,
-                       0,
-                       arv_buffer->size,
-                       NULL,
-                       NULL);
+               *buffer = gst_buffer_new_wrapped_full (0, buffer_data, buffer_size, 0, buffer_size, NULL, 
NULL);
        }
 
        if (!gst_base_src_get_do_timestamp(GST_BASE_SRC(push_src))) {
                if (gst_aravis->timestamp_offset == 0) {
-                       gst_aravis->timestamp_offset = arv_buffer->timestamp_ns;
-                       gst_aravis->last_timestamp = arv_buffer->timestamp_ns;
+                       gst_aravis->timestamp_offset = timestamp_ns;
+                       gst_aravis->last_timestamp = timestamp_ns;
                }
 
-               GST_BUFFER_PTS (*buffer) = arv_buffer->timestamp_ns - gst_aravis->timestamp_offset;
-               GST_BUFFER_DURATION (*buffer) = arv_buffer->timestamp_ns - gst_aravis->last_timestamp;
+               GST_BUFFER_PTS (*buffer) = timestamp_ns - gst_aravis->timestamp_offset;
+               GST_BUFFER_DURATION (*buffer) = timestamp_ns - gst_aravis->last_timestamp;
 
-               gst_aravis->last_timestamp = arv_buffer->timestamp_ns;
+               gst_aravis->last_timestamp = timestamp_ns;
        }
 
        arv_stream_push_buffer (gst_aravis->stream, arv_buffer);
diff --git a/src/arvbuffer.c b/src/arvbuffer.c
index e043e17..fe48caf 100644
--- a/src/arvbuffer.c
+++ b/src/arvbuffer.c
@@ -32,7 +32,7 @@
  * format and time stamp.
  */
 
-#include <arvbuffer.h>
+#include <arvbufferprivate.h>
 
 static GObjectClass *parent_class = NULL;
 
@@ -62,16 +62,16 @@ arv_buffer_new_full (size_t size, void *preallocated, void *user_data, GDestroyN
        ArvBuffer *buffer;
 
        buffer = g_object_new (ARV_TYPE_BUFFER, NULL);
-       buffer->size = size;
-       buffer->user_data = user_data;
-       buffer->user_data_destroy_func = user_data_destroy_func;
+       buffer->priv->size = size;
+       buffer->priv->user_data = user_data;
+       buffer->priv->user_data_destroy_func = user_data_destroy_func;
 
        if (preallocated != NULL) {
-               buffer->is_preallocated = TRUE;
-               buffer->data = preallocated;
+               buffer->priv->is_preallocated = TRUE;
+               buffer->priv->data = preallocated;
        } else {
-               buffer->is_preallocated = FALSE;
-               buffer->data = g_malloc (size);
+               buffer->priv->is_preallocated = FALSE;
+               buffer->priv->data = g_malloc (size);
        }
 
        return buffer;
@@ -131,7 +131,7 @@ arv_buffer_clear (ArvBuffer *buffer)
 {
        g_return_if_fail (ARV_IS_BUFFER (buffer));
 
-       buffer->status = ARV_BUFFER_STATUS_CLEARED;
+       buffer->priv->status = ARV_BUFFER_STATUS_CLEARED;
 }
 
 /**
@@ -152,9 +152,9 @@ arv_buffer_get_data (ArvBuffer *buffer, size_t *size)
        g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL);
 
        if (size != NULL)
-               *size = buffer->size;
+               *size = buffer->priv->size;
 
-       return buffer->data;
+       return buffer->priv->data;
 }
 
 typedef struct ARAVIS_PACKED_STRUCTURE {
@@ -186,14 +186,14 @@ arv_buffer_get_chunk_data (ArvBuffer *buffer, guint64 chunk_id, size_t *size)
                *size = 0;
 
        g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL);
-       g_return_val_if_fail (buffer->data != NULL, NULL);
-       g_return_val_if_fail (buffer->payload_type == ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA, NULL);
+       g_return_val_if_fail (buffer->priv->data != NULL, NULL);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA, NULL);
 
-       if (buffer->status != ARV_BUFFER_STATUS_SUCCESS)
+       if (buffer->priv->status != ARV_BUFFER_STATUS_SUCCESS)
                return NULL;
 
-       data = buffer->data;
-       offset = buffer->size - sizeof (ArvChunkInfos);
+       data = buffer->priv->data;
+       offset = buffer->priv->size - sizeof (ArvChunkInfos);
        while (offset > 0) {
                infos = (ArvChunkInfos *) &data[offset];
                if (GUINT32_FROM_BE (infos->id) == chunk_id) {
@@ -216,10 +216,117 @@ arv_buffer_get_chunk_data (ArvBuffer *buffer, guint64 chunk_id, size_t *size)
        return NULL;
 }
 
+ArvBufferStatus
+arv_buffer_get_status (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), ARV_BUFFER_STATUS_UNKNOWN);
+       
+       return buffer->priv->status;
+}
+
+ArvBufferPayloadType
+arv_buffer_get_payload_type (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), -1);
+       
+       switch (buffer->priv->gvsp_payload_type) {
+               case ARV_GVSP_PAYLOAD_TYPE_IMAGE:
+                       return ARV_BUFFER_PAYLOAD_TYPE_IMAGE;
+               case ARV_GVSP_PAYLOAD_TYPE_RAWDATA:
+                       return ARV_BUFFER_PAYLOAD_TYPE_RAWDATA;
+               case ARV_GVSP_PAYLOAD_TYPE_FILE:
+                       return ARV_BUFFER_PAYLOAD_TYPE_FILE;
+               case ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA:
+                       return ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA;
+               case ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA:
+                       return ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA;
+               case ARV_GVSP_PAYLOAD_TYPE_JPEG:
+                       return ARV_BUFFER_PAYLOAD_TYPE_JPEG;
+               case ARV_GVSP_PAYLOAD_TYPE_JPEG2000:
+                       return ARV_BUFFER_PAYLOAD_TYPE_JPEG2000;
+               case ARV_GVSP_PAYLOAD_TYPE_H264:
+                       return ARV_BUFFER_PAYLOAD_TYPE_H264;
+               case ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE:
+                       return ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE;
+               default:
+                       return ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN;
+       }
+}
+
+guint64
+arv_buffer_get_timestamp (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+
+       return buffer->priv->timestamp_ns;
+}
+
+void
+arv_buffer_get_image_region (ArvBuffer *buffer, gint *x, gint *y, gint *width, gint *height)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       if (x != NULL)
+               *x = buffer->priv->x_offset;
+       if (y != NULL)
+               *y = buffer->priv->y_offset;
+       if (width != NULL)
+               *width = buffer->priv->width;
+       if (height != NULL)
+               *height = buffer->priv->height;
+}
+
+gint
+arv_buffer_get_image_width (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       return buffer->priv->width;
+}
+
+gint
+arv_buffer_get_image_height (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       return buffer->priv->height;
+}
+
+gint
+arv_buffer_get_image_x (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       return buffer->priv->x_offset;
+}
+
+gint
+arv_buffer_get_image_y (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       return buffer->priv->y_offset;
+}
+
+ArvPixelFormat
+arv_buffer_get_image_pixel_format (ArvBuffer *buffer)
+{
+       g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0);
+       g_return_val_if_fail (buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE, 0);
+
+       return buffer->priv->pixel_format;
+}
+
 static void
 arv_buffer_init (ArvBuffer *buffer)
 {
-       buffer->status = ARV_BUFFER_STATUS_CLEARED;
+       buffer->priv = G_TYPE_INSTANCE_GET_PRIVATE (buffer, ARV_TYPE_BUFFER, ArvBufferPrivate);
+       buffer->priv->status = ARV_BUFFER_STATUS_CLEARED;
 }
 
 static void
@@ -227,24 +334,26 @@ arv_buffer_finalize (GObject *object)
 {
        ArvBuffer *buffer = ARV_BUFFER (object);
 
-       if (!buffer->is_preallocated) {
-               g_free (buffer->data);
-               buffer->data = NULL;
-               buffer->size = 0;
+       if (!buffer->priv->is_preallocated) {
+               g_free (buffer->priv->data);
+               buffer->priv->data = NULL;
+               buffer->priv->size = 0;
        }
 
-       if (buffer->user_data && buffer->user_data_destroy_func)
-               buffer->user_data_destroy_func (buffer->user_data);
+       if (buffer->priv->user_data && buffer->priv->user_data_destroy_func)
+               buffer->priv->user_data_destroy_func (buffer->priv->user_data);
 
        parent_class->finalize (object);
 }
 
 static void
-arv_buffer_class_init (ArvBufferClass *node_class)
+arv_buffer_class_init (ArvBufferClass *this_class)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (node_class);
+       GObjectClass *object_class = G_OBJECT_CLASS (this_class);
+
+       g_type_class_add_private (this_class, sizeof (ArvBufferPrivate));
 
-       parent_class = g_type_class_peek_parent (node_class);
+       parent_class = g_type_class_peek_parent (this_class);
 
        object_class->finalize = arv_buffer_finalize;
 }
diff --git a/src/arvbuffer.h b/src/arvbuffer.h
index 3fef727..6129d96 100644
--- a/src/arvbuffer.h
+++ b/src/arvbuffer.h
@@ -24,7 +24,6 @@
 #define ARV_BUFFER_H
 
 #include <arvtypes.h>
-#include <arvgvsp.h>
 
 G_BEGIN_DECLS
 
@@ -32,6 +31,7 @@ typedef void (*ArvFrameCallback)      (ArvBuffer *buffer);
 
 /**
  * ArvBufferStatus:
+ * @ARV_BUFFER_STATUS_UNKNOWN: unknown status
  * @ARV_BUFFER_STATUS_SUCCESS: the buffer contains a valid image
  * @ARV_BUFFER_STATUS_CLEARED: the buffer is cleared
  * @ARV_BUFFER_STATUS_TIMEOUT: timeout was reached before all packets are received
@@ -43,7 +43,8 @@ typedef void (*ArvFrameCallback)      (ArvBuffer *buffer);
  */
 
 typedef enum {
-       ARV_BUFFER_STATUS_SUCCESS,
+       ARV_BUFFER_STATUS_UNKNOWN = -1,
+       ARV_BUFFER_STATUS_SUCCESS = 0,
        ARV_BUFFER_STATUS_CLEARED,
        ARV_BUFFER_STATUS_TIMEOUT,
        ARV_BUFFER_STATUS_MISSING_PACKETS,
@@ -53,6 +54,33 @@ typedef enum {
        ARV_BUFFER_STATUS_ABORTED
 } ArvBufferStatus;
 
+/**
+ * ArvBufferPayloadType:
+ * @ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN: unknown payload type
+ * @ARV_BUFFER_PAYLOAD_TYPE_IMAGE: image data
+ * @ARV_BUFFER_PAYLOAD_TYPE_RAWDATA: raw data
+ * @ARV_BUFFER_PAYLOAD_TYPE_FILE: file
+ * @ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA: chunk data
+ * @ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: extended chunk data
+ * @ARV_BUFFER_PAYLOAD_TYPE_JPEG: JPEG data
+ * @ARV_BUFFER_PAYLOAD_TYPE_JPEG2000: JPEG2000 data
+ * @ARV_BUFFER_PAYLOAD_TYPE_H264: h264 data
+ * @ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE: multizone image
+*/
+
+typedef enum {
+       ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN =               -1,
+       ARV_BUFFER_PAYLOAD_TYPE_IMAGE =                 0x0001,
+       ARV_BUFFER_PAYLOAD_TYPE_RAWDATA =               0x0002,
+       ARV_BUFFER_PAYLOAD_TYPE_FILE =                  0x0003,
+       ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA =            0x0004,
+       ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA =   0x0005, /* Deprecated */
+       ARV_BUFFER_PAYLOAD_TYPE_JPEG =                  0x0006,
+       ARV_BUFFER_PAYLOAD_TYPE_JPEG2000 =              0x0007,
+       ARV_BUFFER_PAYLOAD_TYPE_H264 =                  0x0008,
+       ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE =       0x0009
+} ArvBufferPayloadType;
+
 #define ARV_TYPE_BUFFER             (arv_buffer_get_type ())
 #define ARV_BUFFER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_BUFFER, ArvBuffer))
 #define ARV_BUFFER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_BUFFER, ArvBufferClass))
@@ -60,31 +88,13 @@ typedef enum {
 #define ARV_IS_BUFFER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_BUFFER))
 #define ARV_BUFFER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_BUFFER, ArvBufferClass))
 
+typedef struct _ArvBufferPrivate ArvBufferPrivate;
 typedef struct _ArvBufferClass ArvBufferClass;
 
 struct _ArvBuffer {
        GObject object;
 
-       size_t size;
-       gboolean is_preallocated;
-       void *data;
-
-       void *user_data;
-       GDestroyNotify user_data_destroy_func;
-
-       ArvBufferStatus status;
-
-       ArvGvspPayloadType payload_type;
-
-       guint32 frame_id;
-       guint64 timestamp_ns;
-
-       guint32 x_offset;
-       guint32 y_offset;
-       guint32 width;
-       guint32 height;
-
-       ArvPixelFormat pixel_format;
+       ArvBufferPrivate *priv;
 };
 
 struct _ArvBufferClass {
@@ -93,12 +103,25 @@ struct _ArvBufferClass {
 
 GType arv_buffer_get_type (void);
 
-ArvBuffer *    arv_buffer_new_allocate         (size_t size);
-ArvBuffer *    arv_buffer_new                  (size_t size, void *preallocated);
-ArvBuffer *    arv_buffer_new_full             (size_t size, void *preallocated,
-                                                void *user_data, GDestroyNotify user_data_destroy_func);
-const void *   arv_buffer_get_data             (ArvBuffer *buffer, size_t *size);
-const void *   arv_buffer_get_chunk_data       (ArvBuffer *buffer, guint64 chunk_id, size_t *size);
+ArvBuffer *            arv_buffer_new_allocate         (size_t size);
+ArvBuffer *            arv_buffer_new                  (size_t size, void *preallocated);
+ArvBuffer *            arv_buffer_new_full             (size_t size, void *preallocated,
+                                                       void *user_data, GDestroyNotify 
user_data_destroy_func);
+
+ArvBufferStatus                arv_buffer_get_status           (ArvBuffer *buffer);
+
+ArvBufferPayloadType   arv_buffer_get_payload_type     (ArvBuffer *buffer);
+guint64                        arv_buffer_get_timestamp        (ArvBuffer *buffer);
+const void *           arv_buffer_get_data             (ArvBuffer *buffer, size_t *size);
+
+void                   arv_buffer_get_image_region             (ArvBuffer *buffer, gint *x, gint *y, gint 
*width, gint *height);
+gint                   arv_buffer_get_image_width              (ArvBuffer *buffer);
+gint                   arv_buffer_get_image_height             (ArvBuffer *buffer);
+gint                   arv_buffer_get_image_x                  (ArvBuffer *buffer);
+gint                   arv_buffer_get_image_y                  (ArvBuffer *buffer);
+ArvPixelFormat         arv_buffer_get_image_pixel_format       (ArvBuffer *buffer);
+
+const void *           arv_buffer_get_chunk_data       (ArvBuffer *buffer, guint64 chunk_id, size_t *size);
 
 G_END_DECLS
 
diff --git a/src/arvbufferprivate.h b/src/arvbufferprivate.h
new file mode 100644
index 0000000..036691c
--- /dev/null
+++ b/src/arvbufferprivate.h
@@ -0,0 +1,56 @@
+/* Aravis - Digital camera library
+ *
+ * Copyright © 2009-2010 Emmanuel Pacaud
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Author: Emmanuel Pacaud <emmanuel gnome org>
+ */
+
+#ifndef ARV_BUFFER_PRIVATE_H
+#define ARV_BUFFER_PRIVATE_H
+
+#include <arvbuffer.h>
+#include <arvgvsp.h>
+
+G_BEGIN_DECLS
+
+struct _ArvBufferPrivate {
+       size_t size;
+       gboolean is_preallocated;
+       void *data;
+
+       void *user_data;
+       GDestroyNotify user_data_destroy_func;
+
+       ArvBufferStatus status;
+
+       ArvGvspPayloadType gvsp_payload_type;
+
+       guint32 frame_id;
+       guint64 timestamp_ns;
+
+       guint32 x_offset;
+       guint32 y_offset;
+       guint32 width;
+       guint32 height;
+
+       ArvPixelFormat pixel_format;
+};
+
+G_END_DECLS
+
+#endif
diff --git a/src/arvfakecamera.c b/src/arvfakecamera.c
index 92c18ad..7109732 100644
--- a/src/arvfakecamera.c
+++ b/src/arvfakecamera.c
@@ -35,7 +35,7 @@
 #include <arvgc.h>
 #include <arvgcregisternode.h>
 #include <arvgvcp.h>
-#include <arvbuffer.h>
+#include <arvbufferprivate.h>
 #include <arvdebug.h>
 #include <arvmisc.h>
 #include <string.h>
@@ -200,22 +200,22 @@ arv_fake_camera_diagonal_ramp (ArvBuffer *buffer, void *fill_pattern_data,
        if (pixel_format != ARV_PIXEL_FORMAT_MONO_8)
                return;
 
-       width = buffer->width;
-       height = buffer->height;
+       width = buffer->priv->width;
+       height = buffer->priv->height;
 
        scale = 1.0 + gain + log10 ((double) exposure_time_us / 10000.0);
 
        for (y = 0; y < height; y++)
                for (x = 0; x < width; x++) {
-                       pixel_value = (x + buffer->frame_id + y) % 255;
+                       pixel_value = (x + buffer->priv->frame_id + y) % 255;
                        pixel_value *= scale;
 
                        if (pixel_value < 0.0)
-                               ((unsigned char *) buffer->data)[y * width + x] = 0;
+                               ((unsigned char *) buffer->priv->data)[y * width + x] = 0;
                        else if (pixel_value > 255.0)
-                               ((unsigned char *) buffer->data)[y * width + x] = 255;
+                               ((unsigned char *) buffer->priv->data)[y * width + x] = 255;
                        else
-                               ((unsigned char *) buffer->data)[y * width + x] = pixel_value;
+                               ((unsigned char *) buffer->priv->data)[y * width + x] = pixel_value;
                }
 }
 
@@ -274,18 +274,18 @@ arv_fake_camera_fill_buffer (ArvFakeCamera *camera, ArvBuffer *buffer, guint32 *
        height = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_HEIGHT);
        payload = width * height;
 
-       if (buffer->size < payload) {
-               buffer->status = ARV_BUFFER_STATUS_SIZE_MISMATCH;
+       if (buffer->priv->size < payload) {
+               buffer->priv->status = ARV_BUFFER_STATUS_SIZE_MISMATCH;
                return;
        }
 
-       buffer->payload_type = ARV_GVSP_PAYLOAD_TYPE_IMAGE;
-       buffer->width = width;
-       buffer->height = height;
-       buffer->status = ARV_BUFFER_STATUS_SUCCESS;
-       buffer->timestamp_ns = ((guint64) time.tv_sec) * 1000000000LL + time.tv_nsec;
-       buffer->frame_id = camera->priv->frame_id++;
-       buffer->pixel_format = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT);
+       buffer->priv->gvsp_payload_type = ARV_GVSP_PAYLOAD_TYPE_IMAGE;
+       buffer->priv->width = width;
+       buffer->priv->height = height;
+       buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS;
+       buffer->priv->timestamp_ns = ((guint64) time.tv_sec) * 1000000000LL + time.tv_nsec;
+       buffer->priv->frame_id = camera->priv->frame_id++;
+       buffer->priv->pixel_format = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT);
 
 #if GLIB_CHECK_VERSION(2,32,0)
        g_mutex_lock (&camera->priv->fill_pattern_mutex);
diff --git a/src/arvfakegvcamera.c b/src/arvfakegvcamera.c
index b5dfc69..f6f7f40 100644
--- a/src/arvfakegvcamera.c
+++ b/src/arvfakegvcamera.c
@@ -21,6 +21,9 @@
  */
 
 #include <arv.h>
+#include <arvbufferprivate.h>
+#include <arvgvcp.h>
+#include <arvgvsp.h>
 #include <stdlib.h>
 #include <string.h>
 #include <net/if.h>
@@ -135,12 +138,12 @@ arv_fake_gv_camera_thread (void *user_data)
                        block_id = 0;
 
                        packet_size = ARV_FAKE_GV_CAMERA_BUFFER_SIZE;
-                       arv_gvsp_packet_new_data_leader (image_buffer->frame_id,
+                       arv_gvsp_packet_new_data_leader (image_buffer->priv->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,
+                                                        image_buffer->priv->timestamp_ns,
+                                                        image_buffer->priv->pixel_format,
+                                                        image_buffer->priv->width, 
image_buffer->priv->height,
+                                                        image_buffer->priv->x_offset, 
image_buffer->priv->y_offset,
                                                         packet_buffer, &packet_size);
 
                        g_socket_send_to (gv_camera->gvsp_socket, stream_address,
@@ -162,8 +165,8 @@ arv_fake_gv_camera_thread (void *user_data)
                                                 payload - offset);
 
                                packet_size = ARV_FAKE_GV_CAMERA_BUFFER_SIZE;
-                               arv_gvsp_packet_new_data_block (image_buffer->frame_id, block_id,
-                                                               data_size, ((char *) image_buffer->data) + 
offset,
+                               arv_gvsp_packet_new_data_block (image_buffer->priv->frame_id, block_id,
+                                                               data_size, ((char *) 
image_buffer->priv->data) + offset,
                                                                packet_buffer, &packet_size);
 
                                g_socket_send_to (gv_camera->gvsp_socket, stream_address,
@@ -174,7 +177,7 @@ arv_fake_gv_camera_thread (void *user_data)
                        }
 
                        packet_size = ARV_FAKE_GV_CAMERA_BUFFER_SIZE;
-                       arv_gvsp_packet_new_data_trailer (image_buffer->frame_id, block_id,
+                       arv_gvsp_packet_new_data_trailer (image_buffer->priv->frame_id, block_id,
                                                          packet_buffer, &packet_size);
 
                        g_socket_send_to (gv_camera->gvsp_socket, stream_address,
diff --git a/src/arvfakestream.c b/src/arvfakestream.c
index 6301a50..0a1c309 100644
--- a/src/arvfakestream.c
+++ b/src/arvfakestream.c
@@ -26,7 +26,7 @@
  */
 
 #include <arvfakestream.h>
-#include <arvbuffer.h>
+#include <arvbufferprivate.h>
 #include <arvdebug.h>
 #include <arvmisc.h>
 
@@ -73,7 +73,7 @@ arv_fake_stream_thread (void *data)
                buffer = arv_stream_pop_input_buffer (thread_data->stream);
                if (buffer != NULL) {
                        arv_fake_camera_fill_buffer (thread_data->camera, buffer, NULL);
-                       if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
+                       if (buffer->priv->status == ARV_BUFFER_STATUS_SUCCESS)
                                thread_data->n_completed_buffers++;
                        else
                                thread_data->n_failures++;
diff --git a/src/arvgvsp.h b/src/arvgvsp.h
index f8e48ba..80fde45 100644
--- a/src/arvgvsp.h
+++ b/src/arvgvsp.h
@@ -66,12 +66,11 @@ typedef enum {
  * @ARV_GVSP_PAYLOAD_TYPE_RAWDATA: raw data
  * @ARV_GVSP_PAYLOAD_TYPE_FILE: file
  * @ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA: chunk data
- * @ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: extended chink data
+ * @ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: extended chunk data
  * @ARV_GVSP_PAYLOAD_TYPE_JPEG: JPEG data
  * @ARV_GVSP_PAYLOAD_TYPE_JPEG2000: JPEG2000 data
  * @ARV_GVSP_PAYLOAD_TYPE_H264: h264 data
  * @ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE: multizone image
- * @ARV_GVSP_PAYLOAD_TYPE_DEVICE_PSECIFIC_START: device specific
 */
 
 typedef enum {
@@ -83,8 +82,7 @@ typedef enum {
        ARV_GVSP_PAYLOAD_TYPE_JPEG =                    0x0006,
        ARV_GVSP_PAYLOAD_TYPE_JPEG2000 =                0x0007,
        ARV_GVSP_PAYLOAD_TYPE_H264 =                    0x0008,
-       ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE =         0x0009,
-       ARV_GVSP_PAYLOAD_TYPE_DEVICE_PSECIFIC_START =   0x8000
+       ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE =         0x0009
 } ArvGvspPayloadType;
 
 #define ARAVIS_PACKED_STRUCTURE __attribute__((__packed__))
diff --git a/src/arvgvstream.c b/src/arvgvstream.c
index 5948b17..5fe9b81 100644
--- a/src/arvgvstream.c
+++ b/src/arvgvstream.c
@@ -26,7 +26,7 @@
  */
 
 #include <arvgvstream.h>
-#include <arvbuffer.h>
+#include <arvbufferprivate.h>
 #include <arvgvsp.h>
 #include <arvgvcp.h>
 #include <arvdebug.h>
@@ -167,9 +167,9 @@ _update_socket (ArvGvStreamThreadData *thread_data, ArvBuffer *buffer)
                        break;
                case ARV_GV_STREAM_SOCKET_BUFFER_AUTO:
                        if (thread_data->socket_buffer_size <= 0)
-                               buffer_size = buffer->size;
+                               buffer_size = buffer->priv->size;
                        else
-                               buffer_size = MIN (buffer->size, thread_data->socket_buffer_size);
+                               buffer_size = MIN (buffer->priv->size, thread_data->socket_buffer_size);
                        break;
        }
 
@@ -186,30 +186,36 @@ _process_data_leader (ArvGvStreamThreadData *thread_data,
                      ArvGvspPacket *packet,
                      guint32 packet_id)
 {
-       if (frame->buffer->status != ARV_BUFFER_STATUS_FILLING)
+       if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING)
                return;
 
        if (packet_id != 0) {
-               frame->buffer->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
+               frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
                return;
        }
 
-       frame->buffer->payload_type = arv_gvsp_packet_get_payload_type (packet);
-       frame->buffer->x_offset = arv_gvsp_packet_get_x_offset (packet);
-       frame->buffer->y_offset = arv_gvsp_packet_get_y_offset (packet);
-       frame->buffer->width = arv_gvsp_packet_get_width (packet);
-       frame->buffer->height = arv_gvsp_packet_get_height (packet);
-       frame->buffer->pixel_format = arv_gvsp_packet_get_pixel_format (packet);
-       frame->buffer->frame_id = arv_gvsp_packet_get_frame_id (packet);
-
-       if (G_LIKELY (thread_data->timestamp_tick_frequency != 0))
-               frame->buffer->timestamp_ns = arv_gvsp_packet_get_timestamp (packet,
-                                                                            
thread_data->timestamp_tick_frequency);
-       else {
-               GTimeVal time;
-
-               g_get_current_time (&time);
-               frame->buffer->timestamp_ns = ((guint64) time.tv_sec * 1000000000LL) + ((guint64) 
time.tv_usec * 1000) ;
+       frame->buffer->priv->gvsp_payload_type = arv_gvsp_packet_get_payload_type (packet);
+       frame->buffer->priv->frame_id = arv_gvsp_packet_get_frame_id (packet);
+
+       if (frame->buffer->priv->gvsp_payload_type != ARV_GVSP_PAYLOAD_TYPE_H264) {
+               if (G_LIKELY (thread_data->timestamp_tick_frequency != 0))
+                       frame->buffer->priv->timestamp_ns = arv_gvsp_packet_get_timestamp (packet,
+                                                                                          
thread_data->timestamp_tick_frequency);
+               else {
+                       GTimeVal time;
+
+                       g_get_current_time (&time);
+                       frame->buffer->priv->timestamp_ns = ((guint64) time.tv_sec * 1000000000LL) + 
((guint64) time.tv_usec * 1000) ;
+               }
+       } else
+               frame->buffer->priv->timestamp_ns = g_get_real_time () * 1000LL;
+
+       if (frame->buffer->priv->gvsp_payload_type == ARV_GVSP_PAYLOAD_TYPE_IMAGE) {
+               frame->buffer->priv->x_offset = arv_gvsp_packet_get_x_offset (packet);
+               frame->buffer->priv->y_offset = arv_gvsp_packet_get_y_offset (packet);
+               frame->buffer->priv->width = arv_gvsp_packet_get_width (packet);
+               frame->buffer->priv->height = arv_gvsp_packet_get_height (packet);
+               frame->buffer->priv->pixel_format = arv_gvsp_packet_get_pixel_format (packet);
        }
 
        if (frame->packet_data[packet_id].time_us > 0) {
@@ -230,12 +236,12 @@ _process_data_block (ArvGvStreamThreadData *thread_data,
        ptrdiff_t block_offset;
        ptrdiff_t block_end;
 
-       if (frame->buffer->status != ARV_BUFFER_STATUS_FILLING)
+       if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING)
                return;
 
        if (packet_id > frame->n_packets - 2 || packet_id < 1) {
                arv_gvsp_packet_debug (packet, read_count, ARV_DEBUG_LEVEL_DEBUG);
-               frame->buffer->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
+               frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
                return;
        }
 
@@ -243,18 +249,18 @@ _process_data_block (ArvGvStreamThreadData *thread_data,
        block_offset = (packet_id - 1) * thread_data->data_size;
        block_end = block_size + block_offset;
 
-       if (block_end > frame->buffer->size) {
+       if (block_end > frame->buffer->priv->size) {
                arv_debug_stream_thread ("[GvStream::_process_data_block] %d unexpected bytes in packet %u "
                                         " for frame %u",
-                                        block_end - frame->buffer->size,
+                                        block_end - frame->buffer->priv->size,
                                         packet_id, frame->frame_id);
                thread_data->n_size_mismatch_errors++;
 
-               block_end = frame->buffer->size;
+               block_end = frame->buffer->priv->size;
                block_size = block_end - block_offset;
        }
 
-       memcpy (((char *) frame->buffer->data) + block_offset, &packet->data, block_size);
+       memcpy (((char *) frame->buffer->priv->data) + block_offset, &packet->data, block_size);
 
        if (frame->packet_data[packet_id].time_us > 0) {
                thread_data->n_resent_packets++;
@@ -269,11 +275,11 @@ _process_data_trailer (ArvGvStreamThreadData *thread_data,
                       ArvGvspPacket *packet,
                       guint32 packet_id)
 {
-       if (frame->buffer->status != ARV_BUFFER_STATUS_FILLING)
+       if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING)
                return;
 
        if (packet_id != frame->n_packets - 1) {
-               frame->buffer->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
+               frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID;
                return;
        }
 
@@ -329,8 +335,8 @@ _find_frame_data (ArvGvStreamThreadData *thread_data,
 
        frame->buffer = buffer;
        _update_socket (thread_data, frame->buffer);
-       frame->buffer->status = ARV_BUFFER_STATUS_FILLING;
-       n_packets = (frame->buffer->size + thread_data->data_size - 1) / thread_data->data_size + 2;
+       frame->buffer->priv->status = ARV_BUFFER_STATUS_FILLING;
+       n_packets = (frame->buffer->priv->size + thread_data->data_size - 1) / thread_data->data_size + 2;
 
        frame->first_packet_time_us = time_us;
        frame->last_packet_time_us = time_us;
@@ -422,20 +428,20 @@ _close_frame (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame)
        GTimeVal current_time;
        gint64 current_time_us;
 
-       if (frame->buffer->status == ARV_BUFFER_STATUS_SUCCESS)
+       if (frame->buffer->priv->status == ARV_BUFFER_STATUS_SUCCESS)
                thread_data->n_completed_buffers++;
        else
-               if (frame->buffer->status != ARV_BUFFER_STATUS_ABORTED)
+               if (frame->buffer->priv->status != ARV_BUFFER_STATUS_ABORTED)
                        thread_data->n_failures++;
 
-       if (frame->buffer->status == ARV_BUFFER_STATUS_TIMEOUT)
+       if (frame->buffer->priv->status == ARV_BUFFER_STATUS_TIMEOUT)
                thread_data->n_timeouts++;
 
-       if (frame->buffer->status == ARV_BUFFER_STATUS_ABORTED)
+       if (frame->buffer->priv->status == ARV_BUFFER_STATUS_ABORTED)
                thread_data->n_aborteds++;
 
-       if (frame->buffer->status != ARV_BUFFER_STATUS_SUCCESS &&
-           frame->buffer->status != ARV_BUFFER_STATUS_ABORTED)
+       if (frame->buffer->priv->status != ARV_BUFFER_STATUS_SUCCESS &&
+           frame->buffer->priv->status != ARV_BUFFER_STATUS_ABORTED)
                thread_data->n_missing_packets += (int) frame->n_packets - (frame->last_valid_packet + 1);
 
        if (thread_data->callback != NULL)
@@ -448,7 +454,7 @@ _close_frame (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame)
        if (thread_data->statistic_count > 5) {
                arv_statistic_fill (thread_data->statistic, 0,
                                    current_time_us - frame->first_packet_time_us,
-                                   frame->buffer->frame_id);
+                                   frame->buffer->priv->frame_id);
        } else
                thread_data->statistic_count++;
 
@@ -478,7 +484,7 @@ _check_frame_completion (ArvGvStreamThreadData *thread_data,
                if (can_close_frame &&
                    thread_data->packet_resend == ARV_GV_STREAM_PACKET_RESEND_NEVER &&
                    iter->next != NULL) {
-                       frame->buffer->status = ARV_BUFFER_STATUS_MISSING_PACKETS;
+                       frame->buffer->priv->status = ARV_BUFFER_STATUS_MISSING_PACKETS;
                        arv_debug_stream_thread ("[GvStream::_check_frame_completion] Incomplete frame %u",
                                                 frame->frame_id);
                        _close_frame (thread_data, frame);
@@ -490,7 +496,7 @@ _check_frame_completion (ArvGvStreamThreadData *thread_data,
 
                if (can_close_frame &&
                    frame->last_valid_packet == frame->n_packets - 1) {
-                       frame->buffer->status = ARV_BUFFER_STATUS_SUCCESS;
+                       frame->buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS;
                        arv_log_stream_thread ("[GvStream::_check_frame_completion] Completed frame %u",
                                               frame->frame_id);
                        _close_frame (thread_data, frame);
@@ -502,7 +508,7 @@ _check_frame_completion (ArvGvStreamThreadData *thread_data,
 
                if (can_close_frame &&
                    time_us - frame->last_packet_time_us >= thread_data->frame_retention_us) {
-                       frame->buffer->status = ARV_BUFFER_STATUS_TIMEOUT;
+                       frame->buffer->priv->status = ARV_BUFFER_STATUS_TIMEOUT;
                        arv_debug_stream_thread ("[GvStream::_check_frame_completion] Timeout for frame %u "
                                                 "at dt = %Lu",
                                                 frame->frame_id,
@@ -547,7 +553,7 @@ _flush_frames (ArvGvStreamThreadData *thread_data)
 
        for (iter = thread_data->frames; iter != NULL; iter = iter->next) {
                frame = iter->data;
-               frame->buffer->status = ARV_BUFFER_STATUS_ABORTED;
+               frame->buffer->priv->status = ARV_BUFFER_STATUS_ABORTED;
                _close_frame (thread_data, frame);
        }
 
diff --git a/tests/arvcameratest.c b/tests/arvcameratest.c
index 4582afe..5064de0 100644
--- a/tests/arvcameratest.c
+++ b/tests/arvcameratest.c
@@ -109,7 +109,7 @@ new_buffer_cb (ArvStream *stream, ApplicationData *data)
 
        buffer = arv_stream_try_pop_buffer (stream);
        if (buffer != NULL) {
-               if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
+               if (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_SUCCESS)
                        data->buffer_count++;
                /* Image processing here */
                arv_stream_push_buffer (stream, buffer);
diff --git a/tests/arvexample.c b/tests/arvexample.c
index 20b865f..e75a7e0 100644
--- a/tests/arvexample.c
+++ b/tests/arvexample.c
@@ -23,7 +23,7 @@ new_buffer_cb (ArvStream *stream, ApplicationData *data)
 
        buffer = arv_stream_try_pop_buffer (stream);
        if (buffer != NULL) {
-               if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
+               if (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_SUCCESS)
                        data->buffer_count++;
                /* Image processing here */
                arv_stream_push_buffer (stream, buffer);
diff --git a/tests/arvtest.c b/tests/arvtest.c
index 27d9c1e..4003a6c 100644
--- a/tests/arvtest.c
+++ b/tests/arvtest.c
@@ -1,5 +1,7 @@
 #include <arv.h>
 #include <stdlib.h>
+#include "../src/arvgvsp.h"
+#include "../src/arvgvcp.h"
 
 static gboolean cancel = FALSE;
 
diff --git a/tests/buffer.c b/tests/buffer.c
index 3badf32..2dc6705 100644
--- a/tests/buffer.c
+++ b/tests/buffer.c
@@ -5,17 +5,19 @@ static void
 simple_buffer_test (void)
 {
        ArvBuffer *buffer;
+       size_t size;
+       const void *data;
 
        buffer = arv_buffer_new (1024, NULL);
 
        g_assert (ARV_IS_BUFFER (buffer));
-       g_assert (buffer->data != NULL);
-       g_assert (buffer->size == 1024);
 
-       g_assert (buffer->user_data == NULL);
-       g_assert (buffer->user_data_destroy_func == NULL);
+       data = arv_buffer_get_data (buffer, &size);
 
-       g_assert (buffer->status == ARV_BUFFER_STATUS_CLEARED);
+       g_assert (data != NULL);
+       g_assert (size == 1024);
+
+       g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED);
 
        g_object_unref (buffer);
 }
@@ -28,12 +30,10 @@ preallocated_buffer_test (void)
 
        buffer = arv_buffer_new (1024, data);
        g_assert (ARV_IS_BUFFER (buffer));
-       g_assert (buffer->data == data);
 
-       g_assert (buffer->user_data == NULL);
-       g_assert (buffer->user_data_destroy_func == NULL);
+       g_assert (arv_buffer_get_data (buffer, NULL) == data);
 
-       g_assert (buffer->status == ARV_BUFFER_STATUS_CLEARED);
+       g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED);
 
        g_object_unref (buffer);
 }
@@ -49,18 +49,19 @@ full_buffer_test (void)
 {
        ArvBuffer *buffer;
        int value = 1234;
-
+       const void *data;
+       size_t size;
 
        buffer = arv_buffer_new_full (1024, NULL, &value, full_buffer_destroy_func);
 
        g_assert (ARV_IS_BUFFER (buffer));
-       g_assert (buffer->data != NULL);
-       g_assert (buffer->size == 1024);
 
-       g_assert (buffer->user_data == &value);
-       g_assert (buffer->user_data_destroy_func == full_buffer_destroy_func);
+       data = arv_buffer_get_data (buffer, &size);
+
+       g_assert (data != NULL);
+       g_assert (size == 1024);
 
-       g_assert (buffer->status == ARV_BUFFER_STATUS_CLEARED);
+       g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED);
 
        g_object_unref (buffer);
 
diff --git a/tests/genicam.c b/tests/genicam.c
index c0b0885..d179284 100644
--- a/tests/genicam.c
+++ b/tests/genicam.c
@@ -1,6 +1,7 @@
 #include <glib.h>
 #include <arv.h>
 #include <string.h>
+#include "../src/arvbufferprivate.h"
 
 typedef struct {
        const char *name;
@@ -394,9 +395,7 @@ mandatory_test (void)
        g_object_unref (device);
 }
 
-#define ARAVIS_PACKED_STRUCTURE __attribute__((__packed__))
-
-typedef struct ARAVIS_PACKED_STRUCTURE {
+typedef struct __attribute__((__packed__)) {
        guint32 id;
        guint32 size;
 } ArvChunkInfos;
@@ -415,8 +414,8 @@ create_buffer_with_chunk_data (void)
        size = 64 + 64 + 8 + 3 * sizeof (ArvChunkInfos);
 
        buffer = arv_buffer_new (size, NULL);
-       buffer->payload_type = ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA;
-       buffer->status = ARV_BUFFER_STATUS_SUCCESS;
+       buffer->priv->gvsp_payload_type = ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA;
+       buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS;
        data = arv_buffer_get_data (buffer, &size);
 
        memset ((char *) data, '\0', size);
diff --git a/viewer/arvviewer.c b/viewer/arvviewer.c
index 72560d8..77b1092 100644
--- a/viewer/arvviewer.c
+++ b/viewer/arvviewer.c
@@ -148,12 +148,18 @@ arv_viewer_new_buffer_cb (ArvStream *stream, ArvViewer *viewer)
        if (arv_buffer == NULL)
                return;
 
-       if (arv_buffer->status == ARV_BUFFER_STATUS_SUCCESS) {
+       if (arv_buffer_get_status (arv_buffer) == ARV_BUFFER_STATUS_SUCCESS) {
                int arv_row_stride;
+               int width, height;
+               char *buffer_data;
+               size_t buffer_size;
+               guint64 timestamp_ns;
 
-               arv_row_stride = arv_buffer->width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL 
(arv_buffer->pixel_format) / 8;
+               timestamp_ns =  g_get_real_time () * 1000LL;
 
-               arv_buffer->timestamp_ns = g_get_real_time () * 1000LL;
+               buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size);
+               arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height);
+               arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format 
(arv_buffer)) / 8;
 
                /* Gstreamer requires row stride to be a multiple of 4 */
                if ((arv_row_stride & 0x3) != 0) {
@@ -164,30 +170,26 @@ arv_viewer_new_buffer_cb (ArvStream *stream, ArvViewer *viewer)
 
                        gst_row_stride = (arv_row_stride & ~(0x3)) + 4;
 
-                       size = arv_buffer->height * gst_row_stride;
+                       size = height * gst_row_stride;
                        data = g_malloc (size); 
 
-                       for (i = 0; i < arv_buffer->height; i++)
-                               memcpy (((char *) data) + i * gst_row_stride, ((char *) arv_buffer->data) + i 
* arv_row_stride, arv_row_stride);
+                       for (i = 0; i < height; i++)
+                               memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * 
arv_row_stride, arv_row_stride);
 
                        buffer = gst_buffer_new_wrapped (data, size);
                } else {
                        buffer = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY,
-                               arv_buffer->data,
-                               arv_buffer->size,
-                               0,
-                               arv_buffer->size,
-                               NULL,
-                               NULL);
+                                                             buffer_data, buffer_size,
+                                                             0, buffer_size, NULL, NULL);
                }
 
                if (viewer->timestamp_offset == 0) {
-                       viewer->timestamp_offset = arv_buffer->timestamp_ns;
-                       viewer->last_timestamp = arv_buffer->timestamp_ns;
+                       viewer->timestamp_offset = timestamp_ns;
+                       viewer->last_timestamp = timestamp_ns;
                }
 
-               GST_BUFFER_DTS (buffer) = arv_buffer->timestamp_ns - viewer->timestamp_offset;
-               GST_BUFFER_DURATION (buffer) = arv_buffer->timestamp_ns - viewer->last_timestamp;
+               GST_BUFFER_DTS (buffer) = timestamp_ns - viewer->timestamp_offset;
+               GST_BUFFER_DURATION (buffer) = timestamp_ns - viewer->last_timestamp;
 
                gst_app_src_push_buffer (GST_APP_SRC (viewer->appsrc), buffer);
        }
@@ -407,10 +409,16 @@ arv_viewer_snapshot_cb (GtkButton *button, ArvViewer *viewer)
        char *filename;
        GDateTime *date;
        char *date_string;
+       int width, height;
+       const char *data;
+       size_t size;
 
        g_return_if_fail (ARV_IS_CAMERA (viewer->camera));
        g_return_if_fail (ARV_IS_BUFFER (viewer->last_buffer));
 
+       arv_buffer_get_image_region (viewer->last_buffer, NULL, NULL, &width, &height);
+       data = arv_buffer_get_data (viewer->last_buffer, &size);
+
        path = g_build_filename (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES),
                                         "Aravis", NULL);
        file = g_file_new_for_path (path);
@@ -423,13 +431,13 @@ arv_viewer_snapshot_cb (GtkButton *button, ArvViewer *viewer)
        filename = g_strdup_printf ("%s-%s-%d-%d-%s-%s.raw",
                                    arv_camera_get_vendor_name (viewer->camera),
                                    arv_camera_get_device_id (viewer->camera),
-                                   viewer->last_buffer->width,
-                                   viewer->last_buffer->height,
+                                   width,
+                                   height,
                                    viewer->pixel_format_string != NULL ? viewer->pixel_format_string : 
"Unknown",
                                    date_string);
        path = g_build_filename (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES),
                                 "Aravis", filename, NULL);
-       g_file_set_contents (path, viewer->last_buffer->data, viewer->last_buffer->size, NULL);
+       g_file_set_contents (path, data, size, NULL);
 
        if (viewer->notification) {
                notify_notification_update (viewer->notification,



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