annotate ra144.c @ 9081:06fd12c6b7e6 libavcodec

RA144: work around gcc bug/oddity on ARM This should not make any difference, yet some gcc versions on ARM produce incorrect output without this fix. Approved by Vitor.
author mru
date Sun, 01 Mar 2009 23:41:39 +0000
parents 2692e0a168cf
children 54bc8a2727b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
1 /*
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
2 * Real Audio 1.0 (14.4K)
7163
ec5bae4d05a2 Update copyright
vitor
parents: 7162
diff changeset
3 *
ec5bae4d05a2 Update copyright
vitor
parents: 7162
diff changeset
4 * Copyright (c) 2008 Vitor Sessak
ec5bae4d05a2 Update copyright
vitor
parents: 7162
diff changeset
5 * Copyright (c) 2003 Nick Kurshev
ec5bae4d05a2 Update copyright
vitor
parents: 7162
diff changeset
6 * Based on public domain decoder at http://www.honeypot.net/audio
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
7 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
8 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
9 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * FFmpeg is free software; you can redistribute it and/or
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
11 * modify it under the terms of the GNU Lesser General Public
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
12 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
13 * version 2.1 of the License, or (at your option) any later version.
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
14 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
15 * FFmpeg is distributed in the hope that it will be useful,
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
18 * Lesser General Public License for more details.
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
19 *
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
20 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
21 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
23 */
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
24
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
25 #include "avcodec.h"
6768
e14c77547f93 Rewrite unpack_input() completely, patch by Vitor Sessak, vitor1001 gmail com.
diego
parents: 6767
diff changeset
26 #include "bitstream.h"
1335
b4a72edb3a71 moved the tables into header files (and applied the 'static' patch). Nick: why do you like mergeing tables and code into one file, so making it unusable big?
al3x
parents: 1305
diff changeset
27 #include "ra144.h"
8049
611a21e4b01b Split off celp_filters.[ch] from acelp_filters.[ch] for the QCELP decoder.
diego
parents: 7847
diff changeset
28 #include "celp_filters.h"
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
29
7107
1d9f28fe9bd3 Document defines better
vitor
parents: 7106
diff changeset
30 #define NBLOCKS 4 ///< number of subblocks within a block
1d9f28fe9bd3 Document defines better
vitor
parents: 7106
diff changeset
31 #define BLOCKSIZE 40 ///< subblock size in 16-bit words
1d9f28fe9bd3 Document defines better
vitor
parents: 7106
diff changeset
32 #define BUFFERSIZE 146 ///< the size of the adaptive codebook
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
33
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
34
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
35 typedef struct {
6910
67c615c7e19c Add comment
vitor
parents: 6909
diff changeset
36 unsigned int old_energy; ///< previous frame energy
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
37
7005
6e374f47da64 Remove *lpc_refl from the context. Only the value
vitor
parents: 7004
diff changeset
38 unsigned int lpc_tables[2][10];
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
39
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
40 /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
41 * and lpc_coef[1] of the previous one. */
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
42 unsigned int *lpc_coef[2];
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
43
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
44 unsigned int lpc_refl_rms[2];
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
45
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
46 /** The current subblock padded by the last 10 values of the previous one. */
7096
1ad555e54621 Avoid a memcpy. Code is also simpler now in my opinion.
vitor
parents: 7085
diff changeset
47 int16_t curr_sblock[50];
1ad555e54621 Avoid a memcpy. Code is also simpler now in my opinion.
vitor
parents: 7085
diff changeset
48
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
49 /** Adaptive codebook, its size is two units bigger to avoid a
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
50 * buffer overflow. */
7827
82fc486cd128 Cosmetics: Make the two additional units in size more clear
vitor
parents: 7801
diff changeset
51 uint16_t adapt_cb[146+2];
6894
eb3c16b99f27 Rename context struct to be more consistent with the rest of ffmpeg
vitor
parents: 6888
diff changeset
52 } RA144Context;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
53
7828
0dc972a25a37 Add av_cold attribute to decode_init()
vitor
parents: 7827
diff changeset
54 static av_cold int ra144_decode_init(AVCodecContext * avctx)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
55 {
6895
c63e9357e2a8 Context vars are not global vars. glob is a bad name for it.
vitor
parents: 6894
diff changeset
56 RA144Context *ractx = avctx->priv_data;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
57
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
58 ractx->lpc_coef[0] = ractx->lpc_tables[0];
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
59 ractx->lpc_coef[1] = ractx->lpc_tables[1];
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
60
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7447
diff changeset
61 avctx->sample_fmt = SAMPLE_FMT_S16;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
62 return 0;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
63 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
64
6899
61283b6e5f73 Update comment
vitor
parents: 6898
diff changeset
65 /**
6902
b6e110c575ff cosmetics: typo
diego
parents: 6900
diff changeset
66 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
6899
61283b6e5f73 Update comment
vitor
parents: 6898
diff changeset
67 * odd way to make the output identical to the binary decoder.
61283b6e5f73 Update comment
vitor
parents: 6898
diff changeset
68 */
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
69 static int t_sqrt(unsigned int x)
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
70 {
7104
8a4a7069737d Simplify t_sqrt()
vitor
parents: 7103
diff changeset
71 int s = 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
72 while (x > 0xfff) {
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
73 s++;
7507
8f89a4d76a71 Cosmetical simplification in t_sqrt()
vitor
parents: 7506
diff changeset
74 x >>= 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
75 }
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
76
7104
8a4a7069737d Simplify t_sqrt()
vitor
parents: 7103
diff changeset
77 return ff_sqrt(x << 20) << s;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
78 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
79
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
80 /**
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
81 * Evaluate the LPC filter coefficients from the reflection coefficients.
6965
a7f6b979de4b Rename functions
vitor
parents: 6964
diff changeset
82 * Does the inverse of the eval_refl() function.
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
83 */
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
84 static void eval_coefs(int *coefs, const int *refl)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
85 {
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
86 int buffer[10];
6782
781bfad6e40e Simplify do_voice().
astrange
parents: 6781
diff changeset
87 int *b1 = buffer;
6964
3504fdd54fd3 Rename variables
vitor
parents: 6952
diff changeset
88 int *b2 = coefs;
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
89 int i, j;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2288
diff changeset
90
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
91 for (i=0; i < 10; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
92 b1[i] = refl[i] << 4;
6782
781bfad6e40e Simplify do_voice().
astrange
parents: 6781
diff changeset
93
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
94 for (j=0; j < i; j++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
95 b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
96
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
97 FFSWAP(int *, b1, b2);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
98 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
99
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
100 for (i=0; i < 10; i++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
101 coefs[i] >>= 4;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
102 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
103
7105
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
104 /**
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
105 * Copy the last offset values of *source to *target. If those values are not
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
106 * enough to fill the target buffer, fill it with another copy of those values.
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
107 */
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
108 static void copy_and_dup(int16_t *target, const int16_t *source, int offset)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
109 {
6831
5ea1c314fae9 Minor simplification of rotate_block()
vitor
parents: 6830
diff changeset
110 source += BUFFERSIZE - offset;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
111
7829
7640294af313 Simplify if() in copy_and_dup()
vitor
parents: 7828
diff changeset
112 memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
7640294af313 Simplify if() in copy_and_dup()
vitor
parents: 7828
diff changeset
113 if (offset < BLOCKSIZE)
7100
a17b3a67a719 Simplify rotate_buffer()
vitor
parents: 7097
diff changeset
114 memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
115 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
116
7110
f9ebb1553982 More comments removal/fixes
vitor
parents: 7109
diff changeset
117 /** inverse root mean square */
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
118 static int irms(const int16_t *data)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
119 {
6838
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
120 unsigned int i, sum = 0;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
121
6838
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
122 for (i=0; i < BLOCKSIZE; i++)
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
123 sum += data[i] * data[i];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
124
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
125 if (sum == 0)
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
126 return 0; /* OOPS - division by zero */
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
127
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
128 return 0x20000000 / (t_sqrt(sum) >> 8);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
129 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
130
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
131 static void add_wav(int16_t *dest, int n, int skip_first, int *m,
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
132 const int16_t *s1, const int8_t *s2, const int8_t *s3)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
133 {
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
134 int i;
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
135 int v[3];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
136
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
137 v[0] = 0;
6880
c39a7f5f10cb Rename var
vitor
parents: 6879
diff changeset
138 for (i=!skip_first; i<3; i++)
7834
b9a26c7e64ef Normalize triplets in gain_val_tab[][] so gain_exp_tab[] can be just an
vitor
parents: 7830
diff changeset
139 v[i] = (gain_val_tab[n][i] * m[i]) >> gain_exp_tab[n];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
140
9077
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
141 if (v[0]) {
9078
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
142 for (i=0; i < BLOCKSIZE; i++)
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
143 dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
9077
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
144 } else {
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
145 for (i=0; i < BLOCKSIZE; i++)
9078
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
146 dest[i] = ( s2[i]*v[1] + s3[i]*v[2]) >> 12;
9077
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
147 }
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
148 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
149
7113
fbe727fbd8d1 rescale_rms() should use unsigned ints
vitor
parents: 7112
diff changeset
150 static unsigned int rescale_rms(unsigned int rms, unsigned int energy)
7004
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
151 {
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
152 return (rms * energy) >> 10;
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
153 }
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
154
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
155 static unsigned int rms(const int *data)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
156 {
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
157 int i;
6850
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
158 unsigned int res = 0x10000;
7508
f516e1101167 Simplify rms(): merge a few operations in the same statement
vitor
parents: 7507
diff changeset
159 int b = 10;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
160
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
161 for (i=0; i < 10; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
162 res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
163
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
164 if (res == 0)
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
165 return 0;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
166
6850
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
167 while (res <= 0x3fff) {
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
168 b++;
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
169 res <<= 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
170 }
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
171 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
172
7508
f516e1101167 Simplify rms(): merge a few operations in the same statement
vitor
parents: 7507
diff changeset
173 return t_sqrt(res) >> b;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
174 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
175
7133
6a25c2867e2f More cosmetics
vitor
parents: 7132
diff changeset
176 static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs,
6a25c2867e2f More cosmetics
vitor
parents: 7132
diff changeset
177 int gval, GetBitContext *gb)
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
178 {
6887
1b346861c9dc Use (u)int16_t instead of (unsigned) short
vitor
parents: 6882
diff changeset
179 uint16_t buffer_a[40];
1b346861c9dc Use (u)int16_t instead of (unsigned) short
vitor
parents: 6882
diff changeset
180 uint16_t *block;
6907
8b0db8b07a21 cosmetics: typo fixes
diego
parents: 6902
diff changeset
181 int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none
6900
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
182 int gain = get_bits(gb, 8);
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
183 int cb1_idx = get_bits(gb, 7);
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
184 int cb2_idx = get_bits(gb, 7);
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
185 int m[3];
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
186
6900
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
187 if (cba_idx) {
7106
709ee2a35813 Remove useless define
vitor
parents: 7105
diff changeset
188 cba_idx += BLOCKSIZE/2 - 1;
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
189 copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
190 m[0] = (irms(buffer_a) * gval) >> 12;
6888
b2f2c09af893 Merge two if's
vitor
parents: 6887
diff changeset
191 } else {
b2f2c09af893 Merge two if's
vitor
parents: 6887
diff changeset
192 m[0] = 0;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
193 }
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
194
7121
18d60d9b0895 Merge the >> 4 calculation of cb1_base in the table
vitor
parents: 7120
diff changeset
195 m[1] = (cb1_base[cb1_idx] * gval) >> 8;
18d60d9b0895 Merge the >> 4 calculation of cb1_base in the table
vitor
parents: 7120
diff changeset
196 m[2] = (cb2_base[cb2_idx] * gval) >> 8;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
197
6896
5f79e5940b33 Rename var: buffer_2 is an adaptive codebook
vitor
parents: 6895
diff changeset
198 memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
7119
39be110f531d Use sizeof() intead of hardcoding the values
vitor
parents: 7118
diff changeset
199 (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
6882
ea9e8492d9d7 More cosmetics
vitor
parents: 6881
diff changeset
200
6896
5f79e5940b33 Rename var: buffer_2 is an adaptive codebook
vitor
parents: 6895
diff changeset
201 block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
202
9081
06fd12c6b7e6 RA144: work around gcc bug/oddity on ARM
mru
parents: 9078
diff changeset
203 add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
204 cb1_vects[cb1_idx], cb2_vects[cb2_idx]);
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
205
7101
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
206 memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
207 10*sizeof(*ractx->curr_sblock));
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
208
8049
611a21e4b01b Split off celp_filters.[ch] from acelp_filters.[ch] for the QCELP decoder.
diego
parents: 7847
diff changeset
209 if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
611a21e4b01b Split off celp_filters.[ch] from acelp_filters.[ch] for the QCELP decoder.
diego
parents: 7847
diff changeset
210 block, BLOCKSIZE, 10, 1, 0xfff))
7162
ad0d9713e953 Use ff_acelp_lp_synthesis_filter() instead of duplicating it
vitor
parents: 7159
diff changeset
211 memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
212 }
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
213
7077
520e91c4b168 Rename vars: s/decsp/out/
vitor
parents: 7076
diff changeset
214 static void int_to_int16(int16_t *out, const int *inp)
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
215 {
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
216 int i;
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
217
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
218 for (i=0; i < 30; i++)
7800
a84494aa3818 Remove useless parentheses.
vitor
parents: 7516
diff changeset
219 *out++ = *inp++;
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
220 }
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
221
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
222 /**
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
223 * Evaluate the reflection coefficients from the filter coefficients.
6965
a7f6b979de4b Rename functions
vitor
parents: 6964
diff changeset
224 * Does the inverse of the eval_coefs() function.
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
225 *
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
226 * @return 1 if one of the reflection coefficients is greater than
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
227 * 4095, 0 if not.
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
228 */
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
229 static int eval_refl(int *refl, const int16_t *coefs, RA144Context *ractx)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
230 {
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
231 int b, i, j;
6806
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
232 int buffer1[10];
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
233 int buffer2[10];
6852
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
234 int *bp1 = buffer1;
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
235 int *bp2 = buffer2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
236
6852
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
237 for (i=0; i < 10; i++)
6964
3504fdd54fd3 Rename variables
vitor
parents: 6952
diff changeset
238 buffer2[i] = coefs[i];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
239
7515
1d5800cec7ad Simplify eval_refl(): do not store a buffer value in a var when the buffer could be used directly
vitor
parents: 7514
diff changeset
240 refl[9] = bp2[9];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
241
7515
1d5800cec7ad Simplify eval_refl(): do not store a buffer value in a var when the buffer could be used directly
vitor
parents: 7514
diff changeset
242 if ((unsigned) bp2[9] + 0x1000 > 0x1fff) {
6973
7f7de664020f Replace comments by error messages.
vitor
parents: 6972
diff changeset
243 av_log(ractx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
7116
e51975f18cb6 It makes more sense to return 1 here in case of overflow.
vitor
parents: 7115
diff changeset
244 return 1;
6973
7f7de664020f Replace comments by error messages.
vitor
parents: 6972
diff changeset
245 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
246
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
247 for (i=8; i >= 0; i--) {
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
248 b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
249
7514
e0e075680996 Simplify eval_refl(): s/b == 0/!b/
vitor
parents: 7513
diff changeset
250 if (!b)
7513
e19d0c9f50ce Simplify range checking in eval_refl(). Before the
vitor
parents: 7512
diff changeset
251 b = -2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
252
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
253 for (j=0; j <= i; j++)
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
254 bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
255
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
256 if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
7509
86b6cb5b04d5 Simplify eval_refl(): return directly when needed instead of storing the return value in a variable
vitor
parents: 7508
diff changeset
257 return 1;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
258
7801
d965e46aef4f Test a var for overflow just after it is set
vitor
parents: 7800
diff changeset
259 refl[i] = bp1[i];
d965e46aef4f Test a var for overflow just after it is set
vitor
parents: 7800
diff changeset
260
6804
24a8b213ba4d Use correct type in FFSWAP (thanks to Benoit Fouet for pointing it out)
vitor
parents: 6803
diff changeset
261 FFSWAP(int *, bp1, bp2);
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
262 }
7509
86b6cb5b04d5 Simplify eval_refl(): return directly when needed instead of storing the return value in a variable
vitor
parents: 7508
diff changeset
263 return 0;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
264 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
265
7830
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
266 static int interp(RA144Context *ractx, int16_t *out, int a,
7134
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
267 int copyold, int energy)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
268 {
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
269 int work[10];
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
270 int b = NBLOCKS - a;
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
271 int i;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
272
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
273 // Interpolate block coefficients from the this frame's forth block and
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
274 // last frame's forth block.
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
275 for (i=0; i<30; i++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
276 out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
277
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
278 if (eval_refl(work, out, ractx)) {
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
279 // The interpolated coefficients are unstable, copy either new or old
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
280 // coefficients.
7134
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
281 int_to_int16(out, ractx->lpc_coef[copyold]);
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
282 return rescale_rms(ractx->lpc_refl_rms[copyold], energy);
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
283 } else {
7004
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
284 return rescale_rms(rms(work), energy);
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
285 }
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
286 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
287
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
288 /** Uncompress one block (20 bytes -> 160*2 bytes). */
7132
22788bf6502a Cosmetics
vitor
parents: 7128
diff changeset
289 static int ra144_decode_frame(AVCodecContext * avctx, void *vdata,
22788bf6502a Cosmetics
vitor
parents: 7128
diff changeset
290 int *data_size, const uint8_t *buf, int buf_size)
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
291 {
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
292 static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
7084
424cb385c5ae Misc cosmetics
vitor
parents: 7083
diff changeset
293 unsigned int refl_rms[4]; // RMS of the reflection coefficients
6966
9eee8f8ff9e6 More variable renaming
vitor
parents: 6965
diff changeset
294 uint16_t block_coefs[4][30]; // LPC coefficients of each sub-block
7005
6e374f47da64 Remove *lpc_refl from the context. Only the value
vitor
parents: 7004
diff changeset
295 unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
296 int i, j;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
297 int16_t *data = vdata;
6898
27b34839f1db Rename var: val -> energy
vitor
parents: 6897
diff changeset
298 unsigned int energy;
6806
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
299
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
300 RA144Context *ractx = avctx->priv_data;
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
301 GetBitContext gb;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
302
7506
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
303 if (*data_size < 2*160)
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
304 return -1;
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
305
6854
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
306 if(buf_size < 20) {
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
307 av_log(avctx, AV_LOG_ERROR,
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
308 "Frame too small (%d bytes). Truncated file?\n", buf_size);
7085
f55f71e2be57 Do not write junk in the end of truncated files. FATE
vitor
parents: 7084
diff changeset
309 *data_size = 0;
6854
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
310 return buf_size;
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
311 }
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
312 init_get_bits(&gb, buf, 20 * 8);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
313
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
314 for (i=0; i<10; i++)
7127
8ab2d77fd502 Remove unused entries from lpc_refl_cb*
vitor
parents: 7126
diff changeset
315 lpc_refl[i] = lpc_refl_cb[i][get_bits(&gb, sizes[i])];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
316
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
317 eval_coefs(ractx->lpc_coef[0], lpc_refl);
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
318 ractx->lpc_refl_rms[0] = rms(lpc_refl);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
319
7126
decce608d0a9 Remove unused entries from energy_tab
vitor
parents: 7121
diff changeset
320 energy = energy_tab[get_bits(&gb, 5)];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
321
7830
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
322 refl_rms[0] = interp(ractx, block_coefs[0], 1, 1, ractx->old_energy);
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
323 refl_rms[1] = interp(ractx, block_coefs[1], 2, energy <= ractx->old_energy,
6947
080e7ee48ed1 Remove useless intermediate variable
vitor
parents: 6934
diff changeset
324 t_sqrt(energy*ractx->old_energy) >> 12);
7830
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
325 refl_rms[2] = interp(ractx, block_coefs[2], 3, 0, energy);
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
326 refl_rms[3] = rescale_rms(ractx->lpc_refl_rms[0], energy);
6968
50dd3a733f43 The function dec1() do two completly unrelated things. Split the rms calculation out of it.
vitor
parents: 6967
diff changeset
327
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
328 int_to_int16(block_coefs[3], ractx->lpc_coef[0]);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
329
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
330 for (i=0; i < 4; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
331 do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb);
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
332
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
333 for (j=0; j < BLOCKSIZE; j++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
334 *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2);
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
335 }
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
336
6898
27b34839f1db Rename var: val -> energy
vitor
parents: 6897
diff changeset
337 ractx->old_energy = energy;
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
338 ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0];
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
339
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
340 FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]);
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
341
6828
0969192d5f8b Simplify ra144_decode_frame()
vitor
parents: 6826
diff changeset
342 *data_size = 2*160;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
343 return 20;
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
344 }
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
345
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
346 AVCodec ra_144_decoder =
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
347 {
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
348 "real_144",
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
349 CODEC_TYPE_AUDIO,
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
350 CODEC_ID_RA_144,
6894
eb3c16b99f27 Rename context struct to be more consistent with the rest of ffmpeg
vitor
parents: 6888
diff changeset
351 sizeof(RA144Context),
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
352 ra144_decode_init,
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
353 NULL,
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
354 NULL,
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
355 ra144_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7005
diff changeset
356 .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
1304
e8543aab0cc9 RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from a mplayerhq (originally from public domain player for Amiga
nickols_k
parents:
diff changeset
357 };