From 0e5cc174bb0f0dfb99bd4969bb1d6c20de3d6e7f Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Mon, 26 Sep 2011 00:51:14 +0200 Subject: win32: improve threading algorithm warning If no threading is requested do not issue warning about unsupported threading algorithm. --- libavcodec/w32thread.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavcodec/w32thread.c b/libavcodec/w32thread.c index 023be0e663..ceaafebc80 100644 --- a/libavcodec/w32thread.c +++ b/libavcodec/w32thread.c @@ -130,8 +130,10 @@ int ff_thread_init(AVCodecContext *s){ ThreadContext *c; uint32_t threadid; - if(!(s->thread_type & FF_THREAD_SLICE)){ - av_log(s, AV_LOG_WARNING, "The requested thread algorithm is not supported with this thread library.\n"); + if (s->thread_type && !(s->thread_type & FF_THREAD_SLICE)) { + av_log(s, AV_LOG_WARNING, + "This thread library only supports FF_THREAD_SLICE" + " threading algorithm.\n"); return 0; } -- cgit v1.2.3 From 8b31c086b6065084644b86a63c9171f3094cf6ad Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 12:16:05 -0400 Subject: nellymoser: check output buffer size before decoding --- libavcodec/nellymoserdec.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index a153dc0603..2856479566 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -156,19 +156,26 @@ static int decode_tag(AVCodecContext * avctx, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; - int blocks, i; + int blocks, i, block_size; int16_t* samples; - *data_size = 0; samples = (int16_t*)data; - if (buf_size < avctx->block_align) + if (buf_size < avctx->block_align) { + *data_size = 0; return buf_size; + } if (buf_size % 64) { av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size); + *data_size = 0; return buf_size; } - blocks = buf_size / 64; + block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt); + blocks = FFMIN(buf_size / 64, *data_size / block_size); + if (blocks <= 0) { + av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); + return AVERROR(EINVAL); + } /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 @@ -180,8 +187,8 @@ static int decode_tag(AVCodecContext * avctx, for (i=0 ; ifloat_buf); s->fmt_conv.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); - *data_size += NELLY_SAMPLES*sizeof(int16_t); } + *data_size = blocks * block_size; return buf_size; } -- cgit v1.2.3 From 84464b2e7f1fe38705c5cd523b70be549d8d03ee Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 12:25:00 -0400 Subject: nellymoserdec: allow user to request SAMPLE_FMT_FLT for output samples. --- libavcodec/nellymoserdec.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index 2856479566..a6748bf5f5 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -137,15 +137,20 @@ static av_cold int decode_init(AVCodecContext * avctx) { ff_mdct_init(&s->imdct_ctx, 8, 1, 1.0); dsputil_init(&s->dsp, avctx); - ff_fmt_convert_init(&s->fmt_conv, avctx); - s->scale_bias = 1.0/(1*8); + if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) { + s->scale_bias = 1.0/(32768*8); + avctx->sample_fmt = AV_SAMPLE_FMT_FLT; + } else { + s->scale_bias = 1.0/(1*8); + avctx->sample_fmt = AV_SAMPLE_FMT_S16; + ff_fmt_convert_init(&s->fmt_conv, avctx); + } /* Generate overlap window */ if (!ff_sine_128[127]) ff_init_ff_sine_windows(7); - avctx->sample_fmt = AV_SAMPLE_FMT_S16; avctx->channel_layout = AV_CH_LAYOUT_MONO; return 0; } @@ -157,8 +162,8 @@ static int decode_tag(AVCodecContext * avctx, int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i, block_size; - int16_t* samples; - samples = (int16_t*)data; + int16_t *samples_s16 = data; + float *samples_flt = data; if (buf_size < avctx->block_align) { *data_size = 0; @@ -185,8 +190,15 @@ static int decode_tag(AVCodecContext * avctx, */ for (i=0 ; ifloat_buf); - s->fmt_conv.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); + if (avctx->sample_fmt == SAMPLE_FMT_FLT) { + nelly_decode_block(s, buf, samples_flt); + samples_flt += NELLY_SAMPLES; + } else { + nelly_decode_block(s, buf, s->float_buf); + s->fmt_conv.float_to_int16(samples_s16, s->float_buf, NELLY_SAMPLES); + samples_s16 += NELLY_SAMPLES; + } + buf += NELLY_BLOCK_LEN; } *data_size = blocks * block_size; @@ -209,5 +221,8 @@ AVCodec ff_nellymoser_decoder = { .close = decode_end, .decode = decode_tag, .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"), + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, + AV_SAMPLE_FMT_S16, + AV_SAMPLE_FMT_NONE }, }; -- cgit v1.2.3 From ded0800d44662391995a3c00b6c136fb781fee6b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 12:27:12 -0400 Subject: nellymoserdec: use NELLY_BLOCK_LEN instead of 64 when appropriate. --- libavcodec/nellymoserdec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index a6748bf5f5..bd3ab99166 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -170,13 +170,13 @@ static int decode_tag(AVCodecContext * avctx, return buf_size; } - if (buf_size % 64) { + if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size); *data_size = 0; return buf_size; } block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt); - blocks = FFMIN(buf_size / 64, *data_size / block_size); + blocks = FFMIN(buf_size / NELLY_BLOCK_LEN, *data_size / block_size); if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); return AVERROR(EINVAL); -- cgit v1.2.3 From 32b484464cf68ddc072ebd4ed29a8aed7a51070b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 12:28:41 -0400 Subject: nellymoserdec: use NELLY_BUF_LEN instead of 128 --- libavcodec/nellymoserdec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index bd3ab99166..d7d1abab25 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -48,7 +48,7 @@ typedef struct NellyMoserDecodeContext { AVCodecContext* avctx; DECLARE_ALIGNED(32, float, float_buf)[NELLY_SAMPLES]; - float state[128]; + float state[NELLY_BUF_LEN]; AVLFG random_state; GetBitContext gb; float scale_bias; -- cgit v1.2.3 From fac6b7f9f22d4fc3a275af7af9d9754356d48d89 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 12:37:01 -0400 Subject: nellymoserdec: allocate float_buf only when decoding to int16 --- libavcodec/nellymoserdec.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c index d7d1abab25..2d59abf9a8 100644 --- a/libavcodec/nellymoserdec.c +++ b/libavcodec/nellymoserdec.c @@ -47,7 +47,7 @@ typedef struct NellyMoserDecodeContext { AVCodecContext* avctx; - DECLARE_ALIGNED(32, float, float_buf)[NELLY_SAMPLES]; + float *float_buf; float state[NELLY_BUF_LEN]; AVLFG random_state; GetBitContext gb; @@ -145,6 +145,11 @@ static av_cold int decode_init(AVCodecContext * avctx) { s->scale_bias = 1.0/(1*8); avctx->sample_fmt = AV_SAMPLE_FMT_S16; ff_fmt_convert_init(&s->fmt_conv, avctx); + s->float_buf = av_mallocz(NELLY_SAMPLES * sizeof(*s->float_buf)); + if (!s->float_buf) { + av_log(avctx, AV_LOG_ERROR, "error allocating float buffer\n"); + return AVERROR(ENOMEM); + } } /* Generate overlap window */ @@ -208,6 +213,7 @@ static int decode_tag(AVCodecContext * avctx, static av_cold int decode_end(AVCodecContext * avctx) { NellyMoserDecodeContext *s = avctx->priv_data; + av_freep(&s->float_buf); ff_mdct_end(&s->imdct_ctx); return 0; } -- cgit v1.2.3 From c8b5c4d27409dfdcec80868686b173ba446c998b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 13 Sep 2011 18:53:18 -0400 Subject: mpc7: check output buffer size before decoding --- libavcodec/mpc7.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c index a98cb0e053..02c83fcdc8 100644 --- a/libavcodec/mpc7.c +++ b/libavcodec/mpc7.c @@ -197,7 +197,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, int i, ch; int mb = -1; Band *bands = c->bands; - int off; + int off, out_size; int bits_used, bits_avail; memset(bands, 0, sizeof(bands)); @@ -205,6 +205,12 @@ static int mpc7_decode_frame(AVCodecContext * avctx, av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); } + out_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); + return AVERROR(EINVAL); + } + bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE); c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2); init_get_bits(&gb, bits, (buf_size - 4)* 8); @@ -277,7 +283,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, *data_size = 0; return buf_size; } - *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; + *data_size = out_size; return buf_size; } -- cgit v1.2.3 From 8290d1f38b438f1b070de67645c8b4a42014c7ac Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 11:16:42 -0400 Subject: mpc7: return error if packet is too small. --- libavcodec/mpc7.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c index 02c83fcdc8..6f79c7b51e 100644 --- a/libavcodec/mpc7.c +++ b/libavcodec/mpc7.c @@ -203,6 +203,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, memset(bands, 0, sizeof(bands)); if(buf_size <= 4){ av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); + return AVERROR(EINVAL); } out_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; -- cgit v1.2.3 From 5674d4b0a35a34b75e3533a8580e0b5a0a8895a7 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 14 Sep 2011 11:39:21 -0400 Subject: mpc8: check output buffer size before decoding --- libavcodec/mpc8.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c index 0e3947b031..a126fc8a8f 100644 --- a/libavcodec/mpc8.c +++ b/libavcodec/mpc8.c @@ -241,10 +241,16 @@ static int mpc8_decode_frame(AVCodecContext * avctx, GetBitContext gb2, *gb = &gb2; int i, j, k, ch, cnt, res, t; Band *bands = c->bands; - int off; + int off, out_size; int maxband, keyframe; int last[2]; + out_size = MPC_FRAME_SIZE * 2 * avctx->channels; + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); + return AVERROR(EINVAL); + } + keyframe = c->cur_frame == 0; if(keyframe){ @@ -400,7 +406,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, c->last_bits_used = get_bits_count(gb); if(c->cur_frame >= c->frames) c->cur_frame = 0; - *data_size = MPC_FRAME_SIZE * 2 * avctx->channels; + *data_size = out_size; return c->cur_frame ? c->last_bits_used >> 3 : buf_size; } -- cgit v1.2.3