* commit '2f3fadfbe3c6ad52fad5c614b6067c5401227959': lavc,lavf: switch to the new vorbis parse API Conflicts: libavformat/oggparsevorbis.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.5
| @@ -27,7 +27,7 @@ | |||||
| #include "audio_frame_queue.h" | #include "audio_frame_queue.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "vorbis.h" | #include "vorbis.h" | ||||
| #include "vorbis_parser_internal.h" | |||||
| #include "vorbis_parser.h" | |||||
| /* Number of samples the user should send in each call. | /* Number of samples the user should send in each call. | ||||
| @@ -49,7 +49,7 @@ typedef struct LibvorbisEncContext { | |||||
| int dsp_initialized; /**< vd has been initialized */ | int dsp_initialized; /**< vd has been initialized */ | ||||
| vorbis_comment vc; /**< VorbisComment info */ | vorbis_comment vc; /**< VorbisComment info */ | ||||
| double iblock; /**< impulse block bias option */ | 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 */ | AudioFrameQueue afq; /**< frame queue for timestamps */ | ||||
| } LibvorbisEncContext; | } LibvorbisEncContext; | ||||
| @@ -187,6 +187,8 @@ static av_cold int libvorbis_encode_close(AVCodecContext *avctx) | |||||
| ff_af_queue_close(&s->afq); | ff_af_queue_close(&s->afq); | ||||
| av_freep(&avctx->extradata); | av_freep(&avctx->extradata); | ||||
| av_vorbis_parse_free(&s->vp); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -246,7 +248,8 @@ static av_cold int libvorbis_encode_init(AVCodecContext *avctx) | |||||
| offset += header_code.bytes; | offset += header_code.bytes; | ||||
| av_assert0(offset == avctx->extradata_size); | 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"); | av_log(avctx, AV_LOG_ERROR, "invalid extradata\n"); | ||||
| return ret; | 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); | 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) { | if (duration > 0) { | ||||
| /* we do not know encoder delay until we get the first packet from | /* we do not know encoder delay until we get the first packet from | ||||
| * libvorbis, so we have to update the AudioFrameQueue counts */ | * libvorbis, so we have to update the AudioFrameQueue counts */ | ||||
| @@ -316,18 +316,25 @@ int avpriv_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, | |||||
| #endif | #endif | ||||
| #if CONFIG_VORBIS_PARSER | #if CONFIG_VORBIS_PARSER | ||||
| typedef struct VorbisParseContext { | |||||
| AVVorbisParseContext *vp; | |||||
| } VorbisParseContext; | |||||
| static int vorbis_parse(AVCodecParserContext *s1, AVCodecContext *avctx, | static int vorbis_parse(AVCodecParserContext *s1, AVCodecContext *avctx, | ||||
| const uint8_t **poutbuf, int *poutbuf_size, | const uint8_t **poutbuf, int *poutbuf_size, | ||||
| const uint8_t *buf, int buf_size) | const uint8_t *buf, int buf_size) | ||||
| { | { | ||||
| AVVorbisParseContext *s = s1->priv_data; | |||||
| VorbisParseContext *s = s1->priv_data; | |||||
| int duration; | 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; | 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; | s1->duration = duration; | ||||
| end: | end: | ||||
| @@ -338,9 +345,16 @@ end: | |||||
| return buf_size; | 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 = { | AVCodecParser ff_vorbis_parser = { | ||||
| .codec_ids = { AV_CODEC_ID_VORBIS }, | .codec_ids = { AV_CODEC_ID_VORBIS }, | ||||
| .priv_data_size = sizeof(AVVorbisParseContext), | |||||
| .priv_data_size = sizeof(VorbisParseContext), | |||||
| .parser_parse = vorbis_parse, | .parser_parse = vorbis_parse, | ||||
| .parser_close = vorbis_parser_close, | |||||
| }; | }; | ||||
| #endif /* CONFIG_VORBIS_PARSER */ | #endif /* CONFIG_VORBIS_PARSER */ | ||||
| @@ -30,7 +30,7 @@ | |||||
| #include "libavutil/dict.h" | #include "libavutil/dict.h" | ||||
| #include "libavcodec/bytestream.h" | #include "libavcodec/bytestream.h" | ||||
| #include "libavcodec/get_bits.h" | #include "libavcodec/get_bits.h" | ||||
| #include "libavcodec/vorbis_parser_internal.h" | |||||
| #include "libavcodec/vorbis_parser.h" | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "flac_picture.h" | #include "flac_picture.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| @@ -213,7 +213,7 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m, | |||||
| struct oggvorbis_private { | struct oggvorbis_private { | ||||
| unsigned int len[3]; | unsigned int len[3]; | ||||
| unsigned char *packet[3]; | unsigned char *packet[3]; | ||||
| AVVorbisParseContext vp; | |||||
| AVVorbisParseContext *vp; | |||||
| int64_t final_pts; | int64_t final_pts; | ||||
| int final_duration; | int final_duration; | ||||
| }; | }; | ||||
| @@ -253,9 +253,11 @@ static void vorbis_cleanup(AVFormatContext *s, int idx) | |||||
| struct ogg_stream *os = ogg->streams + idx; | struct ogg_stream *os = ogg->streams + idx; | ||||
| struct oggvorbis_private *priv = os->private; | struct oggvorbis_private *priv = os->private; | ||||
| int i; | int i; | ||||
| if (os->private) | |||||
| if (os->private) { | |||||
| av_vorbis_parse_free(&priv->vp); | |||||
| for (i = 0; i < 3; i++) | for (i = 0; i < 3; i++) | ||||
| av_freep(&priv->packet[i]); | av_freep(&priv->packet[i]); | ||||
| } | |||||
| } | } | ||||
| static int vorbis_update_metadata(AVFormatContext *s, int idx) | static int vorbis_update_metadata(AVFormatContext *s, int idx) | ||||
| @@ -385,7 +387,9 @@ static int vorbis_header(AVFormatContext *s, int idx) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| st->codec->extradata_size = 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); | av_freep(&st->codec->extradata); | ||||
| st->codec->extradata_size = 0; | st->codec->extradata_size = 0; | ||||
| return ret; | return ret; | ||||
| @@ -411,10 +415,10 @@ static int vorbis_packet(AVFormatContext *s, int idx) | |||||
| uint8_t *last_pkt = os->buf + os->pstart; | uint8_t *last_pkt = os->buf + os->pstart; | ||||
| uint8_t *next_pkt = last_pkt; | uint8_t *next_pkt = last_pkt; | ||||
| avpriv_vorbis_parse_reset(&priv->vp); | |||||
| av_vorbis_parse_reset(priv->vp); | |||||
| duration = 0; | duration = 0; | ||||
| seg = os->segp; | 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) { | if (d < 0) { | ||||
| os->pflags |= AV_PKT_FLAG_CORRUPT; | os->pflags |= AV_PKT_FLAG_CORRUPT; | ||||
| return 0; | return 0; | ||||
| @@ -426,7 +430,7 @@ static int vorbis_packet(AVFormatContext *s, int idx) | |||||
| last_pkt = next_pkt = next_pkt + os->psize; | last_pkt = next_pkt = next_pkt + os->psize; | ||||
| for (; seg < os->nsegs; seg++) { | for (; seg < os->nsegs; seg++) { | ||||
| if (os->segments[seg] < 255) { | 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) { | if (d < 0) { | ||||
| duration = os->granule; | duration = os->granule; | ||||
| break; | break; | ||||
| @@ -451,12 +455,12 @@ static int vorbis_packet(AVFormatContext *s, int idx) | |||||
| s->streams[idx]->duration -= s->streams[idx]->start_time; | s->streams[idx]->duration -= s->streams[idx]->start_time; | ||||
| } | } | ||||
| priv->final_pts = AV_NOPTS_VALUE; | priv->final_pts = AV_NOPTS_VALUE; | ||||
| avpriv_vorbis_parse_reset(&priv->vp); | |||||
| av_vorbis_parse_reset(priv->vp); | |||||
| } | } | ||||
| /* parse packet duration */ | /* parse packet duration */ | ||||
| if (os->psize > 0) { | 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) { | if (duration < 0) { | ||||
| os->pflags |= AV_PKT_FLAG_CORRUPT; | os->pflags |= AV_PKT_FLAG_CORRUPT; | ||||
| return 0; | return 0; | ||||