annotate ra288.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 5071d562408d
children
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 * RealAudio 2.0 (28.8K)
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
3 * Copyright (c) 2003 the ffmpeg project
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
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * 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
8 * 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
9 * 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
10 * 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
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * 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
13 * 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
14 * 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
15 * 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
16 *
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 * 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
18 * 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
19 * 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
20 */
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
21
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
22 #include "avcodec.h"
7171
9176fe6f17c9 Rewrite unpack() using the bitstream reader
vitor
parents: 7169
diff changeset
23 #define ALT_BITSTREAM_READER_LE
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
24 #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: 1316
diff changeset
25 #include "ra288.h"
7788
ffd4b1364b62 Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents: 7505
diff changeset
26 #include "lpc.h"
8094
36671e6689c7 Use ff_dot_productf() in ra288.c
vitor
parents: 7929
diff changeset
27 #include "celp_math.h"
9026
19bbd1457372 Do not reimplement ff_celp_lp_synthesis_filterf().
vitor
parents: 8094
diff changeset
28 #include "celp_filters.h"
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2956
diff changeset
29
11983
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
30 #define MAX_BACKWARD_FILTER_ORDER 36
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
31 #define MAX_BACKWARD_FILTER_LEN 40
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
32 #define MAX_BACKWARD_FILTER_NONREC 35
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
33
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
34 typedef struct {
7439
deea146537af Cosmetics: align comments
vitor
parents: 7438
diff changeset
35 float sp_lpc[36]; ///< LPC coefficients for speech data (spec: A)
7849
2bfde5b45e01 Cosmetics: align spec references
vitor
parents: 7848
diff changeset
36 float gain_lpc[10]; ///< LPC coefficients for gain (spec: 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
37
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
38 /** speech data history (spec: SB).
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
39 * Its first 70 coefficients are updated only at backward filtering.
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
40 */
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
41 float sp_hist[111];
7418
83d005a098b5 Rename st{1,2}{a,b} context variables to more meaningful names: {sp,gain}_{rec,hist}
vitor
parents: 7416
diff changeset
42
7849
2bfde5b45e01 Cosmetics: align spec references
vitor
parents: 7848
diff changeset
43 /// speech part of the gain autocorrelation (spec: REXP)
7418
83d005a098b5 Rename st{1,2}{a,b} context variables to more meaningful names: {sp,gain}_{rec,hist}
vitor
parents: 7416
diff changeset
44 float sp_rec[37];
83d005a098b5 Rename st{1,2}{a,b} context variables to more meaningful names: {sp,gain}_{rec,hist}
vitor
parents: 7416
diff changeset
45
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
46 /** log-gain history (spec: SBLG).
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
47 * Its first 28 coefficients are updated only at backward filtering.
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
48 */
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
49 float gain_hist[38];
7418
83d005a098b5 Rename st{1,2}{a,b} context variables to more meaningful names: {sp,gain}_{rec,hist}
vitor
parents: 7416
diff changeset
50
7849
2bfde5b45e01 Cosmetics: align spec references
vitor
parents: 7848
diff changeset
51 /// recursive part of the gain autocorrelation (spec: REXPLG)
7418
83d005a098b5 Rename st{1,2}{a,b} context variables to more meaningful names: {sp,gain}_{rec,hist}
vitor
parents: 7416
diff changeset
52 float gain_rec[11];
7411
d41948bf80a1 Give the context structure of ra288 a better name: s/Real288_internal/RA288Context/
vitor
parents: 7375
diff changeset
53 } RA288Context;
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
54
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
55 static av_cold int ra288_decode_init(AVCodecContext *avctx)
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
56 {
7874
29010c2697da Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents: 7854
diff changeset
57 avctx->sample_fmt = SAMPLE_FMT_FLT;
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
58 return 0;
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
59 }
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
60
7848
f29ec8e5d186 Rename function: s/colmult/apply_window/
vitor
parents: 7847
diff changeset
61 static void apply_window(float *tgt, const float *m1, const float *m2, int n)
7415
649496faa1d2 Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents: 7414
diff changeset
62 {
649496faa1d2 Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents: 7414
diff changeset
63 while (n--)
7416
a65363f8ab4b Cosmetics: remove useless parenthesis
vitor
parents: 7415
diff changeset
64 *tgt++ = *m1++ * *m2++;
7415
649496faa1d2 Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents: 7414
diff changeset
65 }
649496faa1d2 Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents: 7414
diff changeset
66
7916
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
67 static void convolve(float *tgt, const float *src, int len, int n)
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
68 {
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
69 for (; n >= 0; n--)
8094
36671e6689c7 Use ff_dot_productf() in ra288.c
vitor
parents: 7929
diff changeset
70 tgt[n] = ff_dot_productf(src, src - n, len);
7916
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
71
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
72 }
2a4c42e6aecb Cosmetics: move convolve() together with the other DSP functions
vitor
parents: 7915
diff changeset
73
7412
51da3d8200d0 Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents: 7411
diff changeset
74 static void decode(RA288Context *ractx, float gain, int cb_coef)
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
75 {
9026
19bbd1457372 Do not reimplement ff_celp_lp_synthesis_filterf().
vitor
parents: 8094
diff changeset
76 int i;
7268
7e51fc7805ac Do not declare as double a var that only stores a float
vitor
parents: 7267
diff changeset
77 double sumsum;
7e51fc7805ac Do not declare as double a var that only stores a float
vitor
parents: 7267
diff changeset
78 float sum, buffer[5];
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
79 float *block = ractx->sp_hist + 70 + 36; // current block
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
80 float *gain_block = ractx->gain_hist + 28;
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
81
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
82 memmove(ractx->sp_hist + 70, ractx->sp_hist + 75, 36*sizeof(*block));
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
83
7431
da24b77f46f6 Add a few comments pointing to the G.728 specification
vitor
parents: 7430
diff changeset
84 /* block 46 of G.728 spec */
7503
d85a0a151344 Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents: 7492
diff changeset
85 sum = 32.;
d85a0a151344 Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents: 7492
diff changeset
86 for (i=0; i < 10; i++)
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
87 sum -= gain_block[9-i] * ractx->gain_lpc[i];
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
88
7431
da24b77f46f6 Add a few comments pointing to the G.728 specification
vitor
parents: 7430
diff changeset
89 /* block 47 of G.728 spec */
7269
04ecb6594999 Another av_clipf() usage
vitor
parents: 7268
diff changeset
90 sum = av_clipf(sum, 0, 60);
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
91
7431
da24b77f46f6 Add a few comments pointing to the G.728 specification
vitor
parents: 7430
diff changeset
92 /* block 48 of G.728 spec */
7915
2d530c3d155e Simplify: move division by constant off the loop
vitor
parents: 7913
diff changeset
93 /* exp(sum * 0.1151292546497) == pow(10.0,sum/20) */
7925
9dc65bb3bd3f Do instead of divising a float by a constant, multiply by its inverse
vitor
parents: 7917
diff changeset
94 sumsum = exp(sum * 0.1151292546497) * gain * (1.0/(1<<23));
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
95
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
96 for (i=0; i < 5; i++)
7915
2d530c3d155e Simplify: move division by constant off the loop
vitor
parents: 7913
diff changeset
97 buffer[i] = codetable[cb_coef][i] * sumsum;
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
8094
36671e6689c7 Use ff_dot_productf() in ra288.c
vitor
parents: 7929
diff changeset
99 sum = ff_dot_productf(buffer, buffer, 5) * ((1<<24)/5.);
7275
c5bcb9e4c5b2 Revert r14218. FFMAX is a macro, so
vitor
parents: 7270
diff changeset
100
c5bcb9e4c5b2 Revert r14218. FFMAX is a macro, so
vitor
parents: 7270
diff changeset
101 sum = FFMAX(sum, 1);
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
102
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
103 /* shift and store */
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
104 memmove(gain_block, gain_block + 1, 9 * sizeof(*gain_block));
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
105
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
106 gain_block[9] = 10 * log10(sum) - 32;
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
107
9026
19bbd1457372 Do not reimplement ff_celp_lp_synthesis_filterf().
vitor
parents: 8094
diff changeset
108 ff_celp_lp_synthesis_filterf(block, ractx->sp_lpc, buffer, 5, 36);
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 }
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
110
7367
f8e1a1ef4a56 Add comments to do_hybrid_window()
vitor
parents: 7366
diff changeset
111 /**
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
112 * Hybrid window filtering, see blocks 36 and 49 of the G.728 specification.
7367
f8e1a1ef4a56 Add comments to do_hybrid_window()
vitor
parents: 7366
diff changeset
113 *
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
114 * @param order filter order
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
115 * @param n input length
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
116 * @param non_rec number of non-recursive samples
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
117 * @param out filter output
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
118 * @param hist pointer to the input history of the filter
7375
981b14d8b0e9 Cosmetics: grammar nits
vitor
parents: 7372
diff changeset
119 * @param out pointer to the non-recursive part of the output
7367
f8e1a1ef4a56 Add comments to do_hybrid_window()
vitor
parents: 7366
diff changeset
120 * @param out2 pointer to the recursive part of the output
f8e1a1ef4a56 Add comments to do_hybrid_window()
vitor
parents: 7366
diff changeset
121 * @param window pointer to the windowing function table
f8e1a1ef4a56 Add comments to do_hybrid_window()
vitor
parents: 7366
diff changeset
122 */
7854
e5e3c56c358c Cosmetics: line breaks
vitor
parents: 7853
diff changeset
123 static void do_hybrid_window(int order, int n, int non_rec, float *out,
e5e3c56c358c Cosmetics: line breaks
vitor
parents: 7853
diff changeset
124 float *hist, float *out2, const float *window)
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
125 {
7449
18fc253b4991 Do not declare a counter as unsigned when it is not needed
vitor
parents: 7448
diff changeset
126 int i;
11983
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
127 float buffer1[MAX_BACKWARD_FILTER_ORDER + 1];
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
128 float buffer2[MAX_BACKWARD_FILTER_ORDER + 1];
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
129 float work[MAX_BACKWARD_FILTER_ORDER + MAX_BACKWARD_FILTER_LEN + MAX_BACKWARD_FILTER_NONREC];
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
130
7848
f29ec8e5d186 Rename function: s/colmult/apply_window/
vitor
parents: 7847
diff changeset
131 apply_window(work, window, hist, order + n + non_rec);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2956
diff changeset
132
7492
50e0b25882cd Rename prodsum() function to convolve()
vitor
parents: 7451
diff changeset
133 convolve(buffer1, work + order , n , order);
50e0b25882cd Rename prodsum() function to convolve()
vitor
parents: 7451
diff changeset
134 convolve(buffer2, work + order + n, non_rec, order);
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
135
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
136 for (i=0; i <= order; i++) {
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
137 out2[i] = out2[i] * 0.5625 + buffer1[i];
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
138 out [i] = out2[i] + buffer2[i];
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
139 }
7365
031d4866b192 Rename co() function to the much more descriptive name of
vitor
parents: 7364
diff changeset
140
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
141 /* Multiply by the white noise correcting factor (WNCF). */
7365
031d4866b192 Rename co() function to the much more descriptive name of
vitor
parents: 7364
diff changeset
142 *out *= 257./256.;
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
143 }
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
144
7372
e97d0795ee70 Rename update() function to backward_filter() and add a doxy comment
vitor
parents: 7371
diff changeset
145 /**
7847
5a114f24632a misc spelling/wording/grammar fixes
diego
parents: 7843
diff changeset
146 * Backward synthesis filter, find the LPC coefficients from past speech data.
7372
e97d0795ee70 Rename update() function to backward_filter() and add a doxy comment
vitor
parents: 7371
diff changeset
147 */
7929
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
148 static void backward_filter(float *hist, float *rec, const float *window,
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
149 float *lpc, const float *tab,
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
150 int order, int n, int non_rec, int move_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
151 {
11983
5071d562408d ra288: convert VLAs to fixed size
mru
parents: 11652
diff changeset
152 float temp[MAX_BACKWARD_FILTER_ORDER+1];
7169
f12513065d85 Move function to avoid forward declaration
vitor
parents: 7168
diff changeset
153
7929
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
154 do_hybrid_window(order, n, non_rec, temp, hist, rec, window);
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
155
7929
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
156 if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1))
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
157 apply_window(lpc, lpc, tab, order);
7853
21ab545aed8b Simplify: use a single history buffer for gain and a single one for
vitor
parents: 7849
diff changeset
158
7929
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
159 memmove(hist, hist + n, move_size*sizeof(*hist));
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 }
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
161
7174
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
162 static int ra288_decode_frame(AVCodecContext * avctx, void *data,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9026
diff changeset
163 int *data_size, AVPacket *avpkt)
1313
d6da658fe6c6 finally works now
nickols_k
parents: 1308
diff changeset
164 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9026
diff changeset
165 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9026
diff changeset
166 int buf_size = avpkt->size;
7874
29010c2697da Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents: 7854
diff changeset
167 float *out = data;
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
168 int i, j;
7412
51da3d8200d0 Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents: 7411
diff changeset
169 RA288Context *ractx = avctx->priv_data;
7173
bc2fd265f52b Remove unpack() function, read the bitstream as needed
vitor
parents: 7172
diff changeset
170 GetBitContext gb;
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
171
7174
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
172 if (buf_size < avctx->block_align) {
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
173 av_log(avctx, AV_LOG_ERROR,
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
174 "Error! Input buffer is too small [%d<%d]\n",
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
175 buf_size, avctx->block_align);
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
176 return 0;
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
177 }
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
178
7874
29010c2697da Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents: 7854
diff changeset
179 if (*data_size < 32*5*4)
7505
2c22852d1998 Check *data_size in decode_frame()
vitor
parents: 7504
diff changeset
180 return -1;
2c22852d1998 Check *data_size in decode_frame()
vitor
parents: 7504
diff changeset
181
7174
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
182 init_get_bits(&gb, buf, avctx->block_align * 8);
1313
d6da658fe6c6 finally works now
nickols_k
parents: 1308
diff changeset
183
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
184 for (i=0; i < 32; i++) {
7192
9517beb3b491 Simplify
vitor
parents: 7191
diff changeset
185 float gain = amptable[get_bits(&gb, 3)];
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
186 int cb_coef = get_bits(&gb, 6 + (i&1));
7443
a8b985890c34 Cosmetics: new line
vitor
parents: 7442
diff changeset
187
7412
51da3d8200d0 Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents: 7411
diff changeset
188 decode(ractx, gain, cb_coef);
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
189
7448
b15534513059 Cosmetics: rename loop counter vars to i,j
vitor
parents: 7443
diff changeset
190 for (j=0; j < 5; j++)
7917
518c86ed8008 Move constant multiplication out of the loop
vitor
parents: 7916
diff changeset
191 *(out++) = ractx->sp_hist[70 + 36 + j];
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
192
7929
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
193 if ((i & 7) == 3) {
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
194 backward_filter(ractx->sp_hist, ractx->sp_rec, syn_window,
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
195 ractx->sp_lpc, syn_bw_tab, 36, 40, 35, 70);
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
196
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
197 backward_filter(ractx->gain_hist, ractx->gain_rec, gain_window,
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
198 ractx->gain_lpc, gain_bw_tab, 10, 8, 20, 28);
5b81784c5fe6 Simplify: avoid duplication backward_filter()
vitor
parents: 7925
diff changeset
199 }
7167
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
200 }
9b93a3cf6440 Reindent the whole file
vitor
parents: 7040
diff changeset
201
7174
7c4589349c01 Remove useless wrapper around ra288_decode_frame()
vitor
parents: 7173
diff changeset
202 *data_size = (char *)out - (char *)data;
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 2288
diff changeset
203 return avctx->block_align;
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
204 }
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
205
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
206 AVCodec ra_288_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
207 {
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
208 "real_288",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9428
diff changeset
209 AVMEDIA_TYPE_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
210 CODEC_ID_RA_288,
7411
d41948bf80a1 Give the context structure of ra288 a better name: s/Real288_internal/RA288Context/
vitor
parents: 7375
diff changeset
211 sizeof(RA288Context),
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7449
diff changeset
212 ra288_decode_init,
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
213 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
214 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
215 ra288_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
216 .long_name = NULL_IF_CONFIG_SMALL("RealAudio 2.0 (28.8K)"),
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
217 };