[igt-dev] [RFC PATCH 1/3] lib/igt_infoframe: new library

Simon Ser simon.ser at intel.com
Tue Jul 16 11:58:12 UTC 2019


This commit introduces a new igt_infoframe library, used to parse InfoFrames.
For now only audio InfoFrames are supported. Support for AVI and other types of
InfoFrames is planned (and will come with the matching tests).

Unlike igt_edid, InfoFrames are parsed into a higher-level user-friendly
struct.

Signed-off-by: Simon Ser <simon.ser at intel.com>
---
 lib/Makefile.sources |  2 +
 lib/igt_infoframe.c  | 94 ++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_infoframe.h  | 64 ++++++++++++++++++++++++++++++
 lib/meson.build      |  1 +
 4 files changed, 161 insertions(+)
 create mode 100644 lib/igt_infoframe.c
 create mode 100644 lib/igt_infoframe.h

diff --git a/lib/Makefile.sources b/lib/Makefile.sources
index e16de86eaa08..cf094ab89ac3 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 000000000000..7e4fb45881a6
--- /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 at 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 000000000000..35daa3ea169d
--- /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 at 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 157624e71952..221ae28c084b 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 = [
-- 
2.22.0



More information about the igt-dev mailing list