annotate nellymoserdec.c @ 6763:f7cbb7733146 libavcodec

Use full path for #includes from another directory.
author diego
date Fri, 09 May 2008 11:56:36 +0000
parents 8d6c07df5afd
children 40f18ff994f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
1 /*
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
2 * NellyMoser audio decoder
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
3 * Copyright (c) 2007 a840bda5870ba11f19698ff6eb9581dfb0f95fa5,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
4 * 539459aeb7d425140b62a3ec7dbf6dc8e408a306, and
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
5 * 520e17cd55896441042b14df2566a6eb610ed444
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
6 * Copyright (c) 2007 Loic Minier <lool at dooz.org>
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
7 * Benjamin Larsson
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
8 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
9 * Permission is hereby granted, free of charge, to any person obtaining a
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
10 * copy of this software and associated documentation files (the "Software"),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
11 * to deal in the Software without restriction, including without limitation
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
13 * and/or sell copies of the Software, and to permit persons to whom the
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
14 * Software is furnished to do so, subject to the following conditions:
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
15 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
16 * The above copyright notice and this permission notice shall be included in
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
17 * all copies or substantial portions of the Software.
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
18 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
25 * DEALINGS IN THE SOFTWARE.
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
26 */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
27
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
28 /**
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
29 * @file nellymoserdec.c
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
30 * The 3 alphanumeric copyright notices are md5summed they are from the original
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
31 * implementors. The original code is available from http://code.google.com/p/nelly2pcm/
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
32 */
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6741
diff changeset
33
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6741
diff changeset
34 #include "libavutil/random.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
35 #include "avcodec.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
36 #include "dsputil.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
37
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
38 #define ALT_BITSTREAM_READER_LE
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
39 #include "bitstream.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
40
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
41 #define NELLY_BANDS 23
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
42 #define NELLY_BLOCK_LEN 64
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
43 #define NELLY_HEADER_BITS 116
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
44 #define NELLY_DETAIL_BITS 198
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
45 #define NELLY_BUF_LEN 128
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
46 #define NELLY_FILL_LEN 124
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
47 #define NELLY_BIT_CAP 6
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
48 #define NELLY_BASE_OFF 4228
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
49 #define NELLY_BASE_SHIFT 19
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
50 #define NELLY_SAMPLES (2 * NELLY_BUF_LEN)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
51
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
52 static const float dequantization_table[127] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
53 0.0000000000,-0.8472560048, 0.7224709988, -1.5247479677, -0.4531480074, 0.3753609955, 1.4717899561,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
54 -1.9822579622, -1.1929379702, -0.5829370022, -0.0693780035, 0.3909569979,0.9069200158, 1.4862740040,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
55 2.2215409279, -2.3887870312, -1.8067539930, -1.4105420113, -1.0773609877, -0.7995010018,-0.5558109879,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
56 -0.3334020078, -0.1324490011, 0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
57 1.3954459429, 1.8098750114, 2.3918759823,-2.3893830776, -1.9884680510, -1.7514040470, -1.5643119812,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
58 -1.3922129869,-1.2164649963, -1.0469499826, -0.8905100226, -0.7645580173, -0.6454579830, -0.5259280205,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
59 -0.4059549868, -0.3029719889, -0.2096900046, -0.1239869967, -0.0479229987, 0.0257730000, 0.1001340002,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
60 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119, 0.8425520062,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
61 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
62 -2.5756309032, -2.0573320389, -1.8984919786, -1.7727810144, -1.6662600040, -1.5742180347, -1.4993319511,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
63 -1.4316639900, -1.3652280569, -1.3000990152, -1.2280930281, -1.1588579416, -1.0921250582, -1.0135740042,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
64 -0.9202849865, -0.8287050128, -0.7374889851, -0.6447759867, -0.5590940118, -0.4857139885, -0.4110319912,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
65 -0.3459700048, -0.2851159871, -0.2341620028, -0.1870580018, -0.1442500055, -0.1107169986, -0.0739680007,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
66 -0.0365610011, -0.0073290002, 0.0203610007, 0.0479039997, 0.0751969963, 0.0980999991, 0.1220389977,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
67 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984, 0.2870100141, 0.3197099864,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
68 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058, 0.6122040153,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
69 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
70 1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
71 2.2903931141
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
72 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
73
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
74 static const uint8_t nelly_band_sizes_table[NELLY_BANDS] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
75 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
76 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
77
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
78 static const uint16_t nelly_init_table[64] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
79 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
80 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
81 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
82 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
83 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
84 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
85 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
86
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
87 static const int16_t nelly_delta_table[32] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
88 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
89 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
90 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
91 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
92
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
93 typedef struct NellyMoserDecodeContext {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
94 AVCodecContext* avctx;
5838
fd8b56703750 Unaligned memory access rcrash fix
banan
parents: 5823
diff changeset
95 DECLARE_ALIGNED_16(float,float_buf[NELLY_SAMPLES]);
6611
79c5af90afde Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents: 6610
diff changeset
96 float state[128];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
97 AVRandomState random_state;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
98 GetBitContext gb;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
99 int add_bias;
6613
54f88d1cee72 Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents: 6612
diff changeset
100 float scale_bias;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
101 DSPContext dsp;
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
102 MDCTContext imdct_ctx;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
103 DECLARE_ALIGNED_16(float,imdct_tmp[NELLY_BUF_LEN]);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
104 DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
105 } NellyMoserDecodeContext;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
106
5916
353fca09cb72 Make sine_window static. Acked by Benjamin Larsson
alex
parents: 5915
diff changeset
107 static DECLARE_ALIGNED_16(float,sine_window[128]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
108
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
109 static inline int signed_shift(int i, int shift) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
110 if (shift > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
111 return i << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
112 return i >> -shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
113 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
114
6605
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
115
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
116 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
117 {
6616
michael
parents: 6615
diff changeset
118 int bot, top;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
119
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
120 bot = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
121 top = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
122
6612
80cadb0595fb simplify
michael
parents: 6611
diff changeset
123 while (bot < NELLY_BUF_LEN) {
6615
3496fac9ea8f cosmetic
michael
parents: 6614
diff changeset
124 audio[bot] = a_in [bot]*sine_window[bot]
3496fac9ea8f cosmetic
michael
parents: 6614
diff changeset
125 +state[bot]*sine_window[top] + s->add_bias;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
126
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
127 bot++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
128 top--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
129 }
6611
79c5af90afde Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents: 6610
diff changeset
130 memcpy(state, a_in + NELLY_BUF_LEN, sizeof(float)*NELLY_BUF_LEN);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
131 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
132
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
133 static int sum_bits(short *buf, short shift, short off)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
134 {
6741
8d6c07df5afd Move declaration a little.
michael
parents: 6740
diff changeset
135 int i, ret = 0;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
136
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
137 for (i = 0; i < NELLY_FILL_LEN; i++) {
6741
8d6c07df5afd Move declaration a little.
michael
parents: 6740
diff changeset
138 int b = buf[i]-off;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
139 b = ((b>>(shift-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
140 ret += av_clip(b, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
141 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
142
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
143 return ret;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
144 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
145
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
146 static int headroom(int *la)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
147 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
148 int l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
149 if (*la == 0) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
150 return 31;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
151 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
152 l = 30 - av_log2(FFABS(*la));
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
153 *la <<= l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
154 return l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
155 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
156
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
157
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
158 static void get_sample_bits(const float *buf, int *bits)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
159 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 int i, j;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 short sbuf[128];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 short shift, shift_saved;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164 int max, sum, last_off, tmp;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165 int big_off, small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166 int off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
167
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168 max = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
169 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
170 max = FFMAX(max, buf[i]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
171 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
172 shift = -16;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
173 shift += headroom(&max);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
174
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
175 sum = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
176 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
177 sbuf[i] = signed_shift(buf[i], shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
178 sbuf[i] = (3*sbuf[i])>>2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
179 sum += sbuf[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
180 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 shift += 11;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183 shift_saved = shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 sum -= NELLY_DETAIL_BITS << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185 shift += headroom(&sum);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
186 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
188
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
189 small_off = signed_shift(small_off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
190
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
191 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
192
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
193 if (bitsum != NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
194 shift = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
195 off = bitsum - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
196
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197 for(shift=0; FFABS(off) <= 16383; shift++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 off *= 2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
200 off = (off * NELLY_BASE_OFF) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 off = signed_shift(off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
205 for (j = 1; j < 20; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206 last_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
207 small_off += off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
208 last_bitsum = bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
209
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
210 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
211
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
212 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
213 break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
214 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
215
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
216 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
217 big_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
218 small_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
219 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
220 small_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
221 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
222 big_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
223 big_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
224 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
225 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
226
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
227 while (bitsum != NELLY_DETAIL_BITS && j <= 19) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
228 off = (big_off+small_off)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
229 bitsum = sum_bits(sbuf, shift_saved, off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
230 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
231 big_off=off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
232 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
233 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
234 small_off = off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
235 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
236 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
237 j++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
238 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
239
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
240 if (abs(big_bitsum-NELLY_DETAIL_BITS) >=
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
241 abs(small_bitsum-NELLY_DETAIL_BITS)) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
242 bitsum = small_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
243 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
244 small_off = big_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
245 bitsum = big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
246 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
247 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
248
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
249 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
250 tmp = sbuf[i]-small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
251 tmp = ((tmp>>(shift_saved-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
252 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
253 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
254
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
255 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
256 tmp = i = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
257 while (tmp < NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
258 tmp += bits[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
259 i++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
260 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
261
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
262 bits[i-1] -= tmp - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
263 for(; i < NELLY_FILL_LEN; i++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
264 bits[i] = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
265 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
266 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
267
6725
dc6bc48b0e17 Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents: 6710
diff changeset
268 static void nelly_decode_block(NellyMoserDecodeContext *s,
dc6bc48b0e17 Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents: 6710
diff changeset
269 const unsigned char block[NELLY_BLOCK_LEN],
dc6bc48b0e17 Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents: 6710
diff changeset
270 float audio[NELLY_SAMPLES])
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
271 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
272 int i,j;
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
273 float buf[NELLY_FILL_LEN], pows[NELLY_FILL_LEN];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
274 float *aptr, *bptr, *pptr, val, pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
275 int bits[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
276 unsigned char v;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
277
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
278 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
279
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
280 bptr = buf;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
281 pptr = pows;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
282 val = nelly_init_table[get_bits(&s->gb, 6)];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
283 for (i=0 ; i<NELLY_BANDS ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
284 if (i > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
285 val += nelly_delta_table[get_bits(&s->gb, 5)];
6614
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
286 pval = -pow(2, val/2048) * s->scale_bias;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
287 for (j = 0; j < nelly_band_sizes_table[i]; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
288 *bptr++ = val;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
289 *pptr++ = pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
290 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
291
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
292 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
293
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
294 get_sample_bits(buf, bits);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
295
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
296 for (i = 0; i < 2; i++) {
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
297 aptr = audio + i * NELLY_BUF_LEN;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
298
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
299 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
300 skip_bits(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
301
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
302 for (j = 0; j < NELLY_FILL_LEN; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
303 if (bits[j] <= 0) {
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
304 aptr[j] = M_SQRT1_2*pows[j];
6614
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
305 if (av_random(&s->random_state) & 1)
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
306 aptr[j] *= -1.0;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
307 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
308 v = get_bits(&s->gb, bits[j]);
6614
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
309 aptr[j] = dequantization_table[(1<<bits[j])-1+v]*pows[j];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
310 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
311 }
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
312 memset(&aptr[NELLY_FILL_LEN], 0,
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
313 (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float));
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
314
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
315 s->imdct_ctx.fft.imdct_calc(&s->imdct_ctx, s->imdct_out,
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
316 aptr, s->imdct_tmp);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
317 /* XXX: overlapping and windowing should be part of a more
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
318 generic imdct function */
6605
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
319 overlap_and_window(s, s->state, aptr, s->imdct_out);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
320 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
321 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
322
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
323 static av_cold int decode_init(AVCodecContext * avctx) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
324 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
325 int i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
326
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
327 s->avctx = avctx;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
328 av_init_random(0, &s->random_state);
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
329 ff_mdct_init(&s->imdct_ctx, 8, 1);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
330
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
331 dsputil_init(&s->dsp, avctx);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
332
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
333 if(s->dsp.float_to_int16 == ff_float_to_int16_c) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
334 s->add_bias = 385;
6613
54f88d1cee72 Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents: 6612
diff changeset
335 s->scale_bias = 1.0/(8*32768);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
336 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
337 s->add_bias = 0;
6613
54f88d1cee72 Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents: 6612
diff changeset
338 s->scale_bias = 1.0/(1*8);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
339 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
340
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
341 /* Generate overlap window */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
342 if (!sine_window[0])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
343 for (i=0 ; i<128; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
344 sine_window[i] = sin((i + 0.5) / 256.0 * M_PI);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
345 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
346
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
347 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
348 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
349
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
350 static int decode_tag(AVCodecContext * avctx,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
351 void *data, int *data_size,
6218
michael
parents: 5927
diff changeset
352 const uint8_t * buf, int buf_size) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
353 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
354 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
355 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
356 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
357 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
358
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
359 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
360 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
361
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
362 switch (buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
363 case 64: // 8000Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
364 blocks = 1; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
365 case 128: // 11025Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
366 blocks = 2; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
367 case 256: // 22050Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
368 blocks = 4; break;
5918
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
369 case 512: // 44100Hz
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
370 blocks = 8; break;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
371 default:
5917
282860fe5844 Change the "report sample" message from AV_LOG_DEBUG to AV_LOG_ERROR.
alex
parents: 5916
diff changeset
372 av_log(avctx, AV_LOG_ERROR, "Tag size %d unknown, report sample!\n", buf_size);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
373 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
374 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
375
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
376 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
377 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
378 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
379 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
380 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
381
5915
4528d63fbc8e Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents: 5874
diff changeset
382 return buf_size;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
383 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
384
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
385 static av_cold int decode_end(AVCodecContext * avctx) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
386 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
387
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
388 ff_mdct_end(&s->imdct_ctx);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
389 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
390 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
391
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
392 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
393 "nellymoser",
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
394 CODEC_TYPE_AUDIO,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
395 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
396 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
397 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
398 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
399 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
400 decode_tag,
6731
998990a4cccd Long name spelling fixes
banan
parents: 6725
diff changeset
401 .long_name = "Nellymoser Asao",
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
402 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
403