apedec: consume the whole packet when copying to the decoder buffer.
This avoids artifically consuming a partial packet but ignoring remaining data in subsequent calls.
This commit is contained in:
parent
de157f2118
commit
c298b2b8db
@ -155,7 +155,6 @@ typedef struct APEContext {
|
||||
uint8_t *data; ///< current frame data
|
||||
uint8_t *data_end; ///< frame data end
|
||||
const uint8_t *ptr; ///< current position in frame data
|
||||
const uint8_t *last_ptr; ///< position where last 4608-sample block ended
|
||||
|
||||
int error;
|
||||
} APEContext;
|
||||
@ -816,7 +815,7 @@ static int ape_decode_frame(AVCodecContext *avctx,
|
||||
int16_t *samples = data;
|
||||
int i;
|
||||
int blockstodecode, out_size;
|
||||
int bytes_used;
|
||||
int bytes_used = 0;
|
||||
|
||||
/* this should never be negative, but bad things will happen if it is, so
|
||||
check it just to make sure. */
|
||||
@ -826,6 +825,10 @@ static int ape_decode_frame(AVCodecContext *avctx,
|
||||
uint32_t nblocks, offset;
|
||||
void *tmp_data;
|
||||
|
||||
if (!buf_size) {
|
||||
*data_size = 0;
|
||||
return 0;
|
||||
}
|
||||
if (buf_size < 8) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -836,7 +839,7 @@ static int ape_decode_frame(AVCodecContext *avctx,
|
||||
return AVERROR(ENOMEM);
|
||||
s->data = tmp_data;
|
||||
s->dsp.bswap_buf((uint32_t*)s->data, (const uint32_t*)buf, buf_size >> 2);
|
||||
s->ptr = s->last_ptr = s->data;
|
||||
s->ptr = s->data;
|
||||
s->data_end = s->data + buf_size;
|
||||
|
||||
nblocks = bytestream_get_be32(&s->ptr);
|
||||
@ -866,6 +869,8 @@ static int ape_decode_frame(AVCodecContext *avctx,
|
||||
av_log(avctx, AV_LOG_ERROR, "Error reading frame header\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
bytes_used = buf_size;
|
||||
}
|
||||
|
||||
if (!s->data) {
|
||||
@ -904,9 +909,6 @@ static int ape_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
s->samples -= blockstodecode;
|
||||
|
||||
bytes_used = s->samples ? s->ptr - s->last_ptr : buf_size;
|
||||
s->last_ptr = s->ptr;
|
||||
|
||||
*data_size = out_size;
|
||||
return bytes_used;
|
||||
}
|
||||
@ -925,7 +927,7 @@ AVCodec ff_ape_decoder = {
|
||||
.init = ape_decode_init,
|
||||
.close = ape_decode_close,
|
||||
.decode = ape_decode_frame,
|
||||
.capabilities = CODEC_CAP_SUBFRAMES,
|
||||
.capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DELAY,
|
||||
.flush = ape_flush,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Monkey's Audio"),
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user