int ogv_demuxer_process() { do { // read at most this many bytes in one go // should be enough to resync ogg stream int64_t headroom = bq_headroom(bufferQueue); size_t bufsize = 65536; if (headroom < bufsize) { bufsize = headroom; } int ret = oggz_read(oggz, bufsize); //printf("demuxer returned %d on %d bytes\n", ret, bufsize); if (ret == OGGZ_ERR_STOP_OK) { // We got a packet! return 1; } else if (ret > 0) { // We read some data, but no packets yet. //printf("read %d bytes\n", ret); continue; } else if (ret == 0) { //printf("EOF %d from oggz_read\n", ret); return 0; } else if (ret < 0) { printf("Error %d from oggz_read\n", ret); return 0; } } while(1); return 0; }
int bq_read(BufferQueue *queue, char *data, size_t len) { if (bq_headroom(queue) < len) { return -1; } size_t offset = 0; size_t remaining = len; for (int i = 0; i < queue->len; i++) { if (queue->items[i].start + queue->items[i].len < queue->pos) { //printf("bq_read skipped item at pos %lld len %d\n", queue->items[i].start, queue->items[i].len); continue; } size_t chunkStart = queue->pos - queue->items[i].start; size_t chunkLen = queue->items[i].len - chunkStart; if (chunkLen > remaining) { chunkLen = remaining; } memcpy(data + offset, queue->items[i].bytes + chunkStart, chunkLen); //printf("bq_read copy chunkStart %d chunkLen %d to offset %d; from item %d start %lld len %d (pos %lld)\n", chunkStart, chunkLen, offset, i, queue->items[i].start, queue->items[i].len, queue->pos); queue->pos += chunkLen; offset += chunkLen; remaining -= chunkLen; if (remaining <= 0) { return 0; } } return -1; }
static size_t readCallback(void *user_handle, void *buf, size_t n) { BufferQueue *bq = (BufferQueue *)user_handle; size_t available = bq_headroom(bq); size_t to_read; if (n < available) { to_read = n; } else { to_read = available; } int ret = bq_read(bq, buf, to_read); if (ret < 0) { return -1; } else { return to_read; } }