wavpack: return meaningful errors

And forward those that were already meaningful.
pull/18/head
Luca Barbato 12 years ago
parent 0f689a3d97
commit 8c34558131
  1. 32
      libavcodec/wavpack.c

@ -777,14 +777,14 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) { if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n"); av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
return -1; return AVERROR_INVALIDDATA;
} }
s = wc->fdec[block_no]; s = wc->fdec[block_no];
if (!s) { if (!s) {
av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n",
block_no); block_no);
return -1; return AVERROR_INVALIDDATA;
} }
memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
@ -1040,7 +1040,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
if (size <= 1) { if (size <= 1) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Insufficient channel information\n"); "Insufficient channel information\n");
return -1; return AVERROR_INVALIDDATA;
} }
chan = *buf++; chan = *buf++;
switch (size - 2) { switch (size - 2) {
@ -1071,7 +1071,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
"Block reports total %d channels, " "Block reports total %d channels, "
"decoder believes it's %d channels\n", "decoder believes it's %d channels\n",
chan, avctx->channels); chan, avctx->channels);
return -1; return AVERROR_INVALIDDATA;
} }
if (!avctx->channel_layout) if (!avctx->channel_layout)
avctx->channel_layout = chmask; avctx->channel_layout = chmask;
@ -1086,31 +1086,31 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
if (!got_terms) { if (!got_terms) {
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n"); av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (!got_weights) { if (!got_weights) {
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n"); av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (!got_samples) { if (!got_samples) {
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n"); av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (!got_entropy) { if (!got_entropy) {
av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n"); av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (s->hybrid && !got_hybrid) { if (s->hybrid && !got_hybrid) {
av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n"); av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (!got_bs) { if (!got_bs) {
av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n"); av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) { if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
av_log(avctx, AV_LOG_ERROR, "Float information not found\n"); av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
return -1; return AVERROR_INVALIDDATA;
} }
if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) { if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) {
const int size = get_bits_left(&s->gb_extra_bits); const int size = get_bits_left(&s->gb_extra_bits);
@ -1130,7 +1130,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT); samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
if (samplecount < 0) if (samplecount < 0)
return -1; return samplecount;
samplecount >>= 1; samplecount >>= 1;
} else { } else {
@ -1144,7 +1144,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT); samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
if (samplecount < 0) if (samplecount < 0)
return -1; return samplecount;
if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) { if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
int16_t *dst = (int16_t *)samples + 1; int16_t *dst = (int16_t *)samples + 1;
@ -1220,7 +1220,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
if (s->samples <= 0) { if (s->samples <= 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n", av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
s->samples); s->samples);
return AVERROR(EINVAL); return AVERROR_INVALIDDATA;
} }
if (frame_flags & 0x80) { if (frame_flags & 0x80) {
@ -1258,13 +1258,13 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
"Block %d has invalid size (size %d vs. %d bytes left)\n", "Block %d has invalid size (size %d vs. %d bytes left)\n",
s->block, frame_size, buf_size); s->block, frame_size, buf_size);
wavpack_decode_flush(avctx); wavpack_decode_flush(avctx);
return -1; return AVERROR_INVALIDDATA;
} }
if ((samplecount = wavpack_decode_block(avctx, s->block, if ((samplecount = wavpack_decode_block(avctx, s->block,
frame->data[0], got_frame_ptr, frame->data[0], got_frame_ptr,
buf, frame_size)) < 0) { buf, frame_size)) < 0) {
wavpack_decode_flush(avctx); wavpack_decode_flush(avctx);
return -1; return samplecount;
} }
s->block++; s->block++;
buf += frame_size; buf += frame_size;

Loading…
Cancel
Save