MythTV  master
eldutils.cpp
Go to the documentation of this file.
1 /*
2  * eldutils.cpp (c) Jean-Yves Avenard <jyavenard@mythtv.org>
3  * a utility class to decode EDID Like Data (ELD) byte stream
4  *
5  * Based on ALSA hda_eld.c
6  * Copyright(c) 2008 Intel Corporation.
7  *
8  * Authors:
9  * Wu Fengguang <wfg@linux.intel.com>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 #include "eldutils.h"
26 
27 #include <algorithm>
28 #include <cinttypes>
29 #include <limits> // workaround QTBUG-90395
30 #include <sys/types.h>
31 
32 #include <QString>
33 #include <QtEndian>
34 
35 #include "audiooutputbase.h"
36 
37 #define LOC QString("ELDUTILS: ")
38 
39 enum eld_versions : std::uint8_t
40 {
43 };
44 
45 enum cea_edid_versions : std::uint8_t
46 {
52 };
53 
54 static const std::array<const QString,11> cea_speaker_allocation_names {
55  /* 0 */ "FL/FR",
56  /* 1 */ "LFE",
57  /* 2 */ "FC",
58  /* 3 */ "RL/RR",
59  /* 4 */ "RC",
60  /* 5 */ "FLC/FRC",
61  /* 6 */ "RLC/RRC",
62  /* 7 */ "FLW/FRW",
63  /* 8 */ "FLH/FRH",
64  /* 9 */ "TC",
65  /* 10 */ "FCH",
66 };
67 
68 static const std::array<const QString,4> eld_connection_type_names {
69  "HDMI",
70  "DisplayPort",
71  "2-reserved",
72  "3-reserved"
73 };
74 
75 enum cea_audio_coding_xtypes : std::uint8_t
76 {
82 };
83 
84 static const std::array<const QString,18> audiotype_names {
85  /* 0 */ "undefined",
86  /* 1 */ "LPCM",
87  /* 2 */ "AC3",
88  /* 3 */ "MPEG1",
89  /* 4 */ "MP3",
90  /* 5 */ "MPEG2",
91  /* 6 */ "AAC-LC",
92  /* 7 */ "DTS",
93  /* 8 */ "ATRAC",
94  /* 9 */ "DSD (One Bit Audio)",
95  /* 10 */ "E-AC3",
96  /* 11 */ "DTS-HD",
97  /* 12 */ "TrueHD",
98  /* 13 */ "DST",
99  /* 14 */ "WMAPro",
100  /* 15 */ "HE-AAC",
101  /* 16 */ "HE-AACv2",
102  /* 17 */ "MPEG Surround",
103 };
104 
105 /*
106  * The following two lists are shared between
107  * - HDMI audio InfoFrame (source to sink)
108  * - CEA E-EDID Extension (sink to source)
109  */
110 
111 /*
112  * SF2:SF1:SF0 index => sampling frequency
113  */
114 enum : std::uint16_t {
115  SNDRV_PCM_RATE_5512 = (1<<0), /* 5512Hz */
116  SNDRV_PCM_RATE_8000 = (1<<1), /* 8000Hz */
117  SNDRV_PCM_RATE_11025 = (1<<2), /* 11025Hz */
118  SNDRV_PCM_RATE_16000 = (1<<3), /* 16000Hz */
119  SNDRV_PCM_RATE_22050 = (1<<4), /* 22050Hz */
120  SNDRV_PCM_RATE_32000 = (1<<5), /* 32000Hz */
121  SNDRV_PCM_RATE_44100 = (1<<6), /* 44100Hz */
122  SNDRV_PCM_RATE_48000 = (1<<7), /* 48000Hz */
123  SNDRV_PCM_RATE_64000 = (1<<8), /* 64000Hz */
124  SNDRV_PCM_RATE_88200 = (1<<9), /* 88200Hz */
125  SNDRV_PCM_RATE_96000 = (1<<10), /* 96000Hz */
126  SNDRV_PCM_RATE_176400 = (1<<11), /* 176400Hz */
127  SNDRV_PCM_RATE_192000 = (1<<12), /* 192000Hz */
128 };
129 
130 static const std::array<const int,8> cea_sampling_frequencies {
131  0, /* 0: Refer to Stream Header */
132  SNDRV_PCM_RATE_32000, /* 1: 32000Hz */
133  SNDRV_PCM_RATE_44100, /* 2: 44100Hz */
134  SNDRV_PCM_RATE_48000, /* 3: 48000Hz */
135  SNDRV_PCM_RATE_88200, /* 4: 88200Hz */
136  SNDRV_PCM_RATE_96000, /* 5: 96000Hz */
137  SNDRV_PCM_RATE_176400, /* 6: 176400Hz */
138  SNDRV_PCM_RATE_192000, /* 7: 192000Hz */
139 };
140 
141 static inline int
142 GRAB_BITS(const char* buf, size_t byte, uint8_t lowbit, uint8_t bits)
143  { return (buf[byte] >> lowbit) & ((1 << bits) - 1); };
144 
145 eld::eld(const char *buf, int size)
146 {
147  m_e.formats = 0LL;
148  update_eld(buf, size);
149 }
150 
152 {
153  m_e.formats = 0LL;
154  m_e.eld_valid = false;
155 }
156 
157 eld& eld::operator=(const eld &rhs)
158 {
159  if (this == &rhs)
160  return *this;
161  m_e = rhs.m_e;
162  return *this;
163 }
164 
165 void eld::update_sad(int index,
166  const char *buf)
167 {
168  cea_sad *a = m_e.sad + index;
169 
170  int val = GRAB_BITS(buf, 1, 0, 7);
171  a->rates = 0;
172  for (int i = 0; i < 7; i++)
173  if ((val & (1 << i)) != 0)
174  a->rates |= cea_sampling_frequencies[i + 1];
175 
176  a->channels = GRAB_BITS(buf, 0, 0, 3);
177  a->channels++;
178 
179  a->sample_bits = 0;
180  a->max_bitrate = 0;
181 
182  a->format = GRAB_BITS(buf, 0, 3, 4);
183  m_e.formats |= 1 << a->format;
184  switch (a->format)
185  {
187  VBAUDIO("audio coding type 0 not expected");
188  break;
189 
190  case TYPE_LPCM:
191  a->sample_bits = GRAB_BITS(buf, 2, 0, 3);
192  break;
193 
194  case TYPE_AC3:
195  case TYPE_MPEG1:
196  case TYPE_MP3:
197  case TYPE_MPEG2:
198  case TYPE_AACLC:
199  case TYPE_DTS:
200  case TYPE_ATRAC:
201  a->max_bitrate = GRAB_BITS(buf, 2, 0, 8);
202  a->max_bitrate *= 8000;
203  break;
204 
205  case TYPE_SACD:
206  case TYPE_EAC3:
207  case TYPE_DTS_HD:
208  case TYPE_MLP:
209  case TYPE_DST:
210  break;
211 
212  case TYPE_WMAPRO:
213  a->profile = GRAB_BITS(buf, 2, 0, 3);
214  break;
215 
216  case TYPE_REF_CXT:
217  a->format = GRAB_BITS(buf, 2, 3, 5);
218  if (a->format == XTYPE_HE_REF_CT ||
220  {
221  VBAUDIO(QString("audio coding xtype %1 not expected")
222  .arg(a->format));
223  a->format = 0;
224  }
225  else
226  {
228  }
229  break;
230  }
231 }
232 
233 int eld::update_eld(const char *buf, int size)
234 {
235  int mnl = 0;
236 
237  m_e.eld_ver = GRAB_BITS(buf, 0, 3, 5);
238  if (m_e.eld_ver != ELD_VER_CEA_861D &&
240  {
241  VBAUDIO(QString("Unknown ELD version %1").arg(m_e.eld_ver));
242  goto out_fail;
243  }
244 
245  m_e.eld_size = size;
246  m_e.baseline_len = GRAB_BITS(buf, 2, 0, 8);
247  mnl = GRAB_BITS(buf, 4, 0, 5);
248  m_e.cea_edid_ver = GRAB_BITS(buf, 4, 5, 3);
249 
250  m_e.support_hdcp = GRAB_BITS(buf, 5, 0, 1);
251  m_e.support_ai = GRAB_BITS(buf, 5, 1, 1);
252  m_e.conn_type = GRAB_BITS(buf, 5, 2, 2);
253  m_e.sad_count = GRAB_BITS(buf, 5, 4, 4);
254 
255  m_e.aud_synch_delay = GRAB_BITS(buf, 6, 0, 8) * 2;
256  m_e.spk_alloc = GRAB_BITS(buf, 7, 0, 7);
257 
258  m_e.port_id = qFromLittleEndian<quint64>(buf + 8);
259 
260  /* not specified, but the spec's tendency is little endian */
261  m_e.manufacture_id = qFromLittleEndian<quint16>(buf + 16);
262  m_e.product_id = qFromLittleEndian<quint16>(buf + 18);
263 
264  if (ELD_FIXED_BYTES + mnl > size)
265  {
266  VBAUDIO(QString("out of range MNL %1").arg(mnl));
267  goto out_fail;
268  }
269  else
270  {
271  std::string tmp(buf + ELD_FIXED_BYTES, mnl);
272  m_e.monitor_name = QString::fromStdString(tmp);
273  }
274 
275  for (int i = 0; i < m_e.sad_count; i++)
276  {
277  if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size)
278  {
279  VBAUDIO(QString("out of range SAD %1").arg(i));
280  goto out_fail;
281  }
282  update_sad(i, buf + ELD_FIXED_BYTES + mnl + (3 * static_cast<ptrdiff_t>(i)));
283  }
284 
285  /*
286  * Assume the highest speakers configuration
287  */
288  if (!m_e.spk_alloc)
289  m_e.spk_alloc = 0xffff;
290 
291  m_e.eld_valid = true;
292  return 0;
293 
294  out_fail:
295  m_e.eld_valid = false;
296  return -1;
297 }
298 
303 QString eld::print_pcm_rates(int pcm)
304 {
305  static const std::array<const uint32_t,12> rates {
306  5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200,
307  96000, 176400, 192000 };
308  QString result = QString();
309 
310  for (size_t i = 0; i < rates.size(); i++)
311  {
312  if ((pcm & (1 << i)) != 0)
313  {
314  result += QString(" %1").arg(rates[i]);
315  }
316  }
317  return result;
318 }
319 
324 QString eld::print_pcm_bits(int pcm)
325 {
326  static const std::array<const uint8_t,3> bits { 16, 20, 24 };
327  QString result = QString();
328 
329  for (size_t i = 0; i < bits.size(); i++)
330  {
331  if ((pcm & (1 << i)) != 0)
332  {
333  result += QString(" %1").arg(bits[i]);
334  }
335  }
336  return result;
337 }
338 
339 QString eld::sad_desc(int index)
340 {
341  cea_sad *a = m_e.sad + index;
342  if (!a->format)
343  return "";
344 
345  QString buf = print_pcm_rates(a->rates);
346  QString buf2 = ", bits =";
347 
348  if (a->format == TYPE_LPCM)
349  buf2 += print_pcm_bits(a->sample_bits);
350  else if (a->max_bitrate)
351  buf2 = QString(", max bitrate = %1").arg(a->max_bitrate);
352  else
353  buf2 = "";
354 
355  return QString("supports coding type %1:"
356  " channels = %2, rates =%3%4")
357  .arg(audiotype_names[a->format], QString::number(a->channels),
358  buf, buf2);
359 }
360 
362 {
363  QString result = QString();
364 
365  for (size_t i = 0; i < cea_speaker_allocation_names.size(); i++)
366  {
367  if ((m_e.spk_alloc & (1 << i)) != 0)
368  {
369  result += QString(" %1").arg(cea_speaker_allocation_names[i]);
370  }
371  }
372  return result;
373 }
374 
375 QString eld::eld_version_name() const
376 {
377  switch (m_e.eld_ver)
378  {
379  case 2: return "CEA-861D or below";
380  case 31: return "partial";
381  default: return "reserved";
382  }
383 }
384 
385 QString eld::edid_version_name() const
386 {
387  switch (m_e.cea_edid_ver)
388  {
389  case 0: return "no CEA EDID Timing Extension block present";
390  case 1: return "CEA-861";
391  case 2: return "CEA-861-A";
392  case 3: return "CEA-861-B, C or D";
393  default: return "reserved";
394  }
395 }
396 
397 QString eld::info_desc() const
398 {
399  QString result = QString("manufacture_id\t\t0x%1\n")
400  .arg(m_e.manufacture_id, 0, 16);
401  result += QString("product_id\t\t0x%1\n").arg(m_e.product_id, 0, 16);
402  result += QString("port_id\t\t\t0x%1\n").arg((long long)m_e.port_id);
403  result += QString("support_hdcp\t\t%1\n").arg(m_e.support_hdcp);
404  result += QString("support_ai\t\t%1\n").arg(m_e.support_ai);
405  result += QString("audio_sync_delay\t%1\n").arg(m_e.aud_synch_delay);
406  result += QString("sad_count\t\t%1\n").arg(m_e.sad_count);
407  return result;
408 }
409 
410 bool eld::isValid() const
411 {
412  return m_e.eld_valid;
413 }
414 
415 void eld::show()
416 {
417  if (!isValid())
418  {
419  VBAUDIO("Invalid ELD");
420  return;
421  }
422  VBAUDIO(QString("Detected monitor %1 at connection type %2")
423  .arg(product_name().simplified(), connection_name()));
424 
425  if (m_e.spk_alloc)
426  {
427  VBAUDIO(QString("available speakers:%1")
428  .arg(channel_allocation_desc()));
429  }
430  VBAUDIO(QString("max LPCM channels = %1").arg(maxLPCMChannels()));
431  VBAUDIO(QString("max channels = %1").arg(maxChannels()));
432  VBAUDIO(QString("supported codecs = %1").arg(codecs_desc()));
433  for (int i = 0; i < m_e.sad_count; i++)
434  {
435  VBAUDIO(sad_desc(i));
436  }
437 }
438 
439 QString eld::product_name() const
440 {
441  return m_e.monitor_name;
442 }
443 
444 QString eld::connection_name() const
445 {
447 }
448 
450 {
451  int channels = 2; // assume stereo at the minimum
452  for (int i = 0; i < m_e.sad_count; i++)
453  {
454  struct cea_sad *a = m_e.sad + i;
455  if (a->format == TYPE_LPCM)
456  {
457  channels = std::max(a->channels, channels);
458  }
459  }
460  return channels;
461 }
462 
464 {
465  int channels = 2; // assume stereo at the minimum
466  for (int i = 0; i < m_e.sad_count; i++)
467  {
468  struct cea_sad *a = m_e.sad + i;
469  channels = std::max(a->channels, channels);
470  }
471  return channels;
472 }
473 
474 QString eld::codecs_desc() const
475 {
476  QString result = QString();
477  bool found_one = false;
478  for (size_t i = 0; i < audiotype_names.size(); i++)
479  {
480  if ((m_e.formats & (1 << i)) != 0)
481  {
482  if (found_one)
483  result += ", ";
484  result += audiotype_names[i];
485  found_one = true;
486  }
487  }
488  return result;
489 }
eld::eld_data::spk_alloc
int spk_alloc
Definition: eldutils.h:119
SNDRV_PCM_RATE_48000
@ SNDRV_PCM_RATE_48000
Definition: eldutils.cpp:122
VBAUDIO
#define VBAUDIO(str)
Definition: audiooutputbase.h:20
SNDRV_PCM_RATE_22050
@ SNDRV_PCM_RATE_22050
Definition: eldutils.cpp:119
eld::TYPE_WMAPRO
@ TYPE_WMAPRO
Definition: eldutils.h:72
SNDRV_PCM_RATE_176400
@ SNDRV_PCM_RATE_176400
Definition: eldutils.cpp:126
ELD_FIXED_BYTES
static constexpr uint8_t ELD_FIXED_BYTES
Definition: eldutils.h:30
eld::show
void show()
Definition: eldutils.cpp:415
eld::TYPE_HE_AAC
@ TYPE_HE_AAC
Definition: eldutils.h:75
eld::eld_data::conn_type
int conn_type
Definition: eldutils.h:117
eld::connection_name
QString connection_name() const
Definition: eldutils.cpp:444
SNDRV_PCM_RATE_5512
@ SNDRV_PCM_RATE_5512
Definition: eldutils.cpp:115
eld::TYPE_DTS
@ TYPE_DTS
Definition: eldutils.h:65
eld::cea_sad::profile
int profile
Definition: eldutils.h:98
eld
Definition: eldutils.h:37
eld::eld_data::sad_count
int sad_count
Definition: eldutils.h:120
SNDRV_PCM_RATE_88200
@ SNDRV_PCM_RATE_88200
Definition: eldutils.cpp:124
ELD_VER_CEA_861D
@ ELD_VER_CEA_861D
Definition: eldutils.cpp:41
eld::cea_sad::format
int format
Definition: eldutils.h:94
eld::m_e
eld_data m_e
Definition: eldutils.h:125
eld::maxLPCMChannels
int maxLPCMChannels()
Definition: eldutils.cpp:449
SNDRV_PCM_RATE_11025
@ SNDRV_PCM_RATE_11025
Definition: eldutils.cpp:117
XTYPE_FIRST_RESERVED
@ XTYPE_FIRST_RESERVED
Definition: eldutils.cpp:81
eld::print_pcm_rates
static QString print_pcm_rates(int pcm)
SNDRV_PCM_RATE_* and AC_PAR_PCM values don't match, print correct rates with hdmi-specific routine.
Definition: eldutils.cpp:303
GRAB_BITS
static int GRAB_BITS(const char *buf, size_t byte, uint8_t lowbit, uint8_t bits)
Definition: eldutils.cpp:142
SNDRV_PCM_RATE_16000
@ SNDRV_PCM_RATE_16000
Definition: eldutils.cpp:118
eld::TYPE_LPCM
@ TYPE_LPCM
Definition: eldutils.h:59
eld::eld_data::support_ai
int support_ai
Definition: eldutils.h:116
XTYPE_HE_REF_CT
@ XTYPE_HE_REF_CT
Definition: eldutils.cpp:77
eld::TYPE_REF_STREAM_HEADER
@ TYPE_REF_STREAM_HEADER
Definition: eldutils.h:58
eldutils.h
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
CEA_EDID_VER_NONE
@ CEA_EDID_VER_NONE
Definition: eldutils.cpp:47
eld::TYPE_MLP
@ TYPE_MLP
Definition: eldutils.h:70
SNDRV_PCM_RATE_32000
@ SNDRV_PCM_RATE_32000
Definition: eldutils.cpp:120
eld::cea_sad::rates
int rates
Definition: eldutils.h:95
eld::TYPE_AACLC
@ TYPE_AACLC
Definition: eldutils.h:64
eld::update_eld
int update_eld(const char *buf, int size)
Definition: eldutils.cpp:233
eld::update_sad
void update_sad(int index, const char *buf)
Definition: eldutils.cpp:165
cea_sampling_frequencies
static const std::array< const int, 8 > cea_sampling_frequencies
Definition: eldutils.cpp:130
eld::eld
eld()
Definition: eldutils.cpp:151
CEA_EDID_VER_CEA861BCD
@ CEA_EDID_VER_CEA861BCD
Definition: eldutils.cpp:50
XTYPE_HE_AAC
@ XTYPE_HE_AAC
Definition: eldutils.cpp:78
eld::eld_data::eld_ver
int eld_ver
Definition: eldutils.h:108
eld::TYPE_ATRAC
@ TYPE_ATRAC
Definition: eldutils.h:66
eld::cea_sad::sample_bits
int sample_bits
Definition: eldutils.h:96
cea_audio_coding_xtypes
cea_audio_coding_xtypes
Definition: eldutils.cpp:75
eld::operator=
eld & operator=(const eld &)
Definition: eldutils.cpp:157
XTYPE_HE_AAC2
@ XTYPE_HE_AAC2
Definition: eldutils.cpp:79
eld::eld_data::manufacture_id
int manufacture_id
Definition: eldutils.h:111
SNDRV_PCM_RATE_44100
@ SNDRV_PCM_RATE_44100
Definition: eldutils.cpp:121
eld::eld_data::formats
uint64_t formats
Definition: eldutils.h:114
eld::TYPE_SACD
@ TYPE_SACD
Definition: eldutils.h:67
eld::maxChannels
int maxChannels()
Definition: eldutils.cpp:463
eld::product_name
QString product_name() const
Definition: eldutils.cpp:439
eld::eld_data::port_id
uint64_t port_id
Definition: eldutils.h:113
eld_versions
eld_versions
Definition: eldutils.cpp:39
SNDRV_PCM_RATE_64000
@ SNDRV_PCM_RATE_64000
Definition: eldutils.cpp:123
eld::TYPE_DST
@ TYPE_DST
Definition: eldutils.h:71
eld::eld_data::baseline_len
int baseline_len
Definition: eldutils.h:107
eld::print_pcm_bits
static QString print_pcm_bits(int pcm)
Print the supported PCM fmt bits to the string buffer.
Definition: eldutils.cpp:324
eld::channel_allocation_desc
QString channel_allocation_desc() const
Definition: eldutils.cpp:361
eld::edid_version_name
QString edid_version_name() const
Definition: eldutils.cpp:385
eld::eld_data::eld_valid
bool eld_valid
Definition: eldutils.h:105
eld::TYPE_AC3
@ TYPE_AC3
Definition: eldutils.h:60
eld_connection_type_names
static const std::array< const QString, 4 > eld_connection_type_names
Definition: eldutils.cpp:68
eld::TYPE_DTS_HD
@ TYPE_DTS_HD
Definition: eldutils.h:69
audiooutputbase.h
eld::TYPE_REF_CXT
@ TYPE_REF_CXT
Definition: eldutils.h:73
eld::TYPE_MPEG1
@ TYPE_MPEG1
Definition: eldutils.h:61
SNDRV_PCM_RATE_96000
@ SNDRV_PCM_RATE_96000
Definition: eldutils.cpp:125
XTYPE_MPEG_SURROUND
@ XTYPE_MPEG_SURROUND
Definition: eldutils.cpp:80
eld::TYPE_EAC3
@ TYPE_EAC3
Definition: eldutils.h:68
eld::eld_data::eld_size
int eld_size
Definition: eldutils.h:106
cea_speaker_allocation_names
static const std::array< const QString, 11 > cea_speaker_allocation_names
Definition: eldutils.cpp:54
eld::eld_version_name
QString eld_version_name() const
Definition: eldutils.cpp:375
uint16_t
unsigned short uint16_t
Definition: iso6937tables.h:3
eld::TYPE_MPEG2
@ TYPE_MPEG2
Definition: eldutils.h:63
eld::eld_data::monitor_name
QString monitor_name
Definition: eldutils.h:110
eld::eld_data::support_hdcp
int support_hdcp
Definition: eldutils.h:115
CEA_EDID_VER_CEA861A
@ CEA_EDID_VER_CEA861A
Definition: eldutils.cpp:49
eld::cea_sad
Definition: eldutils.h:92
audiotype_names
static const std::array< const QString, 18 > audiotype_names
Definition: eldutils.cpp:84
eld::eld_data::product_id
int product_id
Definition: eldutils.h:112
eld::cea_sad::max_bitrate
int max_bitrate
Definition: eldutils.h:97
eld::eld_data::cea_edid_ver
int cea_edid_ver
Definition: eldutils.h:109
SNDRV_PCM_RATE_8000
@ SNDRV_PCM_RATE_8000
Definition: eldutils.cpp:116
eld::codecs_desc
QString codecs_desc() const
Definition: eldutils.cpp:474
cea_edid_versions
cea_edid_versions
Definition: eldutils.cpp:45
eld::eld_data::aud_synch_delay
int aud_synch_delay
Definition: eldutils.h:118
eld::isValid
bool isValid() const
Definition: eldutils.cpp:410
eld::sad_desc
QString sad_desc(int index)
Definition: eldutils.cpp:339
eld::TYPE_MP3
@ TYPE_MP3
Definition: eldutils.h:62
SNDRV_PCM_RATE_192000
@ SNDRV_PCM_RATE_192000
Definition: eldutils.cpp:127
CEA_EDID_VER_RESERVED
@ CEA_EDID_VER_RESERVED
Definition: eldutils.cpp:51
ELD_VER_PARTIAL
@ ELD_VER_PARTIAL
Definition: eldutils.cpp:42
CEA_EDID_VER_CEA861
@ CEA_EDID_VER_CEA861
Definition: eldutils.cpp:48
eld::info_desc
QString info_desc() const
Definition: eldutils.cpp:397
eld::eld_data::sad
struct cea_sad sad[ELD_MAX_SAD]
Definition: eldutils.h:122
eld::cea_sad::channels
int channels
Definition: eldutils.h:93