1f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/* ------------------------------------------------------------------
2f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
4f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * you may not use this file except in compliance with the License.
6f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * You may obtain a copy of the License at
7f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
8f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
10f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * express or implied.
14f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * See the License for the specific language governing permissions
15f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * and limitations under the License.
16f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * -------------------------------------------------------------------
17f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber */
18f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*
19f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
20f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Filename: ps_applied.c
21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY
24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Who:                                   Date: MM/DD/YYYY
27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION
36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        Applies Parametric Stereo Tool to a QMF-analized mono signal
38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        providing a stereo image as output
39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     _______                                              ________
42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    |       |                                  _______   |        |
43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    | Anal. |        |                        |       |  | Synth  |   QMF -> L
45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     -------         o----------------------->|       |   --------    Synth
46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberQMF                  |                s_k(n)  |Stereo |-------------->
47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberAnal.              -------------------------->|       |
48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     _______       | |                        |       |   ________
49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    |       | HF --o |   -----------          |Process|  |        |
50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   ---->|           |-------->|       |   --------    Synth
53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                         -----------          |_______|-------------->
54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS
58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES
62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberSC 29 Software Copyright Licencing Disclaimer:
64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberThis software module was originally developed by
66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber  Coding Technologies
67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberand edited by
69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber  -
70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberin the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberstandards for reference purposes and its performance may not have been
73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberoptimized. This software module is an implementation of one or more tools as
74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberspecified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberISO/IEC gives users free license to this software module or modifications
76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberthereof for use in products claiming conformance to audiovisual and
77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International
78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberStandards. ISO/IEC gives users the same free license to this software module or
79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Hubermodifications thereof for research purposes and further ISO/IEC standardisation.
80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberThose intending to use this software module in products are advised that its
81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberuse may infringe existing patents. ISO/IEC have no liability for use of this
82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Hubersoftware module or modifications thereof. Copyright is not released for
83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberproducts that do not conform to audiovisual and image-coding related ITU
84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberRecommendations and/or ISO/IEC International Standards.
85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberThe original developer retains full right to modify and use the code for its
86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberown purpose, assign or donate the code to a third party and to inhibit third
87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberparties from using the code for products that do not conform to audiovisual and
88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International Standards.
89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberThis copyright notice must be included in all copies or derivative works.
90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberCopyright (c) ISO/IEC 2003.
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE
94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/
97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES
101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#ifdef AAC_PLUS
104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#ifdef PARAMETRICSTEREO
106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "aac_mem_funcs.h"
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ps_stereo_processing.h"
108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ps_decorrelate.h"
109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ps_hybrid_synthesis.h"
110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ps_hybrid_analysis.h"
111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ps_applied.h"
112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS
115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here
116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES
121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional
122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also.
123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration
128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module
133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere
143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE
148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Hubervoid ps_applied(STRUCT_PS_DEC *h_ps_dec,
151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 rIntBufferLeft[][64],
152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 iIntBufferLeft[][64],
153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 *rIntBufferRight,
154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 *iIntBufferRight,
155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 scratch_mem[],
156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                Int32 band)
157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  Get higher frequency resolution in the lower QMF subbands
162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  creating sub-subbands
163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ps_hybrid_analysis(rIntBufferLeft,
165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       iIntBufferLeft,
166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       h_ps_dec->mHybridRealLeft,
167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       h_ps_dec->mHybridImagLeft,
168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       h_ps_dec->hHybrid,
169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       scratch_mem,
170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                       band);
171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  By means of delaying and all-pass filtering, sub-subbands of
174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  left ch. are decorrelate to creates right ch. sub-subbands
175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ps_decorrelate(h_ps_dec,
178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   *rIntBufferLeft,
179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   *iIntBufferLeft,
180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   rIntBufferRight,
181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   iIntBufferRight,
182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   scratch_mem);
183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  sub-subbands of left and right ch. are processed according to
186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  stereo clues.
187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ps_stereo_processing(h_ps_dec,
190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                         *rIntBufferLeft,
191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                         *iIntBufferLeft,
192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                         rIntBufferRight,
193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                         iIntBufferRight);
194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  Reconstruct stereo signals
197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ps_hybrid_synthesis((const Int32*)h_ps_dec->mHybridRealLeft,
200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        (const Int32*)h_ps_dec->mHybridImagLeft,
201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        *rIntBufferLeft,
202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        *iIntBufferLeft,
203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        h_ps_dec->hHybrid);
204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ps_hybrid_synthesis((const Int32*)h_ps_dec->mHybridRealRight,
206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        (const Int32*)h_ps_dec->mHybridImagRight,
207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        rIntBufferRight,
208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        iIntBufferRight,
209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        h_ps_dec->hHybrid);
210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber}/* END ps_applied */
212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#endif
213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#endif
216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
217