# HG changeset patch # User mru # Date 1116007823 0 # Node ID c72bba158baadba3c6c0db5ea3a888bb8647bdd5 # Parent 6418c3b8d8eceda19caaf9728c90bce89d9376db change extradata format for vorbis diff -r 6418c3b8d8ec -r c72bba158baa matroska.c --- a/matroska.c Fri May 13 12:09:45 2005 +0000 +++ b/matroska.c Fri May 13 18:10:23 2005 +0000 @@ -2243,44 +2243,13 @@ /* codec_id = CODEC_ID_DTS; */ else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_AUDIO_VORBIS)) { - unsigned char *p = track->codec_priv, *cdp; - int cps = track->codec_priv_size; - int nf, s[3], cds; - int i; - - nf = *p++; - cps--; - - if(nf != 2) - continue; - - for(i = 0; i < 2; i++){ - int xv; - s[i] = 0; - do { - xv = *p++; - s[i] += xv; - cps--; - } while(xv == 255); + extradata_size = track->codec_priv_size; + if(extradata_size) { + extradata = av_malloc(extradata_size); + if(extradata == NULL) + return AVERROR_NOMEM; + memcpy(extradata, track->codec_priv, extradata_size); } - - s[2] = cps - s[0] - s[1]; - - cds = cps + 6; - extradata = cdp = av_malloc(cds); - if(extradata == NULL) - return AVERROR_NOMEM; - extradata_size = cds; - - for(i = 0; i < 3; i++){ - *cdp++ = s[i] >> 8; - *cdp++ = s[i] & 0xff; - memcpy(cdp, p, s[i]); - cdp += s[i]; - p += s[i]; - cps -= s[i]; - } - codec_id = CODEC_ID_VORBIS; } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_AUDIO_MPEG2) || diff -r 6418c3b8d8ec -r c72bba158baa oggparsevorbis.c --- a/oggparsevorbis.c Fri May 13 12:09:45 2005 +0000 +++ b/oggparsevorbis.c Fri May 13 18:10:23 2005 +0000 @@ -126,25 +126,56 @@ * [framing_flag] = read one bit | Not Used * */ +typedef struct { + unsigned int len[3]; + unsigned char *packet[3]; +} oggvorbis_private_t; + + +static unsigned int +fixup_vorbis_headers(AVFormatContext * as, oggvorbis_private_t *priv, + void **buf) +{ + int i,offset, len; + unsigned char *ptr; + + len = priv->len[0] + priv->len[1] + priv->len[2]; + ptr = *buf = av_mallocz(len + len/255 + 64); + + ptr[0] = 2; + offset = 1; + offset += av_xiphlacing(&ptr[offset], priv->len[0]); + offset += av_xiphlacing(&ptr[offset], priv->len[1]); + for(i = 0; i < 3; i++) { + memcpy(&ptr[offset], priv->packet[i], priv->len[i]); + offset += priv->len[i]; + } + *buf = av_realloc(*buf, offset); + return offset; +} + + static int vorbis_header (AVFormatContext * s, int idx) { ogg_t *ogg = s->priv_data; ogg_stream_t *os = ogg->streams + idx; AVStream *st = s->streams[idx]; - int cds = st->codec.extradata_size + os->psize + 2; - uint8_t *cdp; + oggvorbis_private_t *priv; if (os->seq > 2) return 0; - st->codec.extradata = av_realloc (st->codec.extradata, cds); - cdp = st->codec.extradata + st->codec.extradata_size; - *cdp++ = os->psize >> 8; - *cdp++ = os->psize & 0xff; - memcpy (cdp, os->buf + os->pstart, os->psize); - st->codec.extradata_size = cds; + if(os->seq == 0) { + os->private = av_mallocz(sizeof(oggvorbis_private_t)); + if(!os->private) + return 0; + } + priv = os->private; + priv->len[os->seq] = os->psize; + priv->packet[os->seq] = av_mallocz(os->psize); + memcpy(priv->packet[os->seq], os->buf + os->pstart, os->psize); if (os->buf[os->pstart] == 1) { uint8_t *p = os->buf + os->pstart + 11; //skip up to the audio channels st->codec.channels = *p++; @@ -157,6 +188,9 @@ } else if (os->buf[os->pstart] == 3) { vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8); + } else { + st->codec.extradata_size = + fixup_vorbis_headers(s, priv, &st->codec.extradata); } return os->seq < 3;