rework keyframe hide popup, keyframe auto render, textbox set_selection wide text
[goodguy/history.git] / cinelerra-5.1 / libzmpeg3 / a52dec-0.7.3 / libao / float2s16.c
1 /*
2  * float2s16.c
3  * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
4  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
5  *
6  * This file is part of a52dec, a free ATSC A-52 stream decoder.
7  * See http://liba52.sourceforge.net/ for updates.
8  *
9  * a52dec is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * a52dec is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 #include "config.h"
25
26 #include <inttypes.h>
27
28 #include "a52.h"
29 #include "audio_out.h"
30
31 static inline int16_t convert (int32_t i)
32 {
33     if (i > 0x43c07fff)
34         return 32767;
35     else if (i < 0x43bf8000)
36         return -32768;
37     else
38         return i - 0x43c00000;
39 }
40
41 void float2s16_2 (float * _f, int16_t * s16)
42 {
43     int i;
44     int32_t * f = (int32_t *) _f;
45
46     for (i = 0; i < 256; i++) {
47         s16[2*i] = convert (f[i]);
48         s16[2*i+1] = convert (f[i+256]);
49     }
50 }
51
52 void float2s16_4 (float * _f, int16_t * s16)
53 {
54     int i;
55     int32_t * f = (int32_t *) _f;
56
57     for (i = 0; i < 256; i++) {
58         s16[4*i] = convert (f[i]);
59         s16[4*i+1] = convert (f[i+256]);
60         s16[4*i+2] = convert (f[i+512]);
61         s16[4*i+3] = convert (f[i+768]);
62     }
63 }
64
65 void float2s16_5 (float * _f, int16_t * s16)
66 {
67     int i;
68     int32_t * f = (int32_t *) _f;
69
70     for (i = 0; i < 256; i++) {
71         s16[5*i] = convert (f[i]);
72         s16[5*i+1] = convert (f[i+256]);
73         s16[5*i+2] = convert (f[i+512]);
74         s16[5*i+3] = convert (f[i+768]);
75         s16[5*i+4] = convert (f[i+1024]);
76     }
77 }
78
79 int channels_multi (int flags)
80 {
81     if (flags & A52_LFE)
82         return 6;
83     else if (flags & 1) /* center channel */
84         return 5;
85     else if ((flags & A52_CHANNEL_MASK) == A52_2F2R)
86         return 4;
87     else
88         return 2;
89 }
90
91 void float2s16_multi (float * _f, int16_t * s16, int flags)
92 {
93     int i;
94     int32_t * f = (int32_t *) _f;
95
96     switch (flags) {
97     case A52_MONO:
98         for (i = 0; i < 256; i++) {
99             s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
100             s16[5*i+4] = convert (f[i]);
101         }
102         break;
103     case A52_CHANNEL:
104     case A52_STEREO:
105     case A52_DOLBY:
106         float2s16_2 (_f, s16);
107         break;
108     case A52_3F:
109         for (i = 0; i < 256; i++) {
110             s16[5*i] = convert (f[i]);
111             s16[5*i+1] = convert (f[i+512]);
112             s16[5*i+2] = s16[5*i+3] = 0;
113             s16[5*i+4] = convert (f[i+256]);
114         }
115         break;
116     case A52_2F2R:
117         float2s16_4 (_f, s16);
118         break;
119     case A52_3F2R:
120         float2s16_5 (_f, s16);
121         break;
122     case A52_MONO | A52_LFE:
123         for (i = 0; i < 256; i++) {
124             s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
125             s16[6*i+4] = convert (f[i+256]);
126             s16[6*i+5] = convert (f[i]);
127         }
128         break;
129     case A52_CHANNEL | A52_LFE:
130     case A52_STEREO | A52_LFE:
131     case A52_DOLBY | A52_LFE:
132         for (i = 0; i < 256; i++) {
133             s16[6*i] = convert (f[i+256]);
134             s16[6*i+1] = convert (f[i+512]);
135             s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
136             s16[6*i+5] = convert (f[i]);
137         }
138         break;
139     case A52_3F | A52_LFE:
140         for (i = 0; i < 256; i++) {
141             s16[6*i] = convert (f[i+256]);
142             s16[6*i+1] = convert (f[i+768]);
143             s16[6*i+2] = s16[6*i+3] = 0;
144             s16[6*i+4] = convert (f[i+512]);
145             s16[6*i+5] = convert (f[i]);
146         }
147         break;
148     case A52_2F2R | A52_LFE:
149         for (i = 0; i < 256; i++) {
150             s16[6*i] = convert (f[i+256]);
151             s16[6*i+1] = convert (f[i+512]);
152             s16[6*i+2] = convert (f[i+768]);
153             s16[6*i+3] = convert (f[i+1024]);
154             s16[6*i+4] = 0;
155             s16[6*i+5] = convert (f[i]);
156         }
157         break;
158     case A52_3F2R | A52_LFE:
159         for (i = 0; i < 256; i++) {
160             s16[6*i] = convert (f[i+256]);
161             s16[6*i+1] = convert (f[i+768]);
162             s16[6*i+2] = convert (f[i+1024]);
163             s16[6*i+3] = convert (f[i+1280]);
164             s16[6*i+4] = convert (f[i+512]);
165             s16[6*i+5] = convert (f[i]);
166         }
167         break;
168     }
169 }
170
171 void s16_swap (int16_t * s16, int channels)
172 {
173     int i;
174     uint16_t * u16 = (uint16_t *) s16;
175
176     for (i = 0; i < 256 * channels; i++)
177         u16[i] = (u16[i] >> 8) | (u16[i] << 8);
178 }