2 * Real Audio 1.0 (14.4K)
3 * Copyright (c) 2003 the ffmpeg project
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "bitstream.h"
26 #define NBLOCKS 4 ///< number of subblocks within a block
27 #define BLOCKSIZE 40 ///< subblock size in 16-bit words
28 #define BUFFERSIZE 146 ///< the size of the adaptive codebook
32 unsigned int old_energy
; ///< previous frame energy
34 unsigned int lpc_tables
[2][10];
35 unsigned int *lpc_coef
; ///< LPC coefficients
36 unsigned int *lpc_coef_old
; ///< previous frame LPC coefficients
37 unsigned int lpc_refl_rms
;
38 unsigned int lpc_refl_rms_old
;
40 /** the current subblock padded by the last 10 values of the previous one*/
41 int16_t curr_sblock
[50];
43 /** adaptive codebook. Its size is two units bigger to avoid a
45 uint16_t adapt_cb
[148];
48 static int ra144_decode_init(AVCodecContext
* avctx
)
50 RA144Context
*ractx
= avctx
->priv_data
;
52 ractx
->lpc_coef
= ractx
->lpc_tables
[0];
53 ractx
->lpc_coef_old
= ractx
->lpc_tables
[1];
59 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
60 * odd way to make the output identical to the binary decoder.
62 static int t_sqrt(unsigned int x
)
70 return ff_sqrt(x
<< 20) << s
;
74 * Evaluate the LPC filter coefficients from the reflection coefficients.
75 * Does the inverse of the eval_refl() function.
77 static void eval_coefs(const int *refl
, int *coefs
)
84 for (x
=0; x
< 10; x
++) {
88 b1
[y
] = ((refl
[x
] * b2
[x
-y
-1]) >> 12) + b2
[y
];
90 FFSWAP(int *, b1
, b2
);
93 for (x
=0; x
< 10; x
++)
98 * Copy the last offset values of *source to *target. If those values are not
99 * enough to fill the target buffer, fill it with another copy of those values.
101 static void copy_and_dup(const int16_t *source
, int16_t *target
, int offset
)
103 source
+= BUFFERSIZE
- offset
;
105 if (offset
> BLOCKSIZE
) {
106 memcpy(target
, source
, BLOCKSIZE
*sizeof(*target
));
108 memcpy(target
, source
, offset
*sizeof(*target
));
109 memcpy(target
+ offset
, source
, (BLOCKSIZE
- offset
)*sizeof(*target
));
113 /** inverse root mean square */
114 static int irms(const int16_t *data
)
116 unsigned int i
, sum
= 0;
118 for (i
=0; i
< BLOCKSIZE
; i
++)
119 sum
+= data
[i
] * data
[i
];
122 return 0; /* OOPS - division by zero */
124 return 0x20000000 / (t_sqrt(sum
) >> 8);
127 static void add_wav(int n
, int skip_first
, int *m
, const int16_t *s1
,
128 const int8_t *s2
, const int8_t *s3
, int16_t *dest
)
134 for (i
=!skip_first
; i
<3; i
++)
135 v
[i
] = (gain_val_tab
[n
][i
] * m
[i
]) >> (gain_exp_tab
[n
][i
] + 1);
137 for (i
=0; i
< BLOCKSIZE
; i
++)
138 dest
[i
] = ((*(s1
++))*v
[0] + (*(s2
++))*v
[1] + (*(s3
++))*v
[2]) >> 12;
142 * LPC Filter. Each output value is predicted from the 10 previous computed
143 * ones. It overwrites the input with the output.
145 * @param in the input of the filter. It should be an array of size len + 10.
146 * The 10 first input values are used to evaluate the first filtered one.
148 static void lpc_filter(const int16_t *lpc_coefs
, uint16_t *in
, int len
)
153 for (i
=0; i
<len
; i
++) {
158 sum
+= lpc_coefs
[9-x
] * ptr
[x
];
162 new_val
= ptr
[10] - sum
;
164 if (new_val
< -32768 || new_val
> 32767) {
174 static unsigned int rescale_rms(unsigned int rms
, unsigned int energy
)
176 return (rms
* energy
) >> 10;
179 static unsigned int rms(const int *data
)
182 unsigned int res
= 0x10000;
185 for (x
=0; x
<10; x
++) {
186 res
= (((0x1000000 - (*data
) * (*data
)) >> 12) * res
) >> 12;
191 while (res
<= 0x3fff) {
204 static void do_output_subblock(RA144Context
*ractx
,
205 const uint16_t *lpc_coefs
, int gval
,
208 uint16_t buffer_a
[40];
210 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
211 int gain
= get_bits(gb
, 8);
212 int cb1_idx
= get_bits(gb
, 7);
213 int cb2_idx
= get_bits(gb
, 7);
217 cba_idx
+= BLOCKSIZE
/2 - 1;
218 copy_and_dup(ractx
->adapt_cb
, buffer_a
, cba_idx
);
219 m
[0] = (irms(buffer_a
) * gval
) >> 12;
224 m
[1] = ((cb1_base
[cb1_idx
] >> 4) * gval
) >> 8;
225 m
[2] = ((cb2_base
[cb2_idx
] >> 4) * gval
) >> 8;
227 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
228 (BUFFERSIZE
- BLOCKSIZE
) * 2);
230 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
232 add_wav(gain
, cba_idx
, m
, buffer_a
, cb1_vects
[cb1_idx
], cb2_vects
[cb2_idx
],
235 memcpy(ractx
->curr_sblock
, ractx
->curr_sblock
+ 40,
236 10*sizeof(*ractx
->curr_sblock
));
237 memcpy(ractx
->curr_sblock
+ 10, block
,
238 BLOCKSIZE
*sizeof(*ractx
->curr_sblock
));
240 lpc_filter(lpc_coefs
, ractx
->curr_sblock
, BLOCKSIZE
);
243 static void int_to_int16(int16_t *out
, const int *inp
)
252 * Evaluate the reflection coefficients from the filter coefficients.
253 * Does the inverse of the eval_coefs() function.
255 * @return 1 if one of the reflection coefficients is of magnitude greater than
258 static int eval_refl(const int16_t *coefs
, int *refl
, RA144Context
*ractx
)
268 for (i
=0; i
< 10; i
++)
269 buffer2
[i
] = coefs
[i
];
271 u
= refl
[9] = bp2
[9];
273 if (u
+ 0x1000 > 0x1fff) {
274 av_log(ractx
, AV_LOG_ERROR
, "Overflow. Broken sample?\n");
278 for (c
=8; c
>= 0; c
--) {
285 b
= 0x1000-((u
* u
) >> 12);
291 bp1
[u
] = ((bp2
[u
] - ((refl
[c
+1] * bp2
[c
-u
]) >> 12)) * (0x1000000 / b
)) >> 12;
293 refl
[c
] = u
= bp1
[c
];
295 if ((u
+ 0x1000) > 0x1fff)
298 FFSWAP(int *, bp1
, bp2
);
303 static int interp(RA144Context
*ractx
, int16_t *out
, int block_num
,
304 int copynew
, int energy
)
307 int a
= block_num
+ 1;
311 // Interpolate block coefficients from the this frame forth block and
312 // last frame forth block
314 out
[x
] = (a
* ractx
->lpc_coef
[x
] + b
* ractx
->lpc_coef_old
[x
])>> 2;
316 if (eval_refl(out
, work
, ractx
)) {
317 // The interpolated coefficients are unstable, copy either new or old
320 int_to_int16(out
, ractx
->lpc_coef
);
321 return rescale_rms(ractx
->lpc_refl_rms
, energy
);
323 int_to_int16(out
, ractx
->lpc_coef_old
);
324 return rescale_rms(ractx
->lpc_refl_rms_old
, energy
);
327 return rescale_rms(rms(work
), energy
);
331 /* Uncompress one block (20 bytes -> 160*2 bytes) */
332 static int ra144_decode_frame(AVCodecContext
* avctx
,
333 void *vdata
, int *data_size
,
334 const uint8_t * buf
, int buf_size
)
336 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
337 unsigned int refl_rms
[4]; // RMS of the reflection coefficients
338 uint16_t block_coefs
[4][30]; // LPC coefficients of each sub-block
339 unsigned int lpc_refl
[10]; // LPC reflection coefficients of the frame
341 int16_t *data
= vdata
;
344 RA144Context
*ractx
= avctx
->priv_data
;
348 av_log(avctx
, AV_LOG_ERROR
,
349 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
353 init_get_bits(&gb
, buf
, 20 * 8);
356 // "<< 1"? Doesn't this make one value out of two of the table useless?
357 lpc_refl
[i
] = lpc_refl_cb
[i
][get_bits(&gb
, sizes
[i
]) << 1];
359 eval_coefs(lpc_refl
, ractx
->lpc_coef
);
360 ractx
->lpc_refl_rms
= rms(lpc_refl
);
362 energy
= energy_tab
[get_bits(&gb
, 5) << 1]; // Useless table entries?
364 refl_rms
[0] = interp(ractx
, block_coefs
[0], 0, 0, ractx
->old_energy
);
365 refl_rms
[1] = interp(ractx
, block_coefs
[1], 1, energy
> ractx
->old_energy
,
366 t_sqrt(energy
*ractx
->old_energy
) >> 12);
367 refl_rms
[2] = interp(ractx
, block_coefs
[2], 2, 1, energy
);
368 refl_rms
[3] = rescale_rms(ractx
->lpc_refl_rms
, energy
);
370 int_to_int16(block_coefs
[3], ractx
->lpc_coef
);
372 for (c
=0; c
<4; c
++) {
373 do_output_subblock(ractx
, block_coefs
[c
], refl_rms
[c
], &gb
);
375 for (i
=0; i
<BLOCKSIZE
; i
++)
376 *data
++ = av_clip_int16(ractx
->curr_sblock
[i
+ 10] << 2);
379 ractx
->old_energy
= energy
;
380 ractx
->lpc_refl_rms_old
= ractx
->lpc_refl_rms
;
382 FFSWAP(unsigned int *, ractx
->lpc_coef_old
, ractx
->lpc_coef
);
388 AVCodec ra_144_decoder
=
393 sizeof(RA144Context
),
398 .long_name
= NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),