Mercurial > libavcodec.hg
annotate nellymoserdec.c @ 11060:daff45175333 libavcodec
Make the jump-table section-relative for x86_64 with PIC enabled.
This allows to get rid of the macho64 specific hack that moves them
to rodata (with worse cache behaviour) and avoids textrels which
e.g. Gentoo does not allow for x86_64 libraries.
author | reimar |
---|---|
date | Sat, 30 Jan 2010 19:26:47 +0000 |
parents | 34a65026fa06 |
children | 98970e51365a |
rev | line source |
---|---|
5823 | 1 /* |
2 * NellyMoser audio decoder | |
3 * Copyright (c) 2007 a840bda5870ba11f19698ff6eb9581dfb0f95fa5, | |
4 * 539459aeb7d425140b62a3ec7dbf6dc8e408a306, and | |
5 * 520e17cd55896441042b14df2566a6eb610ed444 | |
6 * Copyright (c) 2007 Loic Minier <lool at dooz.org> | |
7 * Benjamin Larsson | |
8 * | |
9 * Permission is hereby granted, free of charge, to any person obtaining a | |
10 * copy of this software and associated documentation files (the "Software"), | |
11 * to deal in the Software without restriction, including without limitation | |
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
13 * and/or sell copies of the Software, and to permit persons to whom the | |
14 * Software is furnished to do so, subject to the following conditions: | |
15 * | |
16 * The above copyright notice and this permission notice shall be included in | |
17 * all copies or substantial portions of the Software. | |
18 * | |
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
25 * DEALINGS IN THE SOFTWARE. | |
26 */ | |
27 | |
28 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8628
diff
changeset
|
29 * @file libavcodec/nellymoserdec.c |
5823 | 30 * The 3 alphanumeric copyright notices are md5summed they are from the original |
31 * implementors. The original code is available from http://code.google.com/p/nelly2pcm/ | |
32 */ | |
6763 | 33 |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
34 #include "nellymoser.h" |
9205 | 35 #include "libavutil/lfg.h" |
36 #include "libavutil/random_seed.h" | |
5823 | 37 #include "avcodec.h" |
38 #include "dsputil.h" | |
39 | |
40 #define ALT_BITSTREAM_READER_LE | |
9428 | 41 #include "get_bits.h" |
5823 | 42 |
43 | |
44 typedef struct NellyMoserDecodeContext { | |
45 AVCodecContext* avctx; | |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
46 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
|
47 float state[128]; |
9205 | 48 AVLFG random_state; |
5823 | 49 GetBitContext gb; |
50 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
|
51 float scale_bias; |
5823 | 52 DSPContext dsp; |
10199 | 53 FFTContext imdct_ctx; |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
54 DECLARE_ALIGNED_16(float,imdct_out)[NELLY_BUF_LEN * 2]; |
5823 | 55 } NellyMoserDecodeContext; |
56 | |
6605 | 57 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in) |
5823 | 58 { |
6616 | 59 int bot, top; |
5823 | 60 |
61 bot = 0; | |
62 top = NELLY_BUF_LEN-1; | |
63 | |
6612 | 64 while (bot < NELLY_BUF_LEN) { |
8614
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
65 audio[bot] = a_in [bot]*ff_sine_128[bot] |
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
66 +state[bot]*ff_sine_128[top] + s->add_bias; |
5823 | 67 |
68 bot++; | |
69 top--; | |
70 } | |
6611
79c5af90afde
Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents:
6610
diff
changeset
|
71 memcpy(state, a_in + NELLY_BUF_LEN, sizeof(float)*NELLY_BUF_LEN); |
5823 | 72 } |
73 | |
6725
dc6bc48b0e17
Mark symbol as static, patch by Diego 'Flameeyes' Petten, flameeyes gmail com.
diego
parents:
6710
diff
changeset
|
74 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
|
75 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
|
76 float audio[NELLY_SAMPLES]) |
5823 | 77 { |
78 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
|
79 float buf[NELLY_FILL_LEN], pows[NELLY_FILL_LEN]; |
5823 | 80 float *aptr, *bptr, *pptr, val, pval; |
81 int bits[NELLY_BUF_LEN]; | |
82 unsigned char v; | |
83 | |
84 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); | |
85 | |
86 bptr = buf; | |
87 pptr = pows; | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
88 val = ff_nelly_init_table[get_bits(&s->gb, 6)]; |
5823 | 89 for (i=0 ; i<NELLY_BANDS ; i++) { |
90 if (i > 0) | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
91 val += ff_nelly_delta_table[get_bits(&s->gb, 5)]; |
6614 | 92 pval = -pow(2, val/2048) * s->scale_bias; |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
93 for (j = 0; j < ff_nelly_band_sizes_table[i]; j++) { |
5823 | 94 *bptr++ = val; |
95 *pptr++ = pval; | |
96 } | |
97 | |
98 } | |
99 | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
100 ff_nelly_get_sample_bits(buf, bits); |
5823 | 101 |
102 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
|
103 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
|
104 |
5823 | 105 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); |
9637 | 106 skip_bits_long(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS); |
5823 | 107 |
108 for (j = 0; j < NELLY_FILL_LEN; j++) { | |
109 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
|
110 aptr[j] = M_SQRT1_2*pows[j]; |
9205 | 111 if (av_lfg_get(&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
|
112 aptr[j] *= -1.0; |
5823 | 113 } else { |
114 v = get_bits(&s->gb, bits[j]); | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
115 aptr[j] = ff_nelly_dequantization_table[(1<<bits[j])-1+v]*pows[j]; |
5823 | 116 } |
117 } | |
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
|
118 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
|
119 (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float)); |
5823 | 120 |
7547 | 121 ff_imdct_calc(&s->imdct_ctx, s->imdct_out, aptr); |
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
|
122 /* 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
|
123 generic imdct function */ |
6605 | 124 overlap_and_window(s, s->state, aptr, s->imdct_out); |
5823 | 125 } |
126 } | |
127 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
128 static av_cold int decode_init(AVCodecContext * avctx) { |
5823 | 129 NellyMoserDecodeContext *s = avctx->priv_data; |
130 | |
131 s->avctx = avctx; | |
10598 | 132 av_lfg_init(&s->random_state, 0); |
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9637
diff
changeset
|
133 ff_mdct_init(&s->imdct_ctx, 8, 1, 1.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
|
134 |
5823 | 135 dsputil_init(&s->dsp, avctx); |
136 | |
137 if(s->dsp.float_to_int16 == ff_float_to_int16_c) { | |
138 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
|
139 s->scale_bias = 1.0/(8*32768); |
5823 | 140 } else { |
141 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
|
142 s->scale_bias = 1.0/(1*8); |
5823 | 143 } |
144 | |
145 /* Generate overlap window */ | |
8614
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
146 if (!ff_sine_128[127]) |
10827
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10598
diff
changeset
|
147 ff_init_ff_sine_windows(7); |
5823 | 148 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7357
diff
changeset
|
149 avctx->sample_fmt = SAMPLE_FMT_S16; |
8153 | 150 avctx->channel_layout = CH_LAYOUT_MONO; |
5823 | 151 return 0; |
152 } | |
153 | |
154 static int decode_tag(AVCodecContext * avctx, | |
155 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
156 AVPacket *avpkt) { |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
157 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
158 int buf_size = avpkt->size; |
5823 | 159 NellyMoserDecodeContext *s = avctx->priv_data; |
160 int blocks, i; | |
161 int16_t* samples; | |
162 *data_size = 0; | |
163 samples = (int16_t*)data; | |
164 | |
165 if (buf_size < avctx->block_align) | |
166 return buf_size; | |
167 | |
168 switch (buf_size) { | |
169 case 64: // 8000Hz | |
170 blocks = 1; break; | |
171 case 128: // 11025Hz | |
172 blocks = 2; break; | |
9627 | 173 case 192: // 16000Hz |
174 blocks = 3; break; | |
5823 | 175 case 256: // 22050Hz |
176 blocks = 4; break; | |
5918 | 177 case 512: // 44100Hz |
178 blocks = 8; break; | |
5823 | 179 default: |
7357
5a743d9ad9bc
Reduce the loglevel on a log message in the Nellymoser decoder. Related to Roundup 447.
banan
parents:
7196
diff
changeset
|
180 av_log(avctx, AV_LOG_DEBUG, "Tag size %d.\n", buf_size); |
5823 | 181 return buf_size; |
182 } | |
183 | |
184 for (i=0 ; i<blocks ; i++) { | |
185 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); | |
186 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); | |
187 *data_size += NELLY_SAMPLES*sizeof(int16_t); | |
188 } | |
189 | |
5915
4528d63fbc8e
Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents:
5874
diff
changeset
|
190 return buf_size; |
5823 | 191 } |
192 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
193 static av_cold int decode_end(AVCodecContext * avctx) { |
5823 | 194 NellyMoserDecodeContext *s = avctx->priv_data; |
195 | |
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
|
196 ff_mdct_end(&s->imdct_ctx); |
5823 | 197 return 0; |
198 } | |
199 | |
200 AVCodec nellymoser_decoder = { | |
201 "nellymoser", | |
202 CODEC_TYPE_AUDIO, | |
203 CODEC_ID_NELLYMOSER, | |
204 sizeof(NellyMoserDecodeContext), | |
205 decode_init, | |
206 NULL, | |
207 decode_end, | |
208 decode_tag, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7030
diff
changeset
|
209 .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"), |
5823 | 210 }; |
211 |