ffmpeg / libavcodec / ra144dec.c @ d36beb3f
History  View  Annotate  Download (3.96 KB)
1 
/*


2 
* Real Audio 1.0 (14.4K)

3 
*

4 
* Copyright (c) 2008 Vitor Sessak

5 
* Copyright (c) 2003 Nick Kurshev

6 
* Based on public domain decoder at http://www.honeypot.net/audio

7 
*

8 
* This file is part of FFmpeg.

9 
*

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.

14 
*

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.

19 
*

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 021101301 USA

23 
*/

24  
25 
#include "libavutil/intmath.h" 
26 
#include "avcodec.h" 
27 
#include "get_bits.h" 
28 
#include "ra144.h" 
29  
30  
31 
static av_cold int ra144_decode_init(AVCodecContext * avctx) 
32 
{ 
33 
RA144Context *ractx = avctx>priv_data; 
34  
35 
ractx>avctx = avctx; 
36  
37 
ractx>lpc_coef[0] = ractx>lpc_tables[0]; 
38 
ractx>lpc_coef[1] = ractx>lpc_tables[1]; 
39  
40 
avctx>sample_fmt = AV_SAMPLE_FMT_S16; 
41 
return 0; 
42 
} 
43  
44 
static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs, 
45 
int gval, GetBitContext *gb)

46 
{ 
47 
int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none 
48 
int gain = get_bits(gb, 8); 
49 
int cb1_idx = get_bits(gb, 7); 
50 
int cb2_idx = get_bits(gb, 7); 
51  
52 
ff_subblock_synthesis(ractx, lpc_coefs, cba_idx, cb1_idx, cb2_idx, gval, 
53 
gain); 
54 
} 
55  
56 
/** Uncompress one block (20 bytes > 160*2 bytes). */

57 
static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, 
58 
int *data_size, AVPacket *avpkt)

59 
{ 
60 
const uint8_t *buf = avpkt>data;

61 
int buf_size = avpkt>size;

62 
static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; 
63 
unsigned int refl_rms[4]; // RMS of the reflection coefficients 
64 
uint16_t block_coefs[4][10]; // LPC coefficients of each subblock 
65 
unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame 
66 
int i, j;

67 
int16_t *data = vdata; 
68 
unsigned int energy; 
69  
70 
RA144Context *ractx = avctx>priv_data; 
71 
GetBitContext gb; 
72  
73 
if (*data_size < 2*160) 
74 
return 1; 
75  
76 
if(buf_size < 20) { 
77 
av_log(avctx, AV_LOG_ERROR, 
78 
"Frame too small (%d bytes). Truncated file?\n", buf_size);

79 
*data_size = 0;

80 
return buf_size;

81 
} 
82 
init_get_bits(&gb, buf, 20 * 8); 
83  
84 
for (i=0; i<10; i++) 
85 
lpc_refl[i] = ff_lpc_refl_cb[i][get_bits(&gb, sizes[i])]; 
86  
87 
ff_eval_coefs(ractx>lpc_coef[0], lpc_refl);

88 
ractx>lpc_refl_rms[0] = ff_rms(lpc_refl);

89  
90 
energy = ff_energy_tab[get_bits(&gb, 5)];

91  
92 
refl_rms[0] = ff_interp(ractx, block_coefs[0], 1, 1, ractx>old_energy); 
93 
refl_rms[1] = ff_interp(ractx, block_coefs[1], 2, 
94 
energy <= ractx>old_energy, 
95 
ff_t_sqrt(energy*ractx>old_energy) >> 12);

96 
refl_rms[2] = ff_interp(ractx, block_coefs[2], 3, 0, energy); 
97 
refl_rms[3] = ff_rescale_rms(ractx>lpc_refl_rms[0], energy); 
98  
99 
ff_int_to_int16(block_coefs[3], ractx>lpc_coef[0]); 
100  
101 
for (i=0; i < 4; i++) { 
102 
do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb); 
103  
104 
for (j=0; j < BLOCKSIZE; j++) 
105 
*data++ = av_clip_int16(ractx>curr_sblock[j + 10] << 2); 
106 
} 
107  
108 
ractx>old_energy = energy; 
109 
ractx>lpc_refl_rms[1] = ractx>lpc_refl_rms[0]; 
110  
111 
FFSWAP(unsigned int *, ractx>lpc_coef[0], ractx>lpc_coef[1]); 
112  
113 
*data_size = 2*160; 
114 
return 20; 
115 
} 
116  
117 
AVCodec ff_ra_144_decoder = 
118 
{ 
119 
"real_144",

120 
AVMEDIA_TYPE_AUDIO, 
121 
CODEC_ID_RA_144, 
122 
sizeof(RA144Context),

123 
ra144_decode_init, 
124 
NULL,

125 
NULL,

126 
ra144_decode_frame, 
127 
.long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),

128 
}; 