- ogg_page page;
- ogg_packet packet;
- vorbis_comment vc;
- vorbis_info vi;
- ogg_stream_state *stream_in = para_malloc(sizeof(ogg_stream_state));
- ogg_stream_state *stream_out = para_malloc(sizeof(ogg_stream_state));
- ogg_sync_state *sync_in = para_malloc(sizeof(ogg_sync_state));
-
- ogg_sync_init(sync_in);
- vorbis_info_init(&vi);
- vorbis_comment_init(&vc);
- buf = ogg_sync_buffer(sync_in, (long)len);
- memcpy(buf, map, len);
- ogg_sync_wrote(sync_in, (long)len);
- ret = -E_SYNC_PAGEOUT;
- if (ogg_sync_pageout(sync_in, &page) <= 0) {
- free(stream_in);
- free(stream_out);
- goto err1;
- }
- serial = ogg_page_serialno(&page);
- ogg_stream_init(stream_in, serial);
- ogg_stream_init(stream_out, serial);
- ret = ogg_stream_pagein(stream_in, &page);
- if (ret < 0) {
- ret = -E_STREAM_PAGEIN;
- goto err2;
- }
- ret = ogg_stream_packetout(stream_in, &packet);
- if (ret != 1) {
- ret = -E_STREAM_PACKETOUT;
- goto err2;
- }
- ret = -E_VORBIS;
- if (vorbis_synthesis_headerin(&vi, &vc, &packet) < 0)
- goto err2;
- PARA_DEBUG_LOG("channels: %i, rate: %li\n", vi.channels, vi.rate);
- ogg_stream_packetin(stream_out, &packet);
-
- ret = ogg_sync_pageout(sync_in, &page);
- if (ret <= 0) {
- ret = -E_SYNC_PAGEOUT;
- goto err2;
- }
- ogg_stream_pagein(stream_in, &page);
- ogg_stream_packetout(stream_in, &packet);
- ogg_stream_packetin(stream_out, &packet);
-
- ret = ogg_sync_pageout(sync_in, &page);
- if (ret <= 0) {
- ret = -E_SYNC_PAGEOUT;
- goto err2;
- }
- ogg_stream_pagein(stream_in, &page);
- ogg_stream_packetout(stream_in, &packet);
- ogg_stream_packetin(stream_out, &packet);
-
- afi->header_len = 0;
- while (ogg_stream_flush(stream_out, &page))
- afi->header_len += page.body_len + page.header_len;
- PARA_DEBUG_LOG("header_len = %d\n", afi->header_len);
- afi->header_offset = 0;
- ret = 1;
-err2:
- ogg_stream_destroy(stream_in);
- ogg_stream_destroy(stream_out);
-err1:
- ogg_sync_destroy(sync_in);
- vorbis_info_clear(&vi);
- vorbis_comment_clear(&vc);
- return ret;
+static void add_ogg_page(ogg_page *og, struct vorbis_get_header_data *vghd)
+{
+ size_t old_len = vghd->len;
+ size_t new_len = vghd->len + og->header_len + og->body_len;
+ char *buf = para_realloc(vghd->buf, new_len), *p = buf + old_len;
+
+ memcpy(p, og->header, og->header_len);
+ memcpy(p + og->header_len, og->body, og->body_len);
+ vghd->buf = buf;
+ vghd->len = new_len;
+ PARA_DEBUG_LOG("header/body/old/new: %lu/%lu/%zu/%zu\n",
+ og->header_len, og->body_len, old_len, new_len);