diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c index 197f863c7b..4d16b755ec 100644 --- a/libavcodec/libvorbisenc.c +++ b/libavcodec/libvorbisenc.c @@ -27,7 +27,7 @@ #include "audio_frame_queue.h" #include "internal.h" #include "vorbis.h" -#include "vorbis_parser_internal.h" +#include "vorbis_parser.h" /* Number of samples the user should send in each call. @@ -49,7 +49,7 @@ typedef struct LibvorbisEncContext { int dsp_initialized; /**< vd has been initialized */ vorbis_comment vc; /**< VorbisComment info */ double iblock; /**< impulse block bias option */ - AVVorbisParseContext vp; /**< parse context to get durations */ + AVVorbisParseContext *vp; /**< parse context to get durations */ AudioFrameQueue afq; /**< frame queue for timestamps */ } LibvorbisEncContext; @@ -187,6 +187,8 @@ static av_cold int libvorbis_encode_close(AVCodecContext *avctx) ff_af_queue_close(&s->afq); av_freep(&avctx->extradata); + av_vorbis_parse_free(&s->vp); + return 0; } @@ -246,7 +248,8 @@ static av_cold int libvorbis_encode_init(AVCodecContext *avctx) offset += header_code.bytes; av_assert0(offset == avctx->extradata_size); - if ((ret = avpriv_vorbis_parse_extradata(avctx, &s->vp)) < 0) { + s->vp = av_vorbis_parse_init(avctx->extradata, avctx->extradata_size); + if (!s->vp) { av_log(avctx, AV_LOG_ERROR, "invalid extradata\n"); return ret; } @@ -341,7 +344,7 @@ static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, avpkt->pts = ff_samples_to_time_base(avctx, op.granulepos); - duration = avpriv_vorbis_parse_frame(&s->vp, avpkt->data, avpkt->size); + duration = av_vorbis_parse_frame(s->vp, avpkt->data, avpkt->size); if (duration > 0) { /* we do not know encoder delay until we get the first packet from * libvorbis, so we have to update the AudioFrameQueue counts */ diff --git a/libavcodec/vorbis_parser.c b/libavcodec/vorbis_parser.c index ab08a6a2dd..0d72fb1b90 100644 --- a/libavcodec/vorbis_parser.c +++ b/libavcodec/vorbis_parser.c @@ -316,18 +316,25 @@ int avpriv_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, #endif #if CONFIG_VORBIS_PARSER + +typedef struct VorbisParseContext { + AVVorbisParseContext *vp; +} VorbisParseContext; + static int vorbis_parse(AVCodecParserContext *s1, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size) { - AVVorbisParseContext *s = s1->priv_data; + VorbisParseContext *s = s1->priv_data; int duration; - if (!s->extradata_parsed && avctx->extradata && avctx->extradata_size) - if (avpriv_vorbis_parse_extradata(avctx, s)) + if (!s->vp && avctx->extradata && avctx->extradata_size) { + s->vp = av_vorbis_parse_init(avctx->extradata, avctx->extradata_size); + if (!s->vp) goto end; + } - if ((duration = avpriv_vorbis_parse_frame(s, buf, buf_size)) >= 0) + if ((duration = av_vorbis_parse_frame(s->vp, buf, buf_size)) >= 0) s1->duration = duration; end: @@ -338,9 +345,16 @@ end: return buf_size; } +static void vorbis_parser_close(AVCodecParserContext *ctx) +{ + VorbisParseContext *s = ctx->priv_data; + av_vorbis_parse_free(&s->vp); +} + AVCodecParser ff_vorbis_parser = { .codec_ids = { AV_CODEC_ID_VORBIS }, - .priv_data_size = sizeof(AVVorbisParseContext), + .priv_data_size = sizeof(VorbisParseContext), .parser_parse = vorbis_parse, + .parser_close = vorbis_parser_close, }; #endif /* CONFIG_VORBIS_PARSER */ diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index 7efa660976..dd671301e1 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -30,7 +30,7 @@ #include "libavutil/dict.h" #include "libavcodec/bytestream.h" #include "libavcodec/get_bits.h" -#include "libavcodec/vorbis_parser_internal.h" +#include "libavcodec/vorbis_parser.h" #include "avformat.h" #include "flac_picture.h" #include "internal.h" @@ -213,7 +213,7 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m, struct oggvorbis_private { unsigned int len[3]; unsigned char *packet[3]; - AVVorbisParseContext vp; + AVVorbisParseContext *vp; int64_t final_pts; int final_duration; }; @@ -253,9 +253,11 @@ static void vorbis_cleanup(AVFormatContext *s, int idx) struct ogg_stream *os = ogg->streams + idx; struct oggvorbis_private *priv = os->private; int i; - if (os->private) + if (os->private) { + av_vorbis_parse_free(&priv->vp); for (i = 0; i < 3; i++) av_freep(&priv->packet[i]); + } } static int vorbis_update_metadata(AVFormatContext *s, int idx) @@ -385,7 +387,9 @@ static int vorbis_header(AVFormatContext *s, int idx) return ret; } st->codec->extradata_size = ret; - if ((ret = avpriv_vorbis_parse_extradata(st->codec, &priv->vp))) { + + priv->vp = av_vorbis_parse_init(st->codec->extradata, st->codec->extradata_size); + if (!priv->vp) { av_freep(&st->codec->extradata); st->codec->extradata_size = 0; return ret; @@ -411,10 +415,10 @@ static int vorbis_packet(AVFormatContext *s, int idx) uint8_t *last_pkt = os->buf + os->pstart; uint8_t *next_pkt = last_pkt; - avpriv_vorbis_parse_reset(&priv->vp); + av_vorbis_parse_reset(priv->vp); duration = 0; seg = os->segp; - d = avpriv_vorbis_parse_frame_flags(&priv->vp, last_pkt, 1, &flags); + d = av_vorbis_parse_frame_flags(priv->vp, last_pkt, 1, &flags); if (d < 0) { os->pflags |= AV_PKT_FLAG_CORRUPT; return 0; @@ -426,7 +430,7 @@ static int vorbis_packet(AVFormatContext *s, int idx) last_pkt = next_pkt = next_pkt + os->psize; for (; seg < os->nsegs; seg++) { if (os->segments[seg] < 255) { - int d = avpriv_vorbis_parse_frame_flags(&priv->vp, last_pkt, 1, &flags); + int d = av_vorbis_parse_frame_flags(priv->vp, last_pkt, 1, &flags); if (d < 0) { duration = os->granule; break; @@ -451,12 +455,12 @@ static int vorbis_packet(AVFormatContext *s, int idx) s->streams[idx]->duration -= s->streams[idx]->start_time; } priv->final_pts = AV_NOPTS_VALUE; - avpriv_vorbis_parse_reset(&priv->vp); + av_vorbis_parse_reset(priv->vp); } /* parse packet duration */ if (os->psize > 0) { - duration = avpriv_vorbis_parse_frame_flags(&priv->vp, os->buf + os->pstart, 1, &flags); + duration = av_vorbis_parse_frame_flags(priv->vp, os->buf + os->pstart, 1, &flags); if (duration < 0) { os->pflags |= AV_PKT_FLAG_CORRUPT; return 0;