summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.sources2
-rw-r--r--lib/igt_infoframe.c94
-rw-r--r--lib/igt_infoframe.h64
-rw-r--r--lib/meson.build1
4 files changed, 161 insertions, 0 deletions
diff --git a/lib/Makefile.sources b/lib/Makefile.sources
index e16de86e..cf094ab8 100644
--- a/lib/Makefile.sources
+++ b/lib/Makefile.sources
@@ -41,6 +41,8 @@ lib_source_list = \
igt_gvt.h \
igt_halffloat.c \
igt_halffloat.h \
+ igt_infoframe.c \
+ igt_infoframe.h \
igt_matrix.c \
igt_matrix.h \
igt_primes.c \
diff --git a/lib/igt_infoframe.c b/lib/igt_infoframe.c
new file mode 100644
index 00000000..7e4fb458
--- /dev/null
+++ b/lib/igt_infoframe.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors: Simon Ser <simon.ser@intel.com>
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include "igt_infoframe.h"
+
+/**
+ * SECTION:igt_infoframe
+ * @short_description: InfoFrame parsing library
+ * @title: InfoFrame
+ * @include: igt_infoframe.h
+ *
+ * This library provides helpers to parse InfoFrames as defined in CEA-861-D
+ * section 6.
+ */
+
+static const int sampling_freqs[] = {
+ -1, /* refer to stream header */
+ 33000,
+ 44100,
+ 48000,
+ 88200,
+ 96000,
+ 176400,
+ 192000,
+};
+
+static const size_t sampling_freqs_len = sizeof(sampling_freqs) / sizeof(sampling_freqs[0]);
+
+static const int sample_sizes[] = {
+ -1, /* refer to stream header */
+ 16,
+ 20,
+ 24,
+};
+
+static const size_t sample_sizes_len = sizeof(sample_sizes) / sizeof(sample_sizes[0]);
+
+bool infoframe_audio_parse(struct infoframe_audio *infoframe, int version,
+ const uint8_t *buf, size_t buf_size)
+{
+ int channel_count;
+ size_t sampling_freq_idx, sample_size_idx;
+
+ memset(infoframe, 0, sizeof(*infoframe));
+
+ if (version != 1 || buf_size < 5)
+ return false;
+
+ infoframe->coding_type = buf[0] >> 4;
+
+ channel_count = buf[0] & 0x7;
+ if (channel_count == 0)
+ infoframe->channel_count = -1;
+ else
+ infoframe->channel_count = channel_count + 1;
+
+ sampling_freq_idx = (buf[1] >> 2) & 0x7;
+ if (sampling_freq_idx >= sampling_freqs_len)
+ return false;
+ infoframe->sampling_freq = sampling_freqs[sampling_freq_idx];
+
+ sample_size_idx = buf[1] & 0x3;
+ if (sample_size_idx >= sample_sizes_len)
+ return false;
+ infoframe->sample_size = sample_sizes[sample_size_idx];
+
+ return true;
+}
diff --git a/lib/igt_infoframe.h b/lib/igt_infoframe.h
new file mode 100644
index 00000000..35daa3ea
--- /dev/null
+++ b/lib/igt_infoframe.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors: Simon Ser <simon.ser@intel.com>
+ */
+
+#ifndef IGT_INFOFRAME_H
+#define IGT_INFOFRAME_H
+
+#include "config.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+enum infoframe_audio_coding_type {
+ INFOFRAME_AUDIO_CT_UNSPECIFIED = 0, /* refer to stream header */
+ INFOFRAME_AUDIO_CT_PCM = 1, /* IEC 60958 PCM */
+ INFOFRAME_AUDIO_CT_AC3 = 2,
+ INFOFRAME_AUDIO_CT_MPEG1 = 3,
+ INFOFRAME_AUDIO_CT_MP3 = 4,
+ INFOFRAME_AUDIO_CT_MPEG2 = 5,
+ INFOFRAME_AUDIO_CT_AAC = 6,
+ INFOFRAME_AUDIO_CT_DTS = 7,
+ INFOFRAME_AUDIO_CT_ATRAC = 8,
+ INFOFRAME_AUDIO_CT_ONE_BIT = 9,
+ INFOFRAME_AUDIO_CT_DOLBY = 10, /* Dolby Digital + */
+ INFOFRAME_AUDIO_CT_DTS_HD = 11,
+ INFOFRAME_AUDIO_CT_MAT = 12,
+ INFOFRAME_AUDIO_CT_DST = 13,
+ INFOFRAME_AUDIO_CT_WMA_PRO = 14,
+};
+
+struct infoframe_audio {
+ enum infoframe_audio_coding_type coding_type;
+ int channel_count; /* -1 if unspecified */
+ int sampling_freq; /* in Hz, -1 if unspecified */
+ int sample_size; /* in bits, -1 if unspecified */
+ /* TODO: speaker allocation */
+};
+
+bool infoframe_audio_parse(struct infoframe_audio *infoframe, int version,
+ const uint8_t *buf, size_t buf_size);
+
+#endif
diff --git a/lib/meson.build b/lib/meson.build
index 157624e7..221ae28c 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -61,6 +61,7 @@ lib_sources = [
'igt_amd.c',
'igt_edid.c',
'igt_eld.c',
+ 'igt_infoframe.c',
]
lib_deps = [