From: Tilman Sauerbeck Date: Thu, 17 Aug 2006 16:30:51 +0000 (+0200) Subject: Reworked the loop that finds the first ogg page in the input stream. X-Git-Tag: ruby-vorbistagger-0.0.1~18 X-Git-Url: http://git.code-monkey.de/?p=ruby-vorbistagger.git;a=commitdiff_plain;h=68655900600f2bc74d9854a7bf571563edb3776c Reworked the loop that finds the first ogg page in the input stream. The loop also handles short reads gracefully now. --- diff --git a/ext/vcedit.c b/ext/vcedit.c index fd89008..46d68ee 100644 --- a/ext/vcedit.c +++ b/ext/vcedit.c @@ -264,8 +264,8 @@ vcedit_open (vcedit_state *state) { vcedit_error ret; char *buffer; - int bytes, i; - int chunks = 0; + size_t bytes, total = 0; + int i; ogg_packet *header; ogg_packet header_main, header_comments, header_codebooks; ogg_page og; @@ -276,22 +276,21 @@ vcedit_open (vcedit_state *state) ogg_sync_init (&state->oy); - while (1) { - buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE); - bytes = fread (buffer, 1, CHUNKSIZE, state->in); - - ogg_sync_wrote (&state->oy, bytes); - - if (ogg_sync_pageout (&state->oy, &og) == 1) - break; - + do { /* Bail if we don't find data in the first 40 kB */ - if (chunks++ >= 10) { + if (feof (state->in) || total >= (CHUNKSIZE * 10)) { ogg_sync_clear (&state->oy); return VCEDIT_ERR_INVAL; } - } + + buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE); + + bytes = fread (buffer, 1, CHUNKSIZE, state->in); + total += bytes; + + ogg_sync_wrote (&state->oy, bytes); + } while (ogg_sync_pageout (&state->oy, &og) != 1); state->serial = ogg_page_serialno (&og);