On Wed, Sep 7, 2011 at 2:46 PM, Laurent Aimar <fen...@elivagar.org> wrote: > On Wed, Sep 07, 2011 at 02:43:48PM -0700, Alex Converse wrote: >> > libavcodec/wavpack.c | 6 +++--- >> > 1 files changed, 3 insertions(+), 3 deletions(-) >> > >> > diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c >> > index 8e81d2d..f43819c 100644 >> > --- a/libavcodec/wavpack.c >> > +++ b/libavcodec/wavpack.c >> > @@ -1134,7 +1134,7 @@ static int wavpack_decode_block(AVCodecContext >> > *avctx, int block_no, >> > int16_t *dst = (int16_t*)samples + 1; >> > int16_t *src = (int16_t*)samples; >> > int cnt = samplecount; >> > - while(cnt--){ >> > + while(cnt-- > 0){ >> > *dst = *src; >> > src += channel_stride; >> > dst += channel_stride; >> > @@ -1143,7 +1143,7 @@ static int wavpack_decode_block(AVCodecContext >> > *avctx, int block_no, >> > int32_t *dst = (int32_t*)samples + 1; >> > int32_t *src = (int32_t*)samples; >> > int cnt = samplecount; >> > - while(cnt--){ >> > + while(cnt-- > 0){ >> > *dst = *src; >> > src += channel_stride; >> > dst += channel_stride; >> > @@ -1152,7 +1152,7 @@ static int wavpack_decode_block(AVCodecContext >> > *avctx, int block_no, >> > float *dst = (float*)samples + 1; >> > float *src = (float*)samples; >> > int cnt = samplecount; >> > - while(cnt--){ >> > + while(cnt-- > 0){ >> > *dst = *src; >> > src += channel_stride; >> > dst += channel_stride; >> >> It's probably better to attack this closer to the root of the problem. >> cnt is initialized to sample_count which is set by wv_unpack_mono() >> >> wv_unpack_mono() returns negative error codes so something like this >> probably makes more sense: >> >> >> > if(avctx->sample_fmt == AV_SAMPLE_FMT_S16) >> > samplecount = wv_unpack_mono(s, &s->gb, samples, >> > AV_SAMPLE_FMT_S16); >> > else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32) >> > samplecount = wv_unpack_mono(s, &s->gb, samples, >> > AV_SAMPLE_FMT_S32); >> > else >> > samplecount = wv_unpack_mono(s, &s->gb, samples, >> > AV_SAMPLE_FMT_FLT); >> >> + if (samplecount < 0) >> + return samplecount; > > Well not really, I think that the last part of the function, ie > > wc->samples_left = s->samples_left; > > should still be executed. >
Why? If we return an error from wavpack_decode_block() (which happens from either approach) it's caller (wavpack_decode_frame()) will short circuit and return -1 and on its next invocation it will zero out samples_left from the WavpackContext (Called wc in decode_block but s in decode_frame). _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel