Fixes "quality 10" mode from Ticket1873 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -50,7 +50,17 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) | |||||
| if (!header) | if (!header) | ||||
| av_log(avctx, AV_LOG_WARNING, "Invalid Speex header\n"); | av_log(avctx, AV_LOG_WARNING, "Invalid Speex header\n"); | ||||
| } | } | ||||
| if (header) { | |||||
| if (avctx->codec_tag == MKTAG('S', 'P', 'X', 'N')) { | |||||
| if (!avctx->extradata || avctx->extradata && avctx->extradata_size < 47) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Missing or invalid extradata.\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| if (avctx->extradata[37] != 10) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Unsupported quality mode.\n"); | |||||
| return AVERROR_PATCHWELCOME; | |||||
| } | |||||
| spx_mode = 0; | |||||
| } else if (header) { | |||||
| avctx->sample_rate = header->rate; | avctx->sample_rate = header->rate; | ||||
| avctx->channels = header->nb_channels; | avctx->channels = header->nb_channels; | ||||
| spx_mode = header->mode; | spx_mode = header->mode; | ||||
| @@ -293,6 +293,7 @@ const AVCodecTag ff_codec_movaudio_tags[] = { | |||||
| { AV_CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, | { AV_CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, | ||||
| { AV_CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') }, | { AV_CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') }, | ||||
| { AV_CODEC_ID_SPEEX, MKTAG('s', 'p', 'e', 'x') }, /* Flash Media Server */ | { AV_CODEC_ID_SPEEX, MKTAG('s', 'p', 'e', 'x') }, /* Flash Media Server */ | ||||
| { AV_CODEC_ID_SPEEX, MKTAG('S', 'P', 'X', 'N') }, | |||||
| { AV_CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') }, | { AV_CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') }, | ||||
| { AV_CODEC_ID_EVRC, MKTAG('s', 'e', 'v', 'c') }, /* 3GPP2 */ | { AV_CODEC_ID_EVRC, MKTAG('s', 'e', 'v', 'c') }, /* 3GPP2 */ | ||||
| { AV_CODEC_ID_SMV, MKTAG('s', 's', 'm', 'v') }, /* 3GPP2 */ | { AV_CODEC_ID_SMV, MKTAG('s', 's', 'm', 'v') }, /* 3GPP2 */ | ||||
| @@ -1033,7 +1033,9 @@ static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| if ((uint64_t)atom.size > (1<<30)) | if ((uint64_t)atom.size > (1<<30)) | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| if (st->codec->codec_id == AV_CODEC_ID_QDM2 || st->codec->codec_id == AV_CODEC_ID_QDMC) { | |||||
| if (st->codec->codec_id == AV_CODEC_ID_QDM2 || | |||||
| st->codec->codec_id == AV_CODEC_ID_QDMC || | |||||
| st->codec->codec_id == AV_CODEC_ID_SPEEX) { | |||||
| // pass all frma atom to codec, needed at least for QDMC and QDM2 | // pass all frma atom to codec, needed at least for QDMC and QDM2 | ||||
| av_free(st->codec->extradata); | av_free(st->codec->extradata); | ||||
| st->codec->extradata_size = 0; | st->codec->extradata_size = 0; | ||||