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