annotate nellymoserdec.c @ 10952:ea8f891d997d libavcodec

H264 DXVA2 implementation It allows VLD H264 decoding using DXVA2 (GPU assisted decoding API under VISTA and Windows 7). It is implemented by using AVHWAccel API. It has been tested successfully for some time in VLC using an nvidia card on Windows 7. To compile it, you need to have the system header dxva2api.h (either from microsoft or using http://downloads.videolan.org/pub/videolan/testing/contrib/dxva2api.h) The generated libavcodec.dll does not depend directly on any new lib as the necessary objects are given by the application using FFmpeg.
author fenrir
date Wed, 20 Jan 2010 18:54:51 +0000
parents 3d011a01a6a0
children 34a65026fa06
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8628
diff changeset
29 * @file libavcodec/nellymoserdec.c
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"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
39
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
40 #define ALT_BITSTREAM_READER_LE
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
41 #include "get_bits.h"
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
42
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
43
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
44 typedef struct NellyMoserDecodeContext {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
45 AVCodecContext* avctx;
5838
fd8b56703750 Unaligned memory access rcrash fix
banan
parents: 5823
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
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
48 AVLFG random_state;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
49 GetBitContext gb;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
52 DSPContext dsp;
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 9658
diff changeset
53 FFTContext imdct_ctx;
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
54 DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
55 } NellyMoserDecodeContext;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
56
6605
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
57 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
58 {
6616
michael
parents: 6615
diff changeset
59 int bot, top;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
60
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
61 bot = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
62 top = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
63
6612
80cadb0595fb simplify
michael
parents: 6611
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
67
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
68 bot++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
69 top--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
72 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
77 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
80 float *aptr, *bptr, *pptr, val, pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
81 int bits[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
82 unsigned char v;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
83
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
84 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
85
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
86 bptr = buf;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
89 for (i=0 ; i<NELLY_BANDS ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
d525255f5688 Move the *-1 to a more sane place as well.
michael
parents: 6613
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
94 *bptr++ = val;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
95 *pptr++ = pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
96 }
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
7030
40f18ff994f9 Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents: 6763
diff changeset
100 ff_nelly_get_sample_bits(buf, bits);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
101
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
105 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
9637
f1dc62781766 Use skip_bits_long() for large skips
conrad
parents: 9627
diff changeset
106 skip_bits_long(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
107
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
108 for (j = 0; j < NELLY_FILL_LEN; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
c8ecf9b612b2 Get rid of av_random in nellymoserdec.c
banan
parents: 8718
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
113 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
116 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
120
7547
8226017a65ae mdct wrapper function to match fft
lorenm
parents: 7546
diff changeset
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
075d1d2b49a2 simplify transform
michael
parents: 6517
diff changeset
124 overlap_and_window(s, s->state, aptr, s->imdct_out);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
125 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
126 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
129 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
130
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
131 s->avctx = avctx;
10598
5e566408864c nellymoser: use constant seed for dithering RNG
mru
parents: 10199
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
135 dsputil_init(&s->dsp, avctx);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
136
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
137 if(s->dsp.float_to_int16 == ff_float_to_int16_c) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
140 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
143 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
144
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
ef9f95604644 Set channel_layout
banan
parents: 7547
diff changeset
150 avctx->channel_layout = CH_LAYOUT_MONO;
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,
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
159 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
167
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168 switch (buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
169 case 64: // 8000Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
170 blocks = 1; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
171 case 128: // 11025Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
172 blocks = 2; break;
9627
b10d954527a2 Support 16K samplerate in Nellymoser.
diego
parents: 9428
diff changeset
173 case 192: // 16000Hz
b10d954527a2 Support 16K samplerate in Nellymoser.
diego
parents: 9428
diff changeset
174 blocks = 3; break;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
175 case 256: // 22050Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
176 blocks = 4; break;
5918
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
177 case 512: // 44100Hz
1f99f370e9c5 Support 44.1kHz audio. Acked by Benjamin
alex
parents: 5917
diff changeset
178 blocks = 8; break;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
186 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
188 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
189
5915
4528d63fbc8e Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents: 5874
diff changeset
190 return buf_size;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
191 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
194 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
200 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201 "nellymoser",
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202 CODEC_TYPE_AUDIO,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
205 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
207 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
210 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
211