Mercurial > libavcodec.hg
annotate ra288.c @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 5071d562408d |
children |
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 |
9428 | 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 | 27 #include "celp_math.h" |
9026 | 28 #include "celp_filters.h" |
2967 | 29 |
11983 | 30 #define MAX_BACKWARD_FILTER_ORDER 36 |
31 #define MAX_BACKWARD_FILTER_LEN 40 | |
32 #define MAX_BACKWARD_FILTER_NONREC 35 | |
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 | 35 float sp_lpc[36]; ///< LPC coefficients for speech data (spec: A) |
7849 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 95 |
7448 | 96 for (i=0; i < 5; i++) |
7915 | 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 | 99 sum = ff_dot_productf(buffer, buffer, 5) * ((1<<24)/5.); |
7275 | 100 |
101 sum = FFMAX(sum, 1); | |
7167 | 102 |
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 | 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 | 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 | 111 /** |
7847 | 112 * Hybrid window filtering, see blocks 36 and 49 of the G.728 specification. |
7367 | 113 * |
7847 | 114 * @param order filter order |
115 * @param n input length | |
116 * @param non_rec number of non-recursive samples | |
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 | 119 * @param out pointer to the non-recursive part of the output |
7367 | 120 * @param out2 pointer to the recursive part of the output |
121 * @param window pointer to the windowing function table | |
122 */ | |
7854 | 123 static void do_hybrid_window(int order, int n, int non_rec, float *out, |
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 | 127 float buffer1[MAX_BACKWARD_FILTER_ORDER + 1]; |
128 float buffer2[MAX_BACKWARD_FILTER_ORDER + 1]; | |
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 | 131 apply_window(work, window, hist, order + n + non_rec); |
2967 | 132 |
7492 | 133 convolve(buffer1, work + order , n , order); |
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 | 136 for (i=0; i <= order; i++) { |
137 out2[i] = out2[i] * 0.5625 + buffer1[i]; | |
138 out [i] = out2[i] + buffer2[i]; | |
7167 | 139 } |
7365
031d4866b192
Rename co() function to the much more descriptive name of
vitor
parents:
7364
diff
changeset
|
140 |
7847 | 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 | 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 | 148 static void backward_filter(float *hist, float *rec, const float *window, |
149 float *lpc, const float *tab, | |
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 | 152 float temp[MAX_BACKWARD_FILTER_ORDER+1]; |
7169 | 153 |
7929 | 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 | 156 if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) |
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 | 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 | 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 | 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 | 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 | 171 |
7174 | 172 if (buf_size < avctx->block_align) { |
173 av_log(avctx, AV_LOG_ERROR, | |
174 "Error! Input buffer is too small [%d<%d]\n", | |
175 buf_size, avctx->block_align); | |
176 return 0; | |
177 } | |
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 | 180 return -1; |
181 | |
7174 | 182 init_get_bits(&gb, buf, avctx->block_align * 8); |
1313 | 183 |
7448 | 184 for (i=0; i < 32; i++) { |
7192 | 185 float gain = amptable[get_bits(&gb, 3)]; |
7448 | 186 int cb_coef = get_bits(&gb, 6 + (i&1)); |
7443 | 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 | 189 |
7448 | 190 for (j=0; j < 5; j++) |
7917 | 191 *(out++) = ractx->sp_hist[70 + 36 + j]; |
7167 | 192 |
7929 | 193 if ((i & 7) == 3) { |
194 backward_filter(ractx->sp_hist, ractx->sp_rec, syn_window, | |
195 ractx->sp_lpc, syn_bw_tab, 36, 40, 35, 70); | |
196 | |
197 backward_filter(ractx->gain_hist, ractx->gain_rec, gain_window, | |
198 ractx->gain_lpc, gain_bw_tab, 10, 8, 20, 28); | |
199 } | |
7167 | 200 } |
201 | |
7174 | 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 }; |