Mercurial > libavcodec.hg
annotate ra288.c @ 7891:13ee9bb85721 libavcodec
Zero 'idx' for each iteration of the coupling gain loop and as it is only used
within this loop, we can move its declaration there too. This fixes bitstream
desync when decoding streams containing CCEs.
Based on a patch by Alex Converse (alex converse gmail com)
author | superdump |
---|---|
date | Thu, 18 Sep 2008 16:02:51 +0000 |
parents | 29010c2697da |
children | 9fbae87668db |
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 | 23 #define ALT_BITSTREAM_READER_LE |
24 #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:
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" |
2967 | 27 |
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
|
28 typedef struct { |
7439 | 29 float sp_lpc[36]; ///< LPC coefficients for speech data (spec: A) |
7849 | 30 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
|
31 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
32 /** speech data history (spec: SB). |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
33 * 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
|
34 */ |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
35 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
|
36 |
7849 | 37 /// 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
|
38 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
|
39 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
40 /** log-gain history (spec: SBLG). |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
41 * 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
|
42 */ |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
43 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
|
44 |
7849 | 45 /// 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
|
46 float gain_rec[11]; |
7411
d41948bf80a1
Give the context structure of ra288 a better name: s/Real288_internal/RA288Context/
vitor
parents:
7375
diff
changeset
|
47 } 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
|
48 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7449
diff
changeset
|
49 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
|
50 { |
7874
29010c2697da
Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents:
7854
diff
changeset
|
51 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
|
52 return 0; |
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7449
diff
changeset
|
53 } |
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7449
diff
changeset
|
54 |
7294 | 55 static inline float scalar_product_float(const float * v1, const float * v2, |
56 int size) | |
7201
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
57 { |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
58 float res = 0.; |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
59 |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
60 while (size--) |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
61 res += *v1++ * *v2++; |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
62 |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
63 return res; |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
64 } |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
65 |
7848 | 66 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
|
67 { |
649496faa1d2
Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents:
7414
diff
changeset
|
68 while (n--) |
7416 | 69 *tgt++ = *m1++ * *m2++; |
7415
649496faa1d2
Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents:
7414
diff
changeset
|
70 } |
649496faa1d2
Move colmult() function to the beginning of file to group DSP-related functions.
vitor
parents:
7414
diff
changeset
|
71 |
7412
51da3d8200d0
Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents:
7411
diff
changeset
|
72 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
|
73 { |
7448 | 74 int i, j; |
7268
7e51fc7805ac
Do not declare as double a var that only stores a float
vitor
parents:
7267
diff
changeset
|
75 double sumsum; |
7e51fc7805ac
Do not declare as double a var that only stores a float
vitor
parents:
7267
diff
changeset
|
76 float sum, buffer[5]; |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
77 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
|
78 float *gain_block = ractx->gain_hist + 28; |
7167 | 79 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
80 memmove(ractx->sp_hist + 70, ractx->sp_hist + 75, 36*sizeof(*block)); |
7167 | 81 |
7503
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
82 for (i=0; i < 5; i++) { |
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
83 block[i] = 0.; |
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
84 for (j=0; j < 36; j++) |
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
85 block[i] -= block[i-1-j]*ractx->sp_lpc[j]; |
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
86 } |
7167 | 87 |
7431
da24b77f46f6
Add a few comments pointing to the G.728 specification
vitor
parents:
7430
diff
changeset
|
88 /* 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
|
89 sum = 32.; |
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
90 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
|
91 sum -= gain_block[9-i] * ractx->gain_lpc[i]; |
7167 | 92 |
7431
da24b77f46f6
Add a few comments pointing to the G.728 specification
vitor
parents:
7430
diff
changeset
|
93 /* block 47 of G.728 spec */ |
7269 | 94 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
|
95 |
7431
da24b77f46f6
Add a few comments pointing to the G.728 specification
vitor
parents:
7430
diff
changeset
|
96 /* block 48 of G.728 spec */ |
7440 | 97 sumsum = exp(sum * 0.1151292546497) * gain; /* pow(10.0,sum/20)*gain */ |
7167 | 98 |
7448 | 99 for (i=0; i < 5; i++) |
7843 | 100 buffer[i] = codetable[cb_coef][i] * sumsum * (1./2048.); |
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
|
101 |
7275 | 102 sum = scalar_product_float(buffer, buffer, 5) / 5; |
103 | |
104 sum = FFMAX(sum, 1); | |
7167 | 105 |
106 /* shift and store */ | |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
107 memmove(gain_block, gain_block + 1, 9 * sizeof(*gain_block)); |
7167 | 108 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
109 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
|
110 |
7448 | 111 for (i=1; i < 5; i++) |
112 for (j=i-1; j >= 0; j--) | |
113 buffer[i] -= ractx->sp_lpc[i-j-1] * buffer[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
|
114 |
7167 | 115 /* output */ |
7448 | 116 for (i=0; i < 5; i++) |
7503
d85a0a151344
Flip (by making buf[i] -> buf[size-i-1]) two buffers: {sp,gain}_block. This
vitor
parents:
7492
diff
changeset
|
117 block[i] = av_clipf(block[i] + buffer[i], -4095, 4095); |
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
|
118 } |
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 |
7492 | 120 static void convolve(float *tgt, const float *src, int len, int n) |
7169 | 121 { |
7201
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
122 for (; n >= 0; n--) |
4d441356fa23
Create a function for float dot product instead of duplicating all over the file
vitor
parents:
7195
diff
changeset
|
123 tgt[n] = scalar_product_float(src, src - n, len); |
7169 | 124 |
125 } | |
126 | |
7367 | 127 /** |
7847 | 128 * Hybrid window filtering, see blocks 36 and 49 of the G.728 specification. |
7367 | 129 * |
7847 | 130 * @param order filter order |
131 * @param n input length | |
132 * @param non_rec number of non-recursive samples | |
133 * @param out filter output | |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
134 * @param hist pointer to the input history of the filter |
7375 | 135 * @param out pointer to the non-recursive part of the output |
7367 | 136 * @param out2 pointer to the recursive part of the output |
137 * @param window pointer to the windowing function table | |
138 */ | |
7854 | 139 static void do_hybrid_window(int order, int n, int non_rec, float *out, |
140 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
|
141 { |
7449
18fc253b4991
Do not declare a counter as unsigned when it is not needed
vitor
parents:
7448
diff
changeset
|
142 int i; |
7437
d36ec42eef9c
Declare temporary buffers to be only of the necessary size
vitor
parents:
7436
diff
changeset
|
143 float buffer1[order + 1]; |
d36ec42eef9c
Declare temporary buffers to be only of the necessary size
vitor
parents:
7436
diff
changeset
|
144 float buffer2[order + 1]; |
d36ec42eef9c
Declare temporary buffers to be only of the necessary size
vitor
parents:
7436
diff
changeset
|
145 float work[order + n + non_rec]; |
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
|
146 |
7848 | 147 apply_window(work, window, hist, order + n + non_rec); |
2967 | 148 |
7492 | 149 convolve(buffer1, work + order , n , order); |
150 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
|
151 |
7448 | 152 for (i=0; i <= order; i++) { |
153 out2[i] = out2[i] * 0.5625 + buffer1[i]; | |
154 out [i] = out2[i] + buffer2[i]; | |
7167 | 155 } |
7365
031d4866b192
Rename co() function to the much more descriptive name of
vitor
parents:
7364
diff
changeset
|
156 |
7847 | 157 /* 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
|
158 *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
|
159 } |
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 |
7372
e97d0795ee70
Rename update() function to backward_filter() and add a doxy comment
vitor
parents:
7371
diff
changeset
|
161 /** |
7847 | 162 * 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
|
163 */ |
7412
51da3d8200d0
Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents:
7411
diff
changeset
|
164 static void backward_filter(RA288Context *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
|
165 { |
7428
e8eca33561c7
Rename two context buffers: pr{1,2} -> {sp,gain}_lpc. Also add a few doxy
vitor
parents:
7426
diff
changeset
|
166 float temp1[37]; // RTMP in the spec |
e8eca33561c7
Rename two context buffers: pr{1,2} -> {sp,gain}_lpc. Also add a few doxy
vitor
parents:
7426
diff
changeset
|
167 float temp2[11]; // GPTPMP in the spec |
7430
4ebfb53ff2df
Remove the history buffer from the context. It can easily be evaluated
vitor
parents:
7428
diff
changeset
|
168 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
169 do_hybrid_window(36, 40, 35, temp1, ractx->sp_hist, |
7428
e8eca33561c7
Rename two context buffers: pr{1,2} -> {sp,gain}_lpc. Also add a few doxy
vitor
parents:
7426
diff
changeset
|
170 ractx->sp_rec, syn_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
|
171 |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7505
diff
changeset
|
172 if (!compute_lpc_coefs(temp1, 36, ractx->sp_lpc, 0, 1, 1)) |
7848 | 173 apply_window(ractx->sp_lpc, ractx->sp_lpc, syn_bw_tab, 36); |
7169 | 174 |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
175 do_hybrid_window(10, 8, 20, temp2, ractx->gain_hist, |
7428
e8eca33561c7
Rename two context buffers: pr{1,2} -> {sp,gain}_lpc. Also add a few doxy
vitor
parents:
7426
diff
changeset
|
176 ractx->gain_rec, gain_window); |
7169 | 177 |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7505
diff
changeset
|
178 if (!compute_lpc_coefs(temp2, 10, ractx->gain_lpc, 0, 1, 1)) |
7848 | 179 apply_window(ractx->gain_lpc, ractx->gain_lpc, gain_bw_tab, 10); |
7853
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
180 |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
181 memmove(ractx->gain_hist, ractx->gain_hist + 8, |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
182 28*sizeof(*ractx->gain_hist)); |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
183 |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
184 memmove(ractx->sp_hist , ractx->sp_hist + 40, |
21ab545aed8b
Simplify: use a single history buffer for gain and a single one for
vitor
parents:
7849
diff
changeset
|
185 70*sizeof(*ractx->sp_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
|
186 } |
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
|
187 |
7174 | 188 static int ra288_decode_frame(AVCodecContext * avctx, void *data, |
189 int *data_size, const uint8_t * buf, | |
190 int buf_size) | |
1313 | 191 { |
7874
29010c2697da
Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents:
7854
diff
changeset
|
192 float *out = data; |
7448 | 193 int i, j; |
7412
51da3d8200d0
Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents:
7411
diff
changeset
|
194 RA288Context *ractx = avctx->priv_data; |
7173
bc2fd265f52b
Remove unpack() function, read the bitstream as needed
vitor
parents:
7172
diff
changeset
|
195 GetBitContext gb; |
7167 | 196 |
7174 | 197 if (buf_size < avctx->block_align) { |
198 av_log(avctx, AV_LOG_ERROR, | |
199 "Error! Input buffer is too small [%d<%d]\n", | |
200 buf_size, avctx->block_align); | |
201 return 0; | |
202 } | |
203 | |
7874
29010c2697da
Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents:
7854
diff
changeset
|
204 if (*data_size < 32*5*4) |
7505 | 205 return -1; |
206 | |
7174 | 207 init_get_bits(&gb, buf, avctx->block_align * 8); |
1313 | 208 |
7448 | 209 for (i=0; i < 32; i++) { |
7192 | 210 float gain = amptable[get_bits(&gb, 3)]; |
7448 | 211 int cb_coef = get_bits(&gb, 6 + (i&1)); |
7443 | 212 |
7412
51da3d8200d0
Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents:
7411
diff
changeset
|
213 decode(ractx, gain, cb_coef); |
7167 | 214 |
7448 | 215 for (j=0; j < 5; j++) |
7874
29010c2697da
Use SAMPLE_FMT_FLT instead of doing the float->int conversion in the
vitor
parents:
7854
diff
changeset
|
216 *(out++) = (1/4096.) * ractx->sp_hist[70 + 36 + j]; |
7167 | 217 |
7448 | 218 if ((i & 7) == 3) |
7412
51da3d8200d0
Give the context variables of ra288 a better name: s/glob/ractx/
vitor
parents:
7411
diff
changeset
|
219 backward_filter(ractx); |
7167 | 220 } |
221 | |
7174 | 222 *data_size = (char *)out - (char *)data; |
2956
5f51b1e0bed6
Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
2288
diff
changeset
|
223 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
|
224 } |
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
|
225 |
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
|
226 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
|
227 { |
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
|
228 "real_288", |
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
|
229 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
|
230 CODEC_ID_RA_288, |
7411
d41948bf80a1
Give the context structure of ra288 a better name: s/Real288_internal/RA288Context/
vitor
parents:
7375
diff
changeset
|
231 sizeof(RA288Context), |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7449
diff
changeset
|
232 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
|
233 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
|
234 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
|
235 ra288_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
236 .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
|
237 }; |