static size_t cb_read_btr(void *buf, size_t size, size_t nmemb, void *datasource)
{
struct filter_node *fn = datasource;
+ struct private_oggdec_data *pod = fn->private_data;
struct btr_node *btrn = fn->btrn;
- size_t copied;
+ char *btr_buf;
+ size_t nbytes = btr_next_buffer(btrn, &btr_buf), tmp;
/**
* oggvorbis always uses size == 1. Other sizes would complicate the code
* for no real gain. So we simply don't support size != 1.
*/
assert(size == 1);
- //PARA_DEBUG_LOG("vorbis requests %zu x %zu = %zu bytes\n", size, nmemb, size * nmemb);
- copied = 0;
- for (;;) {
- char *btr_buf;
- size_t nbytes = btr_next_buffer(btrn, &btr_buf);
- if (nbytes == 0)
- break;
- nbytes = PARA_MIN(nmemb - copied, nbytes);
- memcpy(buf + copied, btr_buf, nbytes);
- copied += nbytes;
- btr_consume(btrn, nbytes);
- if (copied == nmemb)
- break;
- }
- return copied;
+ assert(pod->converted <= nbytes);
+ tmp = nbytes - pod->converted;
+ PARA_DEBUG_LOG("vorbis requests %zu bytes have %zu\n", nmemb, tmp);
+ tmp = PARA_MIN(tmp, nmemb);
+ if (tmp == 0)
+ return 0;
+ memcpy(buf, btr_buf + pod->converted, tmp);
+ pod->converted += tmp;
+ return tmp;
}
static size_t cb_read(void *buf, size_t size, size_t nmemb, void *datasource)
fn->private_data = pod;
fn->bufsize = conf->bufsize_arg * 1024;
fn->buf = para_malloc(fn->bufsize);
+ fn->min_iqs = 8000;
}
static void ogg_close(struct filter_node *fn)
struct timeval delay = {0, 500 * 1000};
pod->vf = para_malloc(sizeof(struct OggVorbis_File));
- PARA_NOTICE_LOG("min_iqs: %zu, opening ov callbacks\n", fn->min_iqs);
+ PARA_NOTICE_LOG("iqs: %zu, min_iqs: %zu, opening ov callbacks\n",
+ btr_get_input_queue_size(btrn), fn->min_iqs);
open:
oret = ov_open_callbacks(fn, pod->vf,
NULL, /* no initial buffer */
fn->min_iqs += 1000;
iqs = btr_get_input_queue_size(btrn);
ret = 0;
- if (iqs <= fn->min_iqs)
+ if (iqs < fn->min_iqs)
goto out;
+ PARA_CRIT_LOG("iqs: %zu\n", iqs);
btr_merge(btrn, fn->min_iqs);
+ pod->converted = 0;
goto open;
}
ret = (oret == OV_ENOTVORBIS)?
if (ret <= 0) {
free(pod->vf);
pod->vf = NULL;
- } else
+ } else {
+ btr_consume(btrn, pod->converted);
+ pod->converted = 0;
fn->min_iqs = 0;
+ }
return ret;
}
int ret;
char *in;
+ pod->converted = 0;
t->error = 0;
ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
if (ret <= 0)
char *out = para_malloc(OGGDEC_OUTPUT_CHUNK_SIZE);
ssize_t read_ret = ov_read(pod->vf, out, OGGDEC_OUTPUT_CHUNK_SIZE,
ENDIAN, 2 /* 16 bit */, 1 /* signed */, NULL);
+ btr_consume(btrn, pod->converted);
+ pod->converted = 0;
if (read_ret <= 0)
free(out);
if (read_ret == 0) {