para_write: Return proper error code.
[paraslash.git] / ogg_afh.c
index e2d8dbc8f9130331b2c8e2bb3523bc9e25c2a4c3..144a2690bf80da24d298ab2bb56c5403835157dc 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -85,18 +85,6 @@ static void add_ogg_page(ogg_page *og, struct vorbis_get_header_data *vghd)
                og->header_len, og->body_len, old_len, new_len);
 }
 
-/*
- * Process the first three ogg packets.
- *
- * This creates chunk zero (the audio file header) from the first three ogg
- * packets of the input file with metadata (vorbis comments) stripped off. Page
- * 0 of the input file always contains only ogg packet #0 while page 1 usually
- * contains both packets 1 (comments) and 2 (setup).  However, we always create
- * an separate ogg page for each packet to circumvent a bug in older libogg
- * versions which causes too little data being copied to the second ogg page.
- * This affects at least Ubuntu Hardy, and there is no real disadvantage in
- * creating three pages instead of two.
- */
 static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
                int serial, __a_unused struct afh_info *afhi, void *private_data)
 {
@@ -112,8 +100,7 @@ static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
                0xff /* framing bit */
        };
 
-       PARA_DEBUG_LOG("processing ogg packet #%d (%li bytes)\n",
-               packet_num, packet->bytes);
+       PARA_DEBUG_LOG("processing ogg packet #%d\n", packet_num);
        if (packet_num > 2)
                return 0;
        if (packet_num == 0) {
@@ -129,27 +116,21 @@ static int vorbis_get_header_callback(ogg_packet *packet, int packet_num,
                return 1;
        }
        if (packet_num == 1) {
-               PARA_INFO_LOG("replacing metadata packet (saved %ld bytes)\n",
-                       packet->bytes - sizeof(dummy_packet));
+               PARA_INFO_LOG("replacing metadata packet\n");
                ogg_packet replacement = *packet;
                replacement.packet = dummy_packet;
                replacement.bytes = sizeof(dummy_packet);
+               ret = ogg_stream_packetin(&vghd->os, &replacement);
+               if (ret >= 0)
+                       return 1;
                ret = -E_OGG_PACKET_IN;
-               if (ogg_stream_packetin(&vghd->os, &replacement) < 0)
-                       goto out;
-               ret = -E_OGG_STREAM_FLUSH;
-               if (ogg_stream_flush(&vghd->os, &og) == 0)
-                       goto out;
-               add_ogg_page(&og, vghd);
-               return 1;
+               goto out;
        }
        ret = -E_OGG_PACKET_IN;
        if (ogg_stream_packetin(&vghd->os, packet) < 0)
                goto out;
-       ret = -E_OGG_STREAM_FLUSH;
-       if (ogg_stream_flush(&vghd->os, &og) == 0)
-               goto out;
-       add_ogg_page(&og, vghd);
+       while (ogg_stream_flush(&vghd->os, &og))
+               add_ogg_page(&og, vghd);
        ret = 0;
 out:
        ogg_stream_clear(&vghd->os);
@@ -171,7 +152,7 @@ static void vorbis_get_header(void *map, size_t mapsize, char **buf,
                goto fail;
        *buf = vghd.buf;
        *len = vghd.len;
-       PARA_INFO_LOG("created %zu byte ogg/vorbis header chunk\n", *len);
+       PARA_INFO_LOG("created %zu byte ogg vorbis header\n", *len);
        return;
 fail:
        PARA_ERROR_LOG("%s\n", para_strerror(-ret));