annotate nellymoserdec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 554ee9fa2840
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
29 * @file
5823
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"
9205
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
35 #include "libavutil/lfg.h"
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
36 #include "libavutil/random_seed.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
37 #include "avcodec.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
38 #include "dsputil.h"
11370
4b3da727d832 Move FFT parts from dsputil.h to fft.h
mru
parents: 11369
diff changeset
39 #include "fft.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
40
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
41 #define ALT_BITSTREAM_READER_LE
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
42 #include "get_bits.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
43
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
44
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
45 typedef struct NellyMoserDecodeContext {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
46 AVCodecContext* avctx;
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
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
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
49 AVLFG random_state;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
50 GetBitContext gb;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
53 DSPContext dsp;
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 9658
diff changeset
54 FFTContext imdct_ctx;
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
55 DECLARE_ALIGNED(16, float,imdct_out)[NELLY_BUF_LEN * 2];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
56 } NellyMoserDecodeContext;
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) {
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
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);
9637
f1dc62781766 Use skip_bits_long() for large skips
conrad
parents: 9627
diff changeset
107 skip_bits_long(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
5823
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];
9205
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
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
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;
10598
5e566408864c nellymoser: use constant seed for dithering RNG
mru
parents: 10199
diff changeset
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
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 */
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
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;
8153
ef9f95604644 Set channel_layout
banan
parents: 7547
diff changeset
151 avctx->channel_layout = CH_LAYOUT_MONO;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
152 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
153 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
154
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
155 static int decode_tag(AVCodecContext * avctx,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
167 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168
11878
47885d4aeaaa Reindent
mstorsjo
parents: 11877
diff changeset
169 if (buf_size % 64) {
11879
554ee9fa2840 nellymoserdec: Increase the log level of messages when failing to decode data
mstorsjo
parents: 11878
diff changeset
170 av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size);
11878
47885d4aeaaa Reindent
mstorsjo
parents: 11877
diff changeset
171 return buf_size;
47885d4aeaaa Reindent
mstorsjo
parents: 11877
diff changeset
172 }
47885d4aeaaa Reindent
mstorsjo
parents: 11877
diff changeset
173 blocks = buf_size / 64;
11877
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
174 /* Normal numbers of blocks for sample rates:
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
175 * 8000 Hz - 1
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
176 * 11025 Hz - 2
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
177 * 16000 Hz - 3
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
178 * 22050 Hz - 4
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
179 * 44100 Hz - 8
17092b43bd64 nellymoserdec: Simplify calculation of numbers of blocks
mstorsjo
parents: 11876
diff changeset
180 */
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
186 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187
5915
4528d63fbc8e Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents: 5874
diff changeset
188 return buf_size;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
189 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
190
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
191 static av_cold int decode_end(AVCodecContext * avctx) {
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
192 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
193
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
194 ff_mdct_end(&s->imdct_ctx);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
195 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
196 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199 "nellymoser",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11370
diff changeset
200 AVMEDIA_TYPE_AUDIO,
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
205 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206 decode_tag,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7030
diff changeset
207 .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
208 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
209