Browse Source

dca: return proper error codes instead of -1

tags/n0.9
Justin Ruggles 14 years ago
parent
commit
f44059d260
1 changed files with 25 additions and 24 deletions
  1. +25
    -24
      libavcodec/dca.c

+ 25
- 24
libavcodec/dca.c View File

@@ -529,15 +529,15 @@ static int dca_parse_frame_header(DCAContext * s)
s->sample_blocks = get_bits(&s->gb, 7) + 1; s->sample_blocks = get_bits(&s->gb, 7) + 1;
s->frame_size = get_bits(&s->gb, 14) + 1; s->frame_size = get_bits(&s->gb, 14) + 1;
if (s->frame_size < 95) if (s->frame_size < 95)
return -1;
return AVERROR_INVALIDDATA;
s->amode = get_bits(&s->gb, 6); s->amode = get_bits(&s->gb, 6);
s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)]; s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)];
if (!s->sample_rate) if (!s->sample_rate)
return -1;
return AVERROR_INVALIDDATA;
s->bit_rate_index = get_bits(&s->gb, 5); s->bit_rate_index = get_bits(&s->gb, 5);
s->bit_rate = dca_bit_rates[s->bit_rate_index]; s->bit_rate = dca_bit_rates[s->bit_rate_index];
if (!s->bit_rate) if (!s->bit_rate)
return -1;
return AVERROR_INVALIDDATA;


s->downmix = get_bits(&s->gb, 1); s->downmix = get_bits(&s->gb, 1);
s->dynrange = get_bits(&s->gb, 1); s->dynrange = get_bits(&s->gb, 1);
@@ -627,7 +627,7 @@ static int dca_subframe_header(DCAContext * s, int base_channel, int block_index
int j, k; int j, k;


if (get_bits_left(&s->gb) < 0) if (get_bits_left(&s->gb) < 0)
return -1;
return AVERROR_INVALIDDATA;


if (!base_channel) { if (!base_channel) {
s->subsubframes[s->current_subframe] = get_bits(&s->gb, 2) + 1; s->subsubframes[s->current_subframe] = get_bits(&s->gb, 2) + 1;
@@ -659,7 +659,7 @@ static int dca_subframe_header(DCAContext * s, int base_channel, int block_index
else if (s->bitalloc_huffman[j] == 7) { else if (s->bitalloc_huffman[j] == 7) {
av_log(s->avctx, AV_LOG_ERROR, av_log(s->avctx, AV_LOG_ERROR,
"Invalid bit allocation index\n"); "Invalid bit allocation index\n");
return -1;
return AVERROR_INVALIDDATA;
} else { } else {
s->bitalloc[j][k] = s->bitalloc[j][k] =
get_bitalloc(&s->gb, &dca_bitalloc_index, s->bitalloc_huffman[j]); get_bitalloc(&s->gb, &dca_bitalloc_index, s->bitalloc_huffman[j]);
@@ -668,7 +668,7 @@ static int dca_subframe_header(DCAContext * s, int base_channel, int block_index
if (s->bitalloc[j][k] > 26) { if (s->bitalloc[j][k] > 26) {
// av_log(s->avctx,AV_LOG_DEBUG,"bitalloc index [%i][%i] too big (%i)\n", // av_log(s->avctx,AV_LOG_DEBUG,"bitalloc index [%i][%i] too big (%i)\n",
// j, k, s->bitalloc[j][k]); // j, k, s->bitalloc[j][k]);
return -1;
return AVERROR_INVALIDDATA;
} }
} }
} }
@@ -686,7 +686,7 @@ static int dca_subframe_header(DCAContext * s, int base_channel, int block_index
} }


if (get_bits_left(&s->gb) < 0) if (get_bits_left(&s->gb) < 0)
return -1;
return AVERROR_INVALIDDATA;


for (j = base_channel; j < s->prim_channels; j++) { for (j = base_channel; j < s->prim_channels; j++) {
const uint32_t *scale_table; const uint32_t *scale_table;
@@ -724,7 +724,7 @@ static int dca_subframe_header(DCAContext * s, int base_channel, int block_index
} }


if (get_bits_left(&s->gb) < 0) if (get_bits_left(&s->gb) < 0)
return -1;
return AVERROR_INVALIDDATA;


/* Scale factors for joint subband coding */ /* Scale factors for joint subband coding */
for (j = base_channel; j < s->prim_channels; j++) { for (j = base_channel; j < s->prim_channels; j++) {
@@ -1055,7 +1055,7 @@ static int decode_blockcode(int code, int levels, int *values)
return 0; return 0;
else { else {
av_log(NULL, AV_LOG_ERROR, "ERROR: block code look-up failed\n"); av_log(NULL, AV_LOG_ERROR, "ERROR: block code look-up failed\n");
return -1;
return AVERROR_INVALIDDATA;
} }
} }


@@ -1095,7 +1095,7 @@ static int dca_subsubframe(DCAContext * s, int base_channel, int block_index)


for (k = base_channel; k < s->prim_channels; k++) { for (k = base_channel; k < s->prim_channels; k++) {
if (get_bits_left(&s->gb) < 0) if (get_bits_left(&s->gb) < 0)
return -1;
return AVERROR_INVALIDDATA;


for (l = 0; l < s->vq_start_subband[k]; l++) { for (l = 0; l < s->vq_start_subband[k]; l++) {
int m; int m;
@@ -1274,12 +1274,13 @@ static int dca_subframe_footer(DCAContext * s, int base_channel)


static int dca_decode_block(DCAContext * s, int base_channel, int block_index) static int dca_decode_block(DCAContext * s, int base_channel, int block_index)
{ {
int ret;


/* Sanity check */ /* Sanity check */
if (s->current_subframe >= s->subframes) { if (s->current_subframe >= s->subframes) {
av_log(s->avctx, AV_LOG_DEBUG, "check failed: %i>%i", av_log(s->avctx, AV_LOG_DEBUG, "check failed: %i>%i",
s->current_subframe, s->subframes); s->current_subframe, s->subframes);
return -1;
return AVERROR_INVALIDDATA;
} }


if (!s->current_subsubframe) { if (!s->current_subsubframe) {
@@ -1287,16 +1288,16 @@ static int dca_decode_block(DCAContext * s, int base_channel, int block_index)
av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_header\n"); av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_header\n");
#endif #endif
/* Read subframe header */ /* Read subframe header */
if (dca_subframe_header(s, base_channel, block_index))
return -1;
if ((ret = dca_subframe_header(s, base_channel, block_index)))
return ret;
} }


/* Read subsubframe */ /* Read subsubframe */
#ifdef TRACE #ifdef TRACE
av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subsubframe\n"); av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subsubframe\n");
#endif #endif
if (dca_subsubframe(s, base_channel, block_index))
return -1;
if ((ret = dca_subsubframe(s, base_channel, block_index)))
return ret;


/* Update state */ /* Update state */
s->current_subsubframe++; s->current_subsubframe++;
@@ -1309,8 +1310,8 @@ static int dca_decode_block(DCAContext * s, int base_channel, int block_index)
av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_footer\n"); av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_footer\n");
#endif #endif
/* Read subframe footer */ /* Read subframe footer */
if (dca_subframe_footer(s, base_channel))
return -1;
if ((ret = dca_subframe_footer(s, base_channel)))
return ret;
} }


return 0; return 0;
@@ -1353,7 +1354,7 @@ static int dca_convert_bitstream(const uint8_t * src, int src_size, uint8_t * ds
flush_put_bits(&pb); flush_put_bits(&pb);
return (put_bits_count(&pb) + 7) >> 3; return (put_bits_count(&pb) + 7) >> 3;
default: default:
return -1;
return AVERROR_INVALIDDATA;
} }
} }


@@ -1649,9 +1650,9 @@ static int dca_decode_frame(AVCodecContext * avctx,


s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer,
DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE); DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE);
if (s->dca_buffer_size == -1) {
if (s->dca_buffer_size == AVERROR_INVALIDDATA) {
av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n"); av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
return -1;
return AVERROR_INVALIDDATA;
} }


