X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegaudio_parser.c;h=c44c02417ceca2b456235f0016b06fbfd9ee5538;hb=ad99cbc9b3f4e0fae5c9bc5291d422d477dbf069;hp=17d329dc1c1180b50b989b4070c9dec09bc381b0;hpb=82ab61f9015659419e0a2766ee031c367e3f2908;p=ffmpeg diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c index 17d329dc1c1..c44c02417ce 100644 --- a/libavcodec/mpegaudio_parser.c +++ b/libavcodec/mpegaudio_parser.c @@ -22,6 +22,7 @@ #include "parser.h" #include "mpegaudiodecheader.h" +#include "libavutil/common.h" typedef struct MpegAudioParseContext { @@ -29,6 +30,7 @@ typedef struct MpegAudioParseContext { int frame_size; uint32_t header; int header_count; + int no_bitrate; } MpegAudioParseContext; #define MPA_HEADER_SIZE 4 @@ -61,12 +63,14 @@ static int mpegaudio_parse(AVCodecParserContext *s1, }else{ while(icodec_id; state= (state<<8) + buf[i++]; - ret = avpriv_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate); + ret = ff_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate); if (ret < 4) { - s->header_count= -2; + if (i > 4) + s->header_count = -2; } else { if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header) s->header_count= -3; @@ -74,12 +78,25 @@ static int mpegaudio_parse(AVCodecParserContext *s1, s->header_count++; s->frame_size = ret-4; - if(s->header_count > 1){ + if (s->header_count > 0) { avctx->sample_rate= sr; avctx->channels = channels; - avctx->frame_size = frame_size; - avctx->bit_rate = bit_rate; + s1->duration = frame_size; + if (s->no_bitrate || !avctx->bit_rate) { + s->no_bitrate = 1; + avctx->bit_rate += (bit_rate - avctx->bit_rate) / s->header_count; + } } + + if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) { + s->frame_size = 0; + next = buf_size; + } else if (codec_id == AV_CODEC_ID_MP3ADU) { + avpriv_report_missing_feature(avctx, + "MP3ADU full parser"); + return AVERROR_PATCHWELCOME; + } + break; } } @@ -100,9 +117,8 @@ static int mpegaudio_parse(AVCodecParserContext *s1, AVCodecParser ff_mpegaudio_parser = { - { CODEC_ID_MP1, CODEC_ID_MP2, CODEC_ID_MP3 }, - sizeof(MpegAudioParseContext), - NULL, - mpegaudio_parse, - ff_parse_close, + .codec_ids = { AV_CODEC_ID_MP1, AV_CODEC_ID_MP2, AV_CODEC_ID_MP3, AV_CODEC_ID_MP3ADU }, + .priv_data_size = sizeof(MpegAudioParseContext), + .parser_parse = mpegaudio_parse, + .parser_close = ff_parse_close, };