annotate ra144.c @ 11034:fd5921186064 libavcodec

Make the fast loop filter path work with unavailable left MBs. This prevents the issue with having to switch between slow and fast code paths in each row. 0.5% faster loopfilter for cathedral
author michael
date Thu, 28 Jan 2010 02:15:25 +0000
parents 816067b00019
children e8461dae9672
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"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
26 #include "get_bits.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 {
10776
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
36 AVCodecContext *avctx;
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
37
6910
67c615c7e19c Add comment
vitor
parents: 6909
diff changeset
38 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
39
7005
6e374f47da64 Remove *lpc_refl from the context. Only the value
vitor
parents: 7004
diff changeset
40 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
41
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
42 /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
43 * 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
44 unsigned int *lpc_coef[2];
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
45
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
46 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
47
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
48 /** 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
49 int16_t curr_sblock[50];
1ad555e54621 Avoid a memcpy. Code is also simpler now in my opinion.
vitor
parents: 7085
diff changeset
50
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
51 /** Adaptive codebook, its size is two units bigger to avoid a
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
52 * buffer overflow. */
7827
82fc486cd128 Cosmetics: Make the two additional units in size more clear
vitor
parents: 7801
diff changeset
53 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
54 } 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
55
7828
0dc972a25a37 Add av_cold attribute to decode_init()
vitor
parents: 7827
diff changeset
56 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
57 {
6895
c63e9357e2a8 Context vars are not global vars. glob is a bad name for it.
vitor
parents: 6894
diff changeset
58 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
59
10776
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
60 ractx->avctx = avctx;
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
61
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
62 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
63 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
64
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7447
diff changeset
65 avctx->sample_fmt = SAMPLE_FMT_S16;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
66 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
67 }
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
68
6899
61283b6e5f73 Update comment
vitor
parents: 6898
diff changeset
69 /**
6902
b6e110c575ff cosmetics: typo
diego
parents: 6900
diff changeset
70 * 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
71 * odd way to make the output identical to the binary decoder.
61283b6e5f73 Update comment
vitor
parents: 6898
diff changeset
72 */
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
73 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
74 {
7104
8a4a7069737d Simplify t_sqrt()
vitor
parents: 7103
diff changeset
75 int s = 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
76 while (x > 0xfff) {
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
77 s++;
7507
8f89a4d76a71 Cosmetical simplification in t_sqrt()
vitor
parents: 7506
diff changeset
78 x >>= 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
79 }
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
80
7104
8a4a7069737d Simplify t_sqrt()
vitor
parents: 7103
diff changeset
81 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
82 }
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
83
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
84 /**
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
85 * Evaluate the LPC filter coefficients from the reflection coefficients.
6965
a7f6b979de4b Rename functions
vitor
parents: 6964
diff changeset
86 * Does the inverse of the eval_refl() function.
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
87 */
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
88 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
89 {
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
90 int buffer[10];
6782
781bfad6e40e Simplify do_voice().
astrange
parents: 6781
diff changeset
91 int *b1 = buffer;
6964
3504fdd54fd3 Rename variables
vitor
parents: 6952
diff changeset
92 int *b2 = coefs;
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
93 int i, j;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2288
diff changeset
94
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
95 for (i=0; i < 10; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
96 b1[i] = refl[i] << 4;
6782
781bfad6e40e Simplify do_voice().
astrange
parents: 6781
diff changeset
97
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
98 for (j=0; j < i; j++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
99 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
100
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
101 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
102 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
103
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
104 for (i=0; i < 10; i++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
105 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
106 }
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
107
7105
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
108 /**
b55bedad89ad Rename rotate_buffer() to copy_and_dup() and doxy it
vitor
parents: 7104
diff changeset
109 * 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
110 * 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
111 */
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
112 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
113 {
6831
5ea1c314fae9 Minor simplification of rotate_block()
vitor
parents: 6830
diff changeset
114 source += BUFFERSIZE - offset;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
115
7829
7640294af313 Simplify if() in copy_and_dup()
vitor
parents: 7828
diff changeset
116 memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
7640294af313 Simplify if() in copy_and_dup()
vitor
parents: 7828
diff changeset
117 if (offset < BLOCKSIZE)
7100
a17b3a67a719 Simplify rotate_buffer()
vitor
parents: 7097
diff changeset
118 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
119 }
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
120
7110
f9ebb1553982 More comments removal/fixes
vitor
parents: 7109
diff changeset
121 /** inverse root mean square */
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
122 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
123 {
6838
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
124 unsigned int i, sum = 0;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
125
6838
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
126 for (i=0; i < BLOCKSIZE; i++)
7d4031cba765 Simplify irms()
vitor
parents: 6837
diff changeset
127 sum += data[i] * data[i];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
128
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
129 if (sum == 0)
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
130 return 0; /* OOPS - division by zero */
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
131
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
132 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
133 }
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
134
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
135 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
136 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
137 {
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
138 int i;
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
139 int v[3];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
140
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
141 v[0] = 0;
6880
c39a7f5f10cb Rename var
vitor
parents: 6879
diff changeset
142 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
143 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
144
9077
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
145 if (v[0]) {
9078
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
146 for (i=0; i < BLOCKSIZE; i++)
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
147 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
148 } else {
ad7fd7a40717 Do not read uninitialized buffer, no matter if it will be multiplied by
vitor
parents: 8049
diff changeset
149 for (i=0; i < BLOCKSIZE; i++)
9078
2692e0a168cf Reindent after last commit
vitor
parents: 9077
diff changeset
150 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
151 }
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
152 }
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
153
7113
fbe727fbd8d1 rescale_rms() should use unsigned ints
vitor
parents: 7112
diff changeset
154 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
155 {
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
156 return (rms * energy) >> 10;
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
157 }
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
158
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
159 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
160 {
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
161 int i;
6850
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
162 unsigned int res = 0x10000;
7508
f516e1101167 Simplify rms(): merge a few operations in the same statement
vitor
parents: 7507
diff changeset
163 int b = 10;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
164
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
165 for (i=0; i < 10; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
166 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
167
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
168 if (res == 0)
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
169 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
170
6850
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
171 while (res <= 0x3fff) {
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
172 b++;
521e1b55fc12 Simplify rms()
vitor
parents: 6849
diff changeset
173 res <<= 2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
174 }
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
175 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
176
7508
f516e1101167 Simplify rms(): merge a few operations in the same statement
vitor
parents: 7507
diff changeset
177 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
178 }
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
179
7133
6a25c2867e2f More cosmetics
vitor
parents: 7132
diff changeset
180 static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs,
6a25c2867e2f More cosmetics
vitor
parents: 7132
diff changeset
181 int gval, GetBitContext *gb)
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
182 {
6887
1b346861c9dc Use (u)int16_t instead of (unsigned) short
vitor
parents: 6882
diff changeset
183 uint16_t buffer_a[40];
1b346861c9dc Use (u)int16_t instead of (unsigned) short
vitor
parents: 6882
diff changeset
184 uint16_t *block;
6907
8b0db8b07a21 cosmetics: typo fixes
diego
parents: 6902
diff changeset
185 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
186 int gain = get_bits(gb, 8);
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
187 int cb1_idx = get_bits(gb, 7);
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
188 int cb2_idx = get_bits(gb, 7);
6873
c3a92478875d Make add_wav() receive a vector instead of three integers
vitor
parents: 6870
diff changeset
189 int m[3];
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
190
6900
9333cbdc4524 Rename var: add read coefficients a decent name
vitor
parents: 6899
diff changeset
191 if (cba_idx) {
7106
709ee2a35813 Remove useless define
vitor
parents: 7105
diff changeset
192 cba_idx += BLOCKSIZE/2 - 1;
7120
c98b43981d89 Consistency: make the output buffer the first argument of functions
vitor
parents: 7119
diff changeset
193 copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
7112
ebedec98b434 Move factor multiplication out of irms()
vitor
parents: 7111
diff changeset
194 m[0] = (irms(buffer_a) * gval) >> 12;
6888
b2f2c09af893 Merge two if's
vitor
parents: 6887
diff changeset
195 } else {
b2f2c09af893 Merge two if's
vitor
parents: 6887
diff changeset
196 m[0] = 0;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
197 }
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
198
7121
18d60d9b0895 Merge the >> 4 calculation of cb1_base in the table
vitor
parents: 7120
diff changeset
199 m[1] = (cb1_base[cb1_idx] * gval) >> 8;
18d60d9b0895 Merge the >> 4 calculation of cb1_base in the table
vitor
parents: 7120
diff changeset
200 m[2] = (cb2_base[cb2_idx] * gval) >> 8;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
201
6896
5f79e5940b33 Rename var: buffer_2 is an adaptive codebook
vitor
parents: 6895
diff changeset
202 memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
7119
39be110f531d Use sizeof() intead of hardcoding the values
vitor
parents: 7118
diff changeset
203 (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
6882
ea9e8492d9d7 More cosmetics
vitor
parents: 6881
diff changeset
204
6896
5f79e5940b33 Rename var: buffer_2 is an adaptive codebook
vitor
parents: 6895
diff changeset
205 block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
206
9081
06fd12c6b7e6 RA144: work around gcc bug/oddity on ARM
mru
parents: 9078
diff changeset
207 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
208 cb1_vects[cb1_idx], cb2_vects[cb2_idx]);
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
209
7101
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
210 memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
211 10*sizeof(*ractx->curr_sblock));
6ee204e8d9ae Move code unrelated to lpc filtering out of lpc_filter()
vitor
parents: 7100
diff changeset
212
8049
611a21e4b01b Split off celp_filters.[ch] from acelp_filters.[ch] for the QCELP decoder.
diego
parents: 7847
diff changeset
213 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
214 block, BLOCKSIZE, 10, 1, 0xfff))
7162
ad0d9713e953 Use ff_acelp_lp_synthesis_filter() instead of duplicating it
vitor
parents: 7159
diff changeset
215 memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
6832
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
216 }
9584a95fefcd Cosmetics: move function to remove forward declarations
vitor
parents: 6831
diff changeset
217
7077
520e91c4b168 Rename vars: s/decsp/out/
vitor
parents: 7076
diff changeset
218 static void int_to_int16(int16_t *out, const int *inp)
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
219 {
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
220 int i;
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
221
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
222 for (i=0; i < 30; i++)
7800
a84494aa3818 Remove useless parentheses.
vitor
parents: 7516
diff changeset
223 *out++ = *inp++;
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
224 }
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
225
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
226 /**
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
227 * Evaluate the reflection coefficients from the filter coefficients.
6965
a7f6b979de4b Rename functions
vitor
parents: 6964
diff changeset
228 * Does the inverse of the eval_coefs() function.
6952
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
229 *
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
230 * @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
231 * 4095, 0 if not.
51708e7f3274 Add doxy comments to eq() and do_voice()
vitor
parents: 6949
diff changeset
232 */
10776
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
233 static int eval_refl(int *refl, const int16_t *coefs, 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
234 {
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
235 int b, i, j;
6806
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
236 int buffer1[10];
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
237 int buffer2[10];
6852
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
238 int *bp1 = buffer1;
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
239 int *bp2 = buffer2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
240
6852
84dc84916bab Simplify eq()
vitor
parents: 6851
diff changeset
241 for (i=0; i < 10; i++)
6964
3504fdd54fd3 Rename variables
vitor
parents: 6952
diff changeset
242 buffer2[i] = coefs[i];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
243
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
244 refl[9] = bp2[9];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
245
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
246 if ((unsigned) bp2[9] + 0x1000 > 0x1fff) {
10776
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
247 av_log(avctx, 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
248 return 1;
6973
7f7de664020f Replace comments by error messages.
vitor
parents: 6972
diff changeset
249 }
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
250
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
251 for (i=8; i >= 0; i--) {
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
252 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
253
7514
e0e075680996 Simplify eval_refl(): s/b == 0/!b/
vitor
parents: 7513
diff changeset
254 if (!b)
7513
e19d0c9f50ce Simplify range checking in eval_refl(). Before the
vitor
parents: 7512
diff changeset
255 b = -2;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
256
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
257 for (j=0; j <= i; j++)
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
258 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
259
7516
11fe8c09948e Cosmetics: rename loop counters in eval_refl()
vitor
parents: 7515
diff changeset
260 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
261 return 1;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
262
7801
d965e46aef4f Test a var for overflow just after it is set
vitor
parents: 7800
diff changeset
263 refl[i] = bp1[i];
d965e46aef4f Test a var for overflow just after it is set
vitor
parents: 7800
diff changeset
264
6804
24a8b213ba4d Use correct type in FFSWAP (thanks to Benoit Fouet for pointing it out)
vitor
parents: 6803
diff changeset
265 FFSWAP(int *, bp1, bp2);
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
266 }
7509
86b6cb5b04d5 Simplify eval_refl(): return directly when needed instead of storing the return value in a variable
vitor
parents: 7508
diff changeset
267 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
268 }
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
269
7830
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
270 static int interp(RA144Context *ractx, int16_t *out, int a,
7134
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
271 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
272 {
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
273 int work[10];
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
274 int b = NBLOCKS - a;
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
275 int i;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
276
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
277 // Interpolate block coefficients from the this frame's forth block and
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
278 // last frame's forth block.
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
279 for (i=0; i<30; i++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
280 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
281
10776
816067b00019 Use correct context for av_log(), should prevent a crash for malformed files.
vitor
parents: 9428
diff changeset
282 if (eval_refl(work, out, ractx->avctx)) {
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
283 // The interpolated coefficients are unstable, copy either new or old
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
284 // coefficients.
7134
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
285 int_to_int16(out, ractx->lpc_coef[copyold]);
1238746e1301 Simplify interp()
vitor
parents: 7133
diff changeset
286 return rescale_rms(ractx->lpc_refl_rms[copyold], energy);
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
287 } else {
7004
5bad976fae7b Split function rms() in two (it does two unrelated things)
vitor
parents: 6991
diff changeset
288 return rescale_rms(rms(work), energy);
6921
fbcb4507aefe Simplify implementation and use of dec2()
vitor
parents: 6910
diff changeset
289 }
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
290 }
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
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7834
diff changeset
292 /** Uncompress one block (20 bytes -> 160*2 bytes). */
7132
22788bf6502a Cosmetics
vitor
parents: 7128
diff changeset
293 static int ra144_decode_frame(AVCodecContext * avctx, void *vdata,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9081
diff changeset
294 int *data_size, AVPacket *avpkt)
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
295 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9081
diff changeset
296 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9081
diff changeset
297 int buf_size = avpkt->size;
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
298 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
299 unsigned int refl_rms[4]; // RMS of the reflection coefficients
6966
9eee8f8ff9e6 More variable renaming
vitor
parents: 6965
diff changeset
300 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
301 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
302 int i, j;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
303 int16_t *data = vdata;
6898
27b34839f1db Rename var: val -> energy
vitor
parents: 6897
diff changeset
304 unsigned int energy;
6806
e4be053e7d9b Remove unneeded fields from the decoder context
vitor
parents: 6805
diff changeset
305
6934
ac6f00bed029 Revert r13499, log:
vitor
parents: 6928
diff changeset
306 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
307 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
308
7506
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
309 if (*data_size < 2*160)
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
310 return -1;
e94202a2e0b6 Check available size before writing in decode_frame()
vitor
parents: 7451
diff changeset
311
6854
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
312 if(buf_size < 20) {
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
313 av_log(avctx, AV_LOG_ERROR,
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
314 "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
315 *data_size = 0;
6854
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
316 return buf_size;
d4c8338a09a8 Handle the case where we do not have enough input
vitor
parents: 6852
diff changeset
317 }
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
318 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
319
6805
8faad14a40a5 Read the bitstream where the data is actually needed instead of doing it in unpack_input()
vitor
parents: 6804
diff changeset
320 for (i=0; i<10; i++)
7127
8ab2d77fd502 Remove unused entries from lpc_refl_cb*
vitor
parents: 7126
diff changeset
321 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
322
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
323 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
324 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
325
7126
decce608d0a9 Remove unused entries from energy_tab
vitor
parents: 7121
diff changeset
326 energy = energy_tab[get_bits(&gb, 5)];
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
327
7830
3da762190370 Pass directly variable 'a' to interp instead of evaluating it from num_blocks
vitor
parents: 7829
diff changeset
328 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
329 refl_rms[1] = interp(ractx, block_coefs[1], 2, energy <= ractx->old_energy,
6947
080e7ee48ed1 Remove useless intermediate variable
vitor
parents: 6934
diff changeset
330 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
331 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
332 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
333
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
334 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
335
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
336 for (i=0; i < 4; i++) {
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
337 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
338
7447
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
339 for (j=0; j < BLOCKSIZE; j++)
16737361e9ab Cosmetics: rename loop counter vars to i,j
vitor
parents: 7164
diff changeset
340 *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
341 }
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
342
6898
27b34839f1db Rename var: val -> energy
vitor
parents: 6897
diff changeset
343 ractx->old_energy = energy;
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
344 ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0];
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
345
7128
614bc53e67a8 Use lpc_coef[2] instead of lpc_coef and lpc_coef_old
vitor
parents: 7127
diff changeset
346 FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]);
6781
2f505f532aa8 Replace some hardcoded swapping with FFSWAP.
astrange
parents: 6780
diff changeset
347
6828
0969192d5f8b Simplify ra144_decode_frame()
vitor
parents: 6826
diff changeset
348 *data_size = 2*160;
6767
f95c5091b802 cosmetics: Reindent file, patch by Vitor Sessak, vitor1001 gmail com,
diego
parents: 6712
diff changeset
349 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
350 }
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
351
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 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
353 {
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 "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
355 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
356 CODEC_ID_RA_144,
6894
eb3c16b99f27 Rename context struct to be more consistent with the rest of ffmpeg
vitor
parents: 6888
diff changeset
357 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
358 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
359 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
360 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
361 ra144_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7005
diff changeset
362 .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
363 };