diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Makefile.sources | 2 | ||||
| -rw-r--r-- | lib/igt_infoframe.c | 94 | ||||
| -rw-r--r-- | lib/igt_infoframe.h | 64 | ||||
| -rw-r--r-- | lib/meson.build | 1 |
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 = [ |
