From 12a195e32fa36fd2d2b0d16f7d96f1d8651665b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Rullg=C3=A5rd?= Date: Sun, 25 Jun 2006 00:41:13 +0000 Subject: [PATCH] cleaned up buffer management Originally committed as revision 5522 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/ogg2.c | 53 +++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/libavformat/ogg2.c b/libavformat/ogg2.c index 7ce13c4f99..9cb3d8ca62 100644 --- a/libavformat/ogg2.c +++ b/libavformat/ogg2.c @@ -193,8 +193,6 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial) os = ogg->streams + idx; os->serial = serial; os->bufsize = DECODER_BUFFER_SIZE; - os->buf = av_malloc (os->bufsize); - memset (os->buf, 0, os->bufsize); os->header = -1; st = av_new_stream (s, idx); @@ -207,6 +205,23 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial) return idx; } +static int +ogg_new_buf(ogg_t *ogg, int idx) +{ + ogg_stream_t *os = ogg->streams + idx; + u_char *nb = av_malloc(os->bufsize); + int size = os->bufpos - os->pstart; + if(os->buf){ + memcpy(nb, os->buf + os->pstart, size); + av_free(os->buf); + } + os->buf = nb; + os->bufpos = size; + os->pstart = 0; + + return 0; +} + static int ogg_read_page (AVFormatContext * s, int *str) { @@ -264,6 +279,9 @@ ogg_read_page (AVFormatContext * s, int *str) os = ogg->streams + idx; + if(os->segp == os->nsegs) + ogg_new_buf(ogg, idx); + if (get_buffer (bc, os->segments, nsegs) < nsegs) return -1; @@ -310,7 +328,7 @@ ogg_read_page (AVFormatContext * s, int *str) } static int -ogg_packet (AVFormatContext * s, int *str) +ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize) { ogg_t *ogg = s->priv_data; int idx; @@ -363,14 +381,6 @@ ogg_packet (AVFormatContext * s, int *str) } if (!complete && os->segp == os->nsegs){ - uint8_t *nb = av_malloc (os->bufsize); - int size = os->bufpos - os->pstart; - memset (nb, 0, os->bufsize); - memcpy (nb, os->buf + os->pstart, size); - av_free (os->buf); - os->buf = nb; - os->bufpos = size; - os->pstart = 0; ogg->curidx = -1; } }while (!complete); @@ -401,6 +411,12 @@ ogg_packet (AVFormatContext * s, int *str) os->codec->packet (s, idx); if (str) *str = idx; + if (dstart) + *dstart = os->pstart; + if (dsize) + *dsize = os->psize; + os->pstart += os->psize; + os->psize = 0; } os->seq++; @@ -416,7 +432,7 @@ ogg_get_headers (AVFormatContext * s) ogg_t *ogg = s->priv_data; do{ - if (ogg_packet (s, NULL) < 0) + if (ogg_packet (s, NULL, NULL, NULL) < 0) return -1; }while (!ogg->headers); @@ -507,10 +523,11 @@ ogg_read_packet (AVFormatContext * s, AVPacket * pkt) ogg_t *ogg; ogg_stream_t *os; int idx = -1; + int pstart, psize; //Get an ogg packet do{ - if (ogg_packet (s, &idx) < 0) + if (ogg_packet (s, &idx, &pstart, &psize) < 0) return AVERROR_IO; }while (idx < 0 || !s->streams[idx]); @@ -518,18 +535,16 @@ ogg_read_packet (AVFormatContext * s, AVPacket * pkt) os = ogg->streams + idx; //Alloc a pkt - if (av_new_packet (pkt, os->psize) < 0) + if (av_new_packet (pkt, psize) < 0) return AVERROR_IO; pkt->stream_index = idx; - memcpy (pkt->data, os->buf + os->pstart, os->psize); + memcpy (pkt->data, os->buf + pstart, psize); if (os->lastgp != -1LL){ pkt->pts = ogg_gptopts (s, idx, os->lastgp); os->lastgp = -1; } - //next - os->pstart += os->psize; - os->psize = 0; - return os->psize; + + return psize; }