annotate atrac.c @ 10948:c80f0dfbf47d libavcodec

Only calculate the second chroma qp if it differs from the firstin the main loop filter. (a little faster for the common case where they are equal)
author michael
date Wed, 20 Jan 2010 01:49:24 +0000
parents 29cedcc646fe
children 6b869b5a5425
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 /**
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
24 * @file libavcodec/atrac.c
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"
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
33
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
34 float sf_table[64];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
35 float qmf_window[48];
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
36
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
37 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
38 -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
39 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
40 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
41 -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
42 -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
43 -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
44 };
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 * Generate common tables
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
48 */
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 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
51 {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
52 int i;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
53 float s;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
54
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
55 /* Generate scale factors */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
56 if (!sf_table[63])
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
57 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
58 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
59
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
60 /* Generate the QMF window. */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
61 if (!qmf_window[47])
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
62 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
63 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
64 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
65 }
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 * Quadrature mirror synthesis filter.
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
71 *
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
72 * @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
73 * @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
74 * @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
75 * @param pOut out buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
76 * @param delayBuf delayBuf buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
77 * @param temp temp buffer
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
78 */
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 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
82 {
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
83 int i, j;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
84 float *p1, *p3;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
85
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
86 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
87
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
88 p3 = temp + 46;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
89
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
90 /* loop1 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
91 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
92 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
93 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
94 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
95 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
96 }
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 /* loop2 */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
99 p1 = temp;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
100 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
101 float s1 = 0.0;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
102 float s2 = 0.0;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
103
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
104 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
105 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
106 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
107 }
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 pOut[0] = s2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
110 pOut[1] = s1;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
111
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
112 p1 += 2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
113 pOut += 2;
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
114 }
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 /* Update the delay buffer. */
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
117 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
118 }
29cedcc646fe Split out common routines needed in the atrac1 decoder from atrac3.c to atrac.c.
banan
parents:
diff changeset
119