|
|
|
@@ -1174,6 +1174,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, |
|
|
|
return samplecount * bpp; |
|
|
|
} |
|
|
|
|
|
|
|
static void wavpack_decode_flush(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
WavpackContext *s = avctx->priv_data; |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < s->fdec_num; i++) |
|
|
|
wv_reset_saved_context(s->fdec[i]); |
|
|
|
} |
|
|
|
|
|
|
|
static int wavpack_decode_frame(AVCodecContext *avctx, |
|
|
|
void *data, int *data_size, |
|
|
|
AVPacket *avpkt) |
|
|
|
@@ -1206,11 +1215,14 @@ static int wavpack_decode_frame(AVCodecContext *avctx, |
|
|
|
if(frame_size < 0 || frame_size > buf_size){ |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n", |
|
|
|
s->block, frame_size, buf_size); |
|
|
|
wavpack_decode_flush(avctx); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if((samplecount = wavpack_decode_block(avctx, s->block, data, |
|
|
|
data_size, buf, frame_size)) < 0) |
|
|
|
data_size, buf, frame_size)) < 0) { |
|
|
|
wavpack_decode_flush(avctx); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
s->block++; |
|
|
|
buf += frame_size; buf_size -= frame_size; |
|
|
|
} |
|
|
|
@@ -1219,15 +1231,6 @@ static int wavpack_decode_frame(AVCodecContext *avctx, |
|
|
|
return s->samples_left > 0 ? 0 : avpkt->size; |
|
|
|
} |
|
|
|
|
|
|
|
static void wavpack_decode_flush(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
WavpackContext *s = avctx->priv_data; |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < s->fdec_num; i++) |
|
|
|
wv_reset_saved_context(s->fdec[i]); |
|
|
|
} |
|
|
|
|
|
|
|
AVCodec ff_wavpack_decoder = { |
|
|
|
.name = "wavpack", |
|
|
|
.type = AVMEDIA_TYPE_AUDIO, |
|
|
|
|