MythTV master
videovisualdefs.h
Go to the documentation of this file.
1#ifndef VIDEOVISUAL_DEFS_H
2#define VIDEOVISUAL_DEFS_H
3
4#include <algorithm>
5#include <cmath>
6
8{
9 public:
10 explicit LogScale(int maxscale = 0, int maxrange = 0)
11 {
12 setMax(maxscale, maxrange);
13 }
14
15 int scale() const { return m_s; }
16 int range() const { return m_r; }
17
18 void setMax(int maxscale, int maxrange)
19 {
20 if (maxscale == 0 || maxrange == 0)
21 return;
22
23 m_s = maxscale;
24 m_r = maxrange;
25
26 auto domain = (long double) maxscale;
27 auto drange = (long double) maxrange;
28 long double x = 1.0L;
29 long double dx = 1.0L;
30 long double e4 = 1.0E-8L;
31
32 m_indices.clear();
33 m_indices.resize(maxrange, 0);
34
35 // initialize log scale
36 for (uint i = 0; i < 10000 && (std::abs(dx) > e4); i++)
37 {
38 long double t = std::log((domain + x) / x);
39 long double y = (x * t) - drange;
40 long double yy = t - (domain / (x + domain));
41 dx = y / yy;
42 x -= dx;
43 }
44
45 double alpha = x;
46 for (int i = 1; i < (int) domain; i++)
47 {
48 int scaled = (int) floor(0.5 + (alpha * log((double(i) + alpha) / alpha)));
49 scaled = std::max(scaled, 1);
50 m_indices[scaled - 1] = std::max(m_indices[scaled - 1], i);
51 }
52 }
53
54 int operator[](int index) const
55 {
56 return m_indices[index];
57 }
58
59
60 private:
61 std::vector<int> m_indices;
62 int m_s {0};
63 int m_r {0};
64};
65
66static inline void stereo16_from_stereopcm8(short *l,
67 short *r,
68 const uchar *c,
69 long cnt)
70{
71 while (cnt >= 4L)
72 {
73 l[0] = c[0];
74 r[0] = c[1];
75 l[1] = c[2];
76 r[1] = c[3];
77 l[2] = c[4];
78 r[2] = c[5];
79 l[3] = c[6];
80 r[3] = c[7];
81 l += 4;
82 r += 4;
83 c += 8;
84 cnt -= 4L;
85 }
86
87 if (cnt > 0L)
88 {
89 l[0] = c[0];
90 r[0] = c[1];
91 if (cnt > 1L)
92 {
93 l[1] = c[2];
94 r[1] = c[3];
95 if (cnt > 2L)
96 {
97 l[2] = c[4];
98 r[2] = c[5];
99 }
100 }
101 }
102}
103
104static inline void stereo16_from_stereopcm16(short *l,
105 short *r,
106 const short *s,
107 long cnt)
108{
109 while (cnt >= 4L)
110 {
111 l[0] = s[0];
112 r[0] = s[1];
113 l[1] = s[2];
114 r[1] = s[3];
115 l[2] = s[4];
116 r[2] = s[5];
117 l[3] = s[6];
118 r[3] = s[7];
119 l += 4;
120 r += 4;
121 s += 8;
122 cnt -= 4L;
123 }
124
125 if (cnt > 0L)
126 {
127 l[0] = s[0];
128 r[0] = s[1];
129 if (cnt > 1L)
130 {
131 l[1] = s[2];
132 r[1] = s[3];
133 if (cnt > 2L)
134 {
135 l[2] = s[4];
136 r[2] = s[5];
137 }
138 }
139 }
140}
141
142static inline void mono16_from_monopcm8(short *l,
143 const uchar *c,
144 long cnt)
145{
146 while (cnt >= 4L)
147 {
148 l[0] = c[0];
149 l[1] = c[1];
150 l[2] = c[2];
151 l[3] = c[3];
152 l += 4;
153 c += 4;
154 cnt -= 4L;
155 }
156
157 if (cnt > 0L)
158 {
159 l[0] = c[0];
160 if (cnt > 1L)
161 {
162 l[1] = c[1];
163 if (cnt > 2L)
164 {
165 l[2] = c[2];
166 }
167 }
168 }
169}
170
171static inline void mono16_from_monopcm16(short *l,
172 const short *s,
173 long cnt)
174{
175 while (cnt >= 4L)
176 {
177 l[0] = s[0];
178 l[1] = s[1];
179 l[2] = s[2];
180 l[3] = s[3];
181 l += 4;
182 s += 4;
183 cnt -= 4L;
184 }
185
186 if (cnt > 0L)
187 {
188 l[0] = s[0];
189 if (cnt > 1L)
190 {
191 l[1] = s[1];
192 if (cnt > 2L)
193 {
194 l[2] = s[2];
195 }
196 }
197 }
198}
199
200#endif // VIDEOVISUAL_DEFS_H
LogScale(int maxscale=0, int maxrange=0)
int operator[](int index) const
std::vector< int > m_indices
int range() const
void setMax(int maxscale, int maxrange)
int scale() const
unsigned int uint
Definition: freesurround.h:24
None log(str msg, int level=LOGDEBUG)
Definition: xbmc.py:9
static void mono16_from_monopcm16(short *l, const short *s, long cnt)
static void mono16_from_monopcm8(short *l, const uchar *c, long cnt)
static void stereo16_from_stereopcm8(short *l, short *r, const uchar *c, long cnt)
static void stereo16_from_stereopcm16(short *l, short *r, const short *s, long cnt)