static void compute_group_size(struct vss_task *vsst, struct fec_group *g,
int max_bytes)
{
+ char *buf;
+ size_t len;
int i, max_chunks = PARA_MAX(1LU, 150 / tv2ms(vss_chunk_time()));
+ if (g->first_chunk == 0) {
+ g->num_chunks = 1;
+ vss_get_chunk(0, vsst, &buf, &len);
+ g->bytes = len;
+ return;
+ }
+
g->num_chunks = 0;
g->bytes = 0;
/*
* of exactly one chunk for these audio formats.
*/
for (i = 0;; i++) {
- char *buf;
- size_t len;
int chunk_num = g->first_chunk + i;
if (g->bytes > 0 && i >= max_chunks) /* duration limit */
{
int ret, i, k, n, data_slices;
size_t len;
- char *buf;
+ char *buf, *p;
struct fec_group *g = &fc->group;
if (fc->state == FEC_STATE_NONE) {
assert(i == g->num_header_slices - 1);
}
- /* setup data slices */
+ /*
+ * Setup data slices. Note that for ogg streams chunk 0 points to a
+ * buffer on the heap rather than to the mapped audio file.
+ */
vss_get_chunk(g->first_chunk, vsst, &buf, &len);
- for (; i < g->num_header_slices + data_slices; i++) {
- if (buf + g->slice_bytes > vsst->map + mmd->size) {
+ for (p = buf; i < g->num_header_slices + data_slices; i++) {
+ if (p + g->slice_bytes > buf + g->bytes) {
/*
- * Can not use the memory mapped audio file for this
- * slice as it goes beyond the map.
+ * We must make a copy for this slice since using p
+ * directly would exceed the buffer.
*/
- uint32_t payload_size = vsst->map + mmd->size - buf;
- memcpy(fc->extra_src_buf, buf, payload_size);
+ uint32_t payload_size = buf + g->bytes - p;
+ assert(payload_size + FEC_HEADER_SIZE <= fc->mps);
+ memcpy(fc->extra_src_buf, p, payload_size);
if (payload_size < g->slice_bytes)
memset(fc->extra_src_buf + payload_size, 0,
g->slice_bytes - payload_size);
i++;
break;
}
- fc->src_data[i] = (const unsigned char *)buf;
- buf += g->slice_bytes;
+ fc->src_data[i] = (const unsigned char *)p;
+ p += g->slice_bytes;
}
if (i < k) {
/* use arbitrary data for all remaining slices */