init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8);
@@ -1798,7 +1799,7 @@ static int dca_decode_frame(AVCodecContext * avctx,


if (channels > !!s->lfe && if (channels > !!s->lfe &&
s->channel_order_tab[channels - 1 - !!s->lfe] < 0) s->channel_order_tab[channels - 1 - !!s->lfe] < 0)
return -1;
return AVERROR_INVALIDDATA;


if (avctx->request_channels == 2 && s->prim_channels > 2) { if (avctx->request_channels == 2 && s->prim_channels > 2) {
channels = 2; channels = 2;
@@ -1807,7 +1808,7 @@ static int dca_decode_frame(AVCodecContext * avctx,
} }
} else { } else {
av_log(avctx, AV_LOG_ERROR, "Non standard configuration %d !\n",s->amode); av_log(avctx, AV_LOG_ERROR, "Non standard configuration %d !\n",s->amode);
return -1;
return AVERROR_INVALIDDATA;
} }




@@ -1823,13 +1824,13 @@ static int dca_decode_frame(AVCodecContext * avctx,
if (avctx->channels != channels) { if (avctx->channels != channels) {
av_log(avctx, AV_LOG_ERROR, "DCA decoder does not support number of " av_log(avctx, AV_LOG_ERROR, "DCA decoder does not support number of "
"channels changing in stream. Skipping frame.\n"); "channels changing in stream. Skipping frame.\n");
return -1;
return AVERROR_PATCHWELCOME;
} }


out_size = 256 / 8 * s->sample_blocks * channels * out_size = 256 / 8 * s->sample_blocks * channels *
av_get_bytes_per_sample(avctx->sample_fmt); av_get_bytes_per_sample(avctx->sample_fmt);
if (*data_size < out_size) if (*data_size < out_size)
return -1;
return AVERROR(EINVAL);
*data_size = out_size; *data_size = out_size;


/* filter to get final output */ /* filter to get final output */


Loading…
Cancel
Save