Mercurial > libavcodec.hg
annotate nellymoserdec.c @ 11557:53822d92c3f7 libavcodec
Make sure the EC code does not attempt to use inter based concealment if there
is no reference frame available. (this can happen because the EC code will attempt
to use reference frames even for I/IDR frames)
author | michael |
---|---|
date | Tue, 30 Mar 2010 20:46:46 +0000 |
parents | 4b3da727d832 |
children | 8a4984c5cacc |
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" | |
11370 | 39 #include "fft.h" |
5823 | 40 |
41 #define ALT_BITSTREAM_READER_LE | |
9428 | 42 #include "get_bits.h" |
5823 | 43 |
44 | |
45 typedef struct NellyMoserDecodeContext { | |
46 AVCodecContext* avctx; | |
11369 | 47 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
|
48 float state[128]; |
9205 | 49 AVLFG random_state; |
5823 | 50 GetBitContext gb; |
51 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
|
52 float scale_bias; |
5823 | 53 DSPContext dsp; |
10199 | 54 FFTContext imdct_ctx; |
11369 | 55 DECLARE_ALIGNED(16, float,imdct_out)[NELLY_BUF_LEN * 2]; |
5823 | 56 } NellyMoserDecodeContext; |
57 | |
6605 | 58 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in) |
5823 | 59 { |
6616 | 60 int bot, top; |
5823 | 61 |
62 bot = 0; | |
63 top = NELLY_BUF_LEN-1; | |
64 | |
6612 | 65 while (bot < NELLY_BUF_LEN) { |
8614
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
66 audio[bot] = a_in [bot]*ff_sine_128[bot] |
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
67 +state[bot]*ff_sine_128[top] + s->add_bias; |
5823 | 68 |
69 bot++; | |
70 top--; | |
71 } | |
6611
79c5af90afde
Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents:
6610
diff
changeset
|
72 memcpy(state, a_in + NELLY_BUF_LEN, sizeof(float)*NELLY_BUF_LEN); |
5823 | 73 } |
74 | |
6725
dc6bc48b0e17
Mark symbol as static, patch by Diego 'Flameeyes' Petten, flameeyes gmail com.
diego
parents:
6710
diff
changeset
|
75 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
|
76 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
|
77 float audio[NELLY_SAMPLES]) |
5823 | 78 { |
79 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
|
80 float buf[NELLY_FILL_LEN], pows[NELLY_FILL_LEN]; |
5823 | 81 float *aptr, *bptr, *pptr, val, pval; |
82 int bits[NELLY_BUF_LEN]; | |
83 unsigned char v; | |
84 | |
85 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); | |
86 | |
87 bptr = buf; | |
88 pptr = pows; | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
89 val = ff_nelly_init_table[get_bits(&s->gb, 6)]; |
5823 | 90 for (i=0 ; i<NELLY_BANDS ; i++) { |
91 if (i > 0) | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
92 val += ff_nelly_delta_table[get_bits(&s->gb, 5)]; |
6614 | 93 pval = -pow(2, val/2048) * s->scale_bias; |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
94 for (j = 0; j < ff_nelly_band_sizes_table[i]; j++) { |
5823 | 95 *bptr++ = val; |
96 *pptr++ = pval; | |
97 } | |
98 | |
99 } | |
100 | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
101 ff_nelly_get_sample_bits(buf, bits); |
5823 | 102 |
103 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
|
104 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
|
105 |
5823 | 106 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); |
9637 | 107 skip_bits_long(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS); |
5823 | 108 |
109 for (j = 0; j < NELLY_FILL_LEN; j++) { | |
110 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
|
111 aptr[j] = M_SQRT1_2*pows[j]; |
9205 | 112 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
|
113 aptr[j] *= -1.0; |
5823 | 114 } else { |
115 v = get_bits(&s->gb, bits[j]); | |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
6763
diff
changeset
|
116 aptr[j] = ff_nelly_dequantization_table[(1<<bits[j])-1+v]*pows[j]; |
5823 | 117 } |
118 } | |
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
|
119 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
|
120 (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float)); |
5823 | 121 |
7547 | 122 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
|
123 /* 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
|
124 generic imdct function */ |
6605 | 125 overlap_and_window(s, s->state, aptr, s->imdct_out); |
5823 | 126 } |
127 } | |
128 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
129 static av_cold int decode_init(AVCodecContext * avctx) { |
5823 | 130 NellyMoserDecodeContext *s = avctx->priv_data; |
131 | |
132 s->avctx = avctx; | |
10598 | 133 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
|
134 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
|
135 |
5823 | 136 dsputil_init(&s->dsp, avctx); |
137 | |
138 if(s->dsp.float_to_int16 == ff_float_to_int16_c) { | |
139 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
|
140 s->scale_bias = 1.0/(8*32768); |
5823 | 141 } else { |
142 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
|
143 s->scale_bias = 1.0/(1*8); |
5823 | 144 } |
145 | |
146 /* Generate overlap window */ | |
8614
ff10b38304d2
Use shared sine window instead of defining another one.
vitor
parents:
8153
diff
changeset
|
147 if (!ff_sine_128[127]) |
10827
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10598
diff
changeset
|
148 ff_init_ff_sine_windows(7); |
5823 | 149 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7357
diff
changeset
|
150 avctx->sample_fmt = SAMPLE_FMT_S16; |
8153 | 151 avctx->channel_layout = CH_LAYOUT_MONO; |
5823 | 152 return 0; |
153 } | |
154 | |
155 static int decode_tag(AVCodecContext * avctx, | |
156 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
157 AVPacket *avpkt) { |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
158 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9205
diff
changeset
|
159 int buf_size = avpkt->size; |
5823 | 160 NellyMoserDecodeContext *s = avctx->priv_data; |
161 int blocks, i; | |
162 int16_t* samples; | |
163 *data_size = 0; | |
164 samples = (int16_t*)data; | |
165 | |
166 if (buf_size < avctx->block_align) | |
167 return buf_size; | |
168 | |
169 switch (buf_size) { | |
170 case 64: // 8000Hz | |
171 blocks = 1; break; | |
172 case 128: // 11025Hz | |
173 blocks = 2; break; | |
9627 | 174 case 192: // 16000Hz |
175 blocks = 3; break; | |
5823 | 176 case 256: // 22050Hz |
177 blocks = 4; break; | |
5918 | 178 case 512: // 44100Hz |
179 blocks = 8; break; | |
5823 | 180 default: |
7357
5a743d9ad9bc
Reduce the loglevel on a log message in the Nellymoser decoder. Related to Roundup 447.
banan
parents:
7196
diff
changeset
|
181 av_log(avctx, AV_LOG_DEBUG, "Tag size %d.\n", buf_size); |
5823 | 182 return buf_size; |
183 } | |
184 | |
185 for (i=0 ; i<blocks ; i++) { | |
186 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); | |
187 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); | |
188 *data_size += NELLY_SAMPLES*sizeof(int16_t); | |
189 } | |
190 | |
5915
4528d63fbc8e
Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents:
5874
diff
changeset
|
191 return buf_size; |
5823 | 192 } |
193 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
194 static av_cold int decode_end(AVCodecContext * avctx) { |
5823 | 195 NellyMoserDecodeContext *s = avctx->priv_data; |
196 | |
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
|
197 ff_mdct_end(&s->imdct_ctx); |
5823 | 198 return 0; |
199 } | |
200 | |
201 AVCodec nellymoser_decoder = { | |
202 "nellymoser", | |
203 CODEC_TYPE_AUDIO, | |
204 CODEC_ID_NELLYMOSER, | |
205 sizeof(NellyMoserDecodeContext), | |
206 decode_init, | |
207 NULL, | |
208 decode_end, | |
209 decode_tag, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7030
diff
changeset
|
210 .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"), |
5823 | 211 }; |
212 |