X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fra144dec.c;h=3be3877f313215f880d2e70da29386f22535c6f9;hb=65b8b6c476454d201348737527a1d9471f689278;hp=5fff696d8322b70c7c5e47f9c6bb7626e0ccaac0;hpb=f10524d51c1c957b58d0ceda171310caf9eaed96;p=ffmpeg diff --git a/libavcodec/ra144dec.c b/libavcodec/ra144dec.c index 5fff696d832..3be3877f313 100644 --- a/libavcodec/ra144dec.c +++ b/libavcodec/ra144dec.c @@ -22,9 +22,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavutil/intmath.h" +#include "libavutil/channel_layout.h" #include "avcodec.h" #include "get_bits.h" +#include "internal.h" #include "ra144.h" @@ -37,7 +38,10 @@ static av_cold int ra144_decode_init(AVCodecContext * avctx) ractx->lpc_coef[0] = ractx->lpc_tables[0]; ractx->lpc_coef[1] = ractx->lpc_tables[1]; - avctx->sample_fmt = AV_SAMPLE_FMT_S16; + avctx->channels = 1; + avctx->channel_layout = AV_CH_LAYOUT_MONO; + avctx->sample_fmt = AV_SAMPLE_FMT_S16; + return 0; } @@ -54,9 +58,10 @@ static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs, } /** Uncompress one block (20 bytes -> 160*2 bytes). */ -static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, - int *data_size, AVPacket *avpkt) +static int ra144_decode_frame(AVCodecContext * avctx, void *data, + int *got_frame_ptr, AVPacket *avpkt) { + AVFrame *frame = data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; static const uint8_t sizes[LPC_ORDER] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; @@ -64,25 +69,28 @@ static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, uint16_t block_coefs[NBLOCKS][LPC_ORDER]; // LPC coefficients of each sub-block unsigned int lpc_refl[LPC_ORDER]; // LPC reflection coefficients of the frame int i, j; - int out_size; - int16_t *data = vdata; + int ret; + int16_t *samples; unsigned int energy; RA144Context *ractx = avctx->priv_data; GetBitContext gb; - out_size = NBLOCKS * BLOCKSIZE * av_get_bytes_per_sample(avctx->sample_fmt); - if (*data_size < out_size) { - av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); - return AVERROR(EINVAL); - } - - if(buf_size < FRAMESIZE) { + if (buf_size < FRAMESIZE) { av_log(avctx, AV_LOG_ERROR, "Frame too small (%d bytes). Truncated file?\n", buf_size); - *data_size = 0; - return buf_size; + *got_frame_ptr = 0; + return AVERROR_INVALIDDATA; + } + + /* get output buffer */ + frame->nb_samples = NBLOCKS * BLOCKSIZE; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return ret; } + samples = (int16_t *)frame->data[0]; + init_get_bits(&gb, buf, FRAMESIZE * 8); for (i = 0; i < LPC_ORDER; i++) @@ -106,7 +114,7 @@ static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb); for (j=0; j < BLOCKSIZE; j++) - *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2); + *samples++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2); } ractx->old_energy = energy; @@ -114,16 +122,18 @@ static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]); - *data_size = out_size; + *got_frame_ptr = 1; + return FRAMESIZE; } AVCodec ff_ra_144_decoder = { .name = "real_144", + .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_RA_144, + .id = AV_CODEC_ID_RA_144, .priv_data_size = sizeof(RA144Context), .init = ra144_decode_init, .decode = ra144_decode_frame, - .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), + .capabilities = CODEC_CAP_DR1, };