annotate atrac.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 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10150
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
1 /*
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
2 * Atrac common functions
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
3 * Copyright (c) 2006-2008 Maxim Poliakovski
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
4 * Copyright (c) 2006-2008 Benjamin Larsson
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
5 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
6 * This file is part of FFmpeg.
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
7 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
12 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
16 * Lesser General Public License for more details.
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
17 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
21 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
22
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
23 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11316
diff changeset
24 * @file
10150
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
25 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
26
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
27 #include <math.h>
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
28 #include <stddef.h>
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
29 #include <stdio.h>
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
30
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
31 #include "avcodec.h"
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
32 #include "dsputil.h"
11316
6b869b5a5425 Include atrac.h: It contains the prototypes for atrac_generate_tables()
cehoyos
parents: 10150
diff changeset
33 #include "atrac.h"
10150
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
34
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
35 float sf_table[64];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
36 float qmf_window[48];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
37
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
38 static const float qmf_48tap_half[24] = {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
39 -0.00001461907, -0.00009205479,-0.000056157569,0.00030117269,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
40 0.0002422519, -0.00085293897,-0.0005205574, 0.0020340169,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
41 0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
42 -0.000061169922,-0.01344162, 0.0024626821, 0.021736089,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
43 -0.007801671, -0.034090221, 0.01880949, 0.054326009,
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
44 -0.043596379, -0.099384367, 0.13207909, 0.46424159
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
45 };
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
46
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
47 /**
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
48 * Generate common tables
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
49 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
50
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
51 void atrac_generate_tables(void)
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
52 {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
53 int i;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
54 float s;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
55
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
56 /* Generate scale factors */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
57 if (!sf_table[63])
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
58 for (i=0 ; i<64 ; i++)
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
59 sf_table[i] = pow(2.0, (i - 15) / 3.0);
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
60
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
61 /* Generate the QMF window. */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
62 if (!qmf_window[47])
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
63 for (i=0 ; i<24; i++) {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
64 s = qmf_48tap_half[i] * 2.0;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
65 qmf_window[i] = qmf_window[47 - i] = s;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
66 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
67 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
68
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
69
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
70 /**
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
71 * Quadrature mirror synthesis filter.
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
72 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
73 * @param inlo lower part of spectrum
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
74 * @param inhi higher part of spectrum
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
75 * @param nIn size of spectrum buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
76 * @param pOut out buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
77 * @param delayBuf delayBuf buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
78 * @param temp temp buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
79 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
80
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
81
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
82 void atrac_iqmf (float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
83 {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
84 int i, j;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
85 float *p1, *p3;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
86
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
87 memcpy(temp, delayBuf, 46*sizeof(float));
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
88
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
89 p3 = temp + 46;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
90
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
91 /* loop1 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
92 for(i=0; i<nIn; i+=2){
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
93 p3[2*i+0] = inlo[i ] + inhi[i ];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
94 p3[2*i+1] = inlo[i ] - inhi[i ];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
95 p3[2*i+2] = inlo[i+1] + inhi[i+1];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
96 p3[2*i+3] = inlo[i+1] - inhi[i+1];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
97 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
98
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
99 /* loop2 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
100 p1 = temp;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
101 for (j = nIn; j != 0; j--) {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
102 float s1 = 0.0;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
103 float s2 = 0.0;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
104
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
105 for (i = 0; i < 48; i += 2) {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
106 s1 += p1[i] * qmf_window[i];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
107 s2 += p1[i+1] * qmf_window[i+1];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
108 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
109
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
110 pOut[0] = s2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
111 pOut[1] = s1;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
112
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
113 p1 += 2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
114 pOut += 2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
115 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
116
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
117 /* Update the delay buffer. */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
118 memcpy(delayBuf, temp + nIn*2, 46*sizeof(float));
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
119 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
120