From 7296b7a6f4368e8cad39169340770c78166b95cd Mon Sep 17 00:00:00 2001 From: Matthias Vogelgesang Date: Mon, 28 Feb 2011 16:34:21 +0100 Subject: Add buffer allocation --- src/grabbers/me4.c | 28 ++++++++++++++++++++++++++-- src/uca-grabber.h | 8 ++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/grabbers/me4.c b/src/grabbers/me4.c index aa61946..c879dfd 100644 --- a/src/grabbers/me4.c +++ b/src/grabbers/me4.c @@ -7,7 +7,13 @@ #include "uca.h" #include "uca-grabber.h" -#define GET_FG(grabber) ((Fg_Struct *)(grabber->user)) +struct uca_me4_grabber_t { + Fg_Struct *fg; + dma_mem *mem; +}; + +#define GET_FG(grabber) (((struct uca_me4_grabber_t *) grabber->user)->fg) +#define GET_MEM(grabber) (((struct uca_me4_grabber_t *) grabber->user)->mem) uint32_t uca_me4_destroy(struct uca_grabber_t *grabber) { @@ -24,6 +30,19 @@ uint32_t uca_me4_get_property(struct uca_grabber_t *grabber, enum uca_property_i return Fg_getParameter(GET_FG(grabber), property, data, PORT_A) == FG_OK ? UCA_NO_ERROR : UCA_ERR_PROP_GENERAL; } +uint32_t uca_me4_allocate(struct uca_grabber_t *grabber, uint32_t n_buffers) +{ + if (GET_MEM(grabber) != NULL) + /* FIXME: invent better error code */ + return UCA_ERR_PROP_GENERAL; + + uint32_t width, height; + uca_me4_get_property(grabber, FG_WIDTH, &width); + uca_me4_get_property(grabber, FG_HEIGHT, &height); + /* FIXME: get size of pixel */ + ((struct uca_me4_grabber_t *) grabber->user)->mem = Fg_AllocMemEx(GET_FG(grabber), n_buffers*width*height*sizeof(uint16_t), n_buffers); +} + uint32_t uca_me4_init(struct uca_grabber_t **grabber) { /* FIXME: find out if this board/grabber is running */ @@ -32,10 +51,15 @@ uint32_t uca_me4_init(struct uca_grabber_t **grabber) return UCA_ERR_INIT_NOT_FOUND; struct uca_grabber_t *uca = (struct uca_grabber_t *) malloc(sizeof(struct uca_grabber_t)); - uca->user = fg; + struct uca_me4_grabber_t *me4 = (struct uca_me4_grabber_t *) malloc(sizeof(struct uca_me4_grabber_t)); + + me4->fg = fg; + me4->mem = NULL; + uca->user = me4; uca->destroy = &uca_me4_destroy; uca->set_property = &uca_me4_set_property; uca->get_property = &uca_me4_get_property; + uca->allocate = &uca_me4_allocate; *grabber = uca; return UCA_NO_ERROR; diff --git a/src/uca-grabber.h b/src/uca-grabber.h index 0704610..3c48681 100644 --- a/src/uca-grabber.h +++ b/src/uca-grabber.h @@ -31,6 +31,13 @@ typedef uint32_t (*uca_grabber_set_property) (struct uca_grabber_t *grabber, enu */ typedef uint32_t (*uca_grabber_get_property) (struct uca_grabber_t *grabber, enum uca_property_ids property, void *data); +/** + * \brief Allocate buffers with current width, height and bitdepth + * \note Subsequent changes of width and height might corrupt memory + */ +typedef uint32_t (*uca_grabber_allocate) (struct uca_grabber_t *grabber, uint32_t n_buffers); + + struct uca_grabber_t { struct uca_grabber_t *next; @@ -39,6 +46,7 @@ struct uca_grabber_t { uca_grabber_destroy destroy; uca_grabber_set_property set_property; uca_grabber_get_property get_property; + uca_grabber_allocate allocate; /* Private */ void *user; -- cgit v1.2.3