diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-05-28 10:20:54 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-05-28 10:44:06 +0200 |
commit | 5912848d2edbf61158ac7edc72c2302649a0d9ed (patch) | |
tree | de76a2a48b98730f5cb92af44410e47761d0e61d /src/procqueue.c | |
parent | 62688b60c29225d557da8844d7259ce3eee962c5 (diff) |
prepare gapk for dealing with variable-length frames
The existing architecture was modelled around fixed-length codec frame
sizes, which of course fails with multi-rate codecs such as AMR.
Diffstat (limited to 'src/procqueue.c')
-rw-r--r-- | src/procqueue.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/procqueue.c b/src/procqueue.c index 2451399..66c2967 100644 --- a/src/procqueue.c +++ b/src/procqueue.c @@ -23,7 +23,7 @@ #include <gapk/procqueue.h> - +#define VAR_BUF_SIZE 320 #define MAX_PQ_ITEMS 8 struct pq { @@ -98,11 +98,16 @@ pq_prepare(struct pq *pq) for (i=0; i<pq->n_items; i++) { struct pq_item *item = pq->items[i]; - if (item->len_in != len_prev) + if (item->len_in && item->len_in != len_prev) return -EINVAL; if (i < (pq->n_items-1)) { - pq->buffers[i] = malloc(item->len_out); + unsigned int buf_size = item->len_out; + /* variable-length codec output, use maximum + * known buffer size */ + if (!buf_size) + buf_size = VAR_BUF_SIZE; + pq->buffers[i] = malloc(buf_size); if (!pq->buffers[i]) return -ENOMEM; } else{ @@ -124,8 +129,10 @@ pq_execute(struct pq *pq) { int i; void *buf_prev, *buf; + unsigned int len_prev; buf_prev = NULL; + len_prev = 0; for (i=0; i<pq->n_items; i++) { int rv; @@ -133,11 +140,14 @@ pq_execute(struct pq *pq) buf = i < (pq->n_items-1) ? pq->buffers[i] : NULL; - rv = item->proc(item->state, buf, buf_prev); - if (rv) + rv = item->proc(item->state, buf, buf_prev, len_prev); + if (rv < 0) { + fprintf(stderr, "pq_execute(): abort, item returned %d\n", rv); return rv; + } buf_prev = buf; + len_prev = rv; } return 0; |