annotate nellymoserdec.c @ 7855:9a135b6a1dc7 libavcodec

Correct order of parsing for pulse scalefactor band and offset to match the specification. Patch by Alex Converse (alex converse gmail com)
author superdump
date Sat, 13 Sep 2008 18:47:43 +0000
parents 8226017a65ae
children ef9f95604644
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
7030
40f18ff994f9 Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents: 6763
diff changeset
34 #include "nellymoser.h"
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6741
diff changeset
35 #include "libavutil/random.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
36 #include "avcodec.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
37 #include "dsputil.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
38
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
39 #define ALT_BITSTREAM_READER_LE
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
40 #include "bitstream.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
41
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
42
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
43 typedef struct NellyMoserDecodeContext {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
44 AVCodecContext* avctx;
5838
fd8b56703750 Unaligned memory access rcrash fix
banan
parents: 5823
diff changeset
45 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
46 float state[128];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
47 AVRandomState random_state;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
48 GetBitContext gb;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
49 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
50 float scale_bias;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
51 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
52 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
53 DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
54 } NellyMoserDecodeContext;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
55
5916
353fca09cb72 Make sine_window static. Acked by Benjamin Larsson
alex
parents: 5915
diff changeset
56 static DECLARE_ALIGNED_16(float,sine_window[128]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
57
6605
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
58 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
59 {
6616
michael
parents: 6615
diff changeset
60 int bot, top;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
61
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
62 bot = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
63 top = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
64
6612
80cadb0595fb simplify
michael
parents: 6611
diff changeset
65 while (bot < NELLY_BUF_LEN) {
6615
3496fac9ea8f cosmetic
michael
parents: 6614
diff changeset
66 audio[bot] = a_in [bot]*sine_window[bot]
3496fac9ea8f cosmetic
michael
parents: 6614
diff changeset
67 +state[bot]*sine_window[top] + s->add_bias;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
68
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
69 bot++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
70 top--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
73 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
78 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
81 float *aptr, *bptr, *pptr, val, pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
82 int bits[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
83 unsigned char v;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
84
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
85 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
86
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
87 bptr = buf;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
90 for (i=0 ; i<NELLY_BANDS ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
95 *bptr++ = val;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
96 *pptr++ = pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
97 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
98
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
99 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
102
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
106 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
107 skip_bits(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
108
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
109 for (j = 0; j < NELLY_FILL_LEN; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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];
6614
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
112 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
113 aptr[j] *= -1.0;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
114 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
117 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
121
7547
8226017a65ae mdct wrapper function to match fft
lorenm
parents: 7546
diff changeset
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
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
125 overlap_and_window(s, s->state, aptr, s->imdct_out);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
126 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
127 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
130 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
131
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
132 s->avctx = avctx;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
133 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
134 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
135
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
136 dsputil_init(&s->dsp, avctx);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
137
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
138 if(s->dsp.float_to_int16 == ff_float_to_int16_c) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
141 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
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 /* Generate overlap window */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
147 if (!sine_window[0])
7094
b0820b8bd4dd Add generic ff_sine_window_init function and implement in codecs appropriately
superdump
parents: 7040
diff changeset
148 ff_sine_window_init(sine_window, 128);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
151 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
152 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
153
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
154 static int decode_tag(AVCodecContext * avctx,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
155 void *data, int *data_size,
6218
michael
parents: 5927
diff changeset
156 const uint8_t * buf, int buf_size) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
157 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
158 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
159 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166 switch (buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
167 case 64: // 8000Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168 blocks = 1; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
169 case 128: // 11025Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
170 blocks = 2; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
171 case 256: // 22050Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
172 blocks = 4; break;
5918
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
173 case 512: // 44100Hz
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
174 blocks = 8; break;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
175 default:
7357
5a743d9ad9bc Reduce the loglevel on a log message in the Nellymoser decoder. Related to Roundup 447.
banan
parents: 7196
diff changeset
176 av_log(avctx, AV_LOG_DEBUG, "Tag size %d.\n", buf_size);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
177 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
178 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
179
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
180 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185
5915
4528d63fbc8e Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents: 5874
diff changeset
186 return buf_size;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
188
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
189 static av_cold int decode_end(AVCodecContext * avctx) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
190 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
191
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
192 ff_mdct_end(&s->imdct_ctx);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
193 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
194 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
195
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
196 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197 "nellymoser",
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 CODEC_TYPE_AUDIO,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
200 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204 decode_tag,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7030
diff changeset
205 .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
207