2 * Real Audio 1.0 (14.4K)
4 * Copyright (c) 2008 Vitor Sessak
5 * Copyright (c) 2003 Nick Kurshev
6 * Based on public domain decoder at http://www.honeypot.net/audio
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "libavutil/channel_layout.h"
32 static av_cold
int ra144_decode_init(AVCodecContext
* avctx
)
34 RA144Context
*ractx
= avctx
->priv_data
;
37 ff_audiodsp_init(&ractx
->adsp
);
39 ractx
->lpc_coef
[0] = ractx
->lpc_tables
[0];
40 ractx
->lpc_coef
[1] = ractx
->lpc_tables
[1];
43 avctx
->channel_layout
= AV_CH_LAYOUT_MONO
;
44 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16
;
49 static void do_output_subblock(RA144Context
*ractx
, const int16_t *lpc_coefs
,
50 int gval
, GetBitContext
*gb
)
52 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
53 int gain
= get_bits(gb
, 8);
54 int cb1_idx
= get_bits(gb
, 7);
55 int cb2_idx
= get_bits(gb
, 7);
57 ff_subblock_synthesis(ractx
, lpc_coefs
, cba_idx
, cb1_idx
, cb2_idx
, gval
,
61 /** Uncompress one block (20 bytes -> 160*2 bytes). */
62 static int ra144_decode_frame(AVCodecContext
* avctx
, void *data
,
63 int *got_frame_ptr
, AVPacket
*avpkt
)
65 AVFrame
*frame
= data
;
66 const uint8_t *buf
= avpkt
->data
;
67 int buf_size
= avpkt
->size
;
68 static const uint8_t sizes
[LPC_ORDER
] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
69 unsigned int refl_rms
[NBLOCKS
]; // RMS of the reflection coefficients
70 int16_t block_coefs
[NBLOCKS
][LPC_ORDER
]; // LPC coefficients of each sub-block
71 unsigned int lpc_refl
[LPC_ORDER
]; // LPC reflection coefficients of the frame
77 RA144Context
*ractx
= avctx
->priv_data
;
80 if (buf_size
< FRAME_SIZE
) {
81 av_log(avctx
, AV_LOG_ERROR
,
82 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
84 return AVERROR_INVALIDDATA
;
87 /* get output buffer */
88 frame
->nb_samples
= NBLOCKS
* BLOCKSIZE
;
89 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
91 samples
= (int16_t *)frame
->data
[0];
93 init_get_bits8(&gb
, buf
, FRAME_SIZE
);
95 for (i
= 0; i
< LPC_ORDER
; i
++)
96 lpc_refl
[i
] = ff_lpc_refl_cb
[i
][get_bits(&gb
, sizes
[i
])];
98 ff_eval_coefs(ractx
->lpc_coef
[0], lpc_refl
);
99 ractx
->lpc_refl_rms
[0] = ff_rms(lpc_refl
);
101 energy
= ff_energy_tab
[get_bits(&gb
, 5)];
103 refl_rms
[0] = ff_interp(ractx
, block_coefs
[0], 1, 1, ractx
->old_energy
);
104 refl_rms
[1] = ff_interp(ractx
, block_coefs
[1], 2,
105 energy
<= ractx
->old_energy
,
106 ff_t_sqrt(energy
*ractx
->old_energy
) >> 12);
107 refl_rms
[2] = ff_interp(ractx
, block_coefs
[2], 3, 0, energy
);
108 refl_rms
[3] = ff_rescale_rms(ractx
->lpc_refl_rms
[0], energy
);
110 ff_int_to_int16(block_coefs
[3], ractx
->lpc_coef
[0]);
112 for (i
=0; i
< NBLOCKS
; i
++) {
113 do_output_subblock(ractx
, block_coefs
[i
], refl_rms
[i
], &gb
);
115 for (j
=0; j
< BLOCKSIZE
; j
++)
116 *samples
++ = av_clip_int16(ractx
->curr_sblock
[j
+ 10] << 2);
119 ractx
->old_energy
= energy
;
120 ractx
->lpc_refl_rms
[1] = ractx
->lpc_refl_rms
[0];
122 FFSWAP(unsigned int *, ractx
->lpc_coef
[0], ractx
->lpc_coef
[1]);
129 AVCodec ff_ra_144_decoder
= {
131 .long_name
= NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
132 .type
= AVMEDIA_TYPE_AUDIO
,
133 .id
= AV_CODEC_ID_RA_144
,
134 .priv_data_size
= sizeof(RA144Context
),
135 .init
= ra144_decode_init
,
136 .decode
= ra144_decode_frame
,
137 .capabilities
= CODEC_CAP_DR1
,