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