• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef CTA_H
2 #define CTA_H
3 
4 /**
5  * Private header for the low-level CTA API.
6  */
7 
8 #include <stdbool.h>
9 #include <stddef.h>
10 #include <stdint.h>
11 
12 #include <libdisplay-info/cta.h>
13 #include <displayid.h>
14 
15 /**
16  * The maximum number of data blocks in an EDID CTA block.
17  *
18  * Each data block takes at least 1 byte, the CTA block can hold 128 bytes, and
19  * the mandatory fields take up 5 bytes (4 header bytes + checksum).
20  */
21 #define EDID_CTA_MAX_DATA_BLOCKS 123
22 /**
23  * The maximum number of detailed timing definitions included in an EDID CTA
24  * block.
25  *
26  * The CTA extension leaves at most 122 bytes for timings, and each timing takes
27  * 18 bytes.
28  */
29 #define EDID_CTA_MAX_DETAILED_TIMING_DEFS 6
30 /**
31  * The maximum number of SVD entries in a video data block.
32  *
33  * Each data block has its size described in a 5-bit field, so its maximum size
34  * is 63 bytes, and each SVD uses 1 byte.
35  */
36 #define EDID_CTA_MAX_VIDEO_BLOCK_ENTRIES 63
37 /**
38  * The maximum number of SAD entries in an audio data block.
39  *
40  * Each data block has its size described in a 5-bit field, so its maximum size
41  * is 63 bytes, and each SAD uses 3 bytes.
42  */
43 #define EDID_CTA_MAX_AUDIO_BLOCK_ENTRIES 21
44 /**
45  * The maximum number of Capability Bit Map entries in a YCbCr 4:2:0 video data
46  * block.
47  *
48  * Each data block has its size described in a 5-bit field, so its maximum size
49  * is 63 bytes, and each Capability Bit Map uses 1 byte.
50  */
51 #define EDID_CTA_MAX_YCBCR420_CAP_MAP_BLOCK_ENTRIES 63
52 /**
53  * The maximum number of Short InfoFrame Descriptor or Short Vendor-Specific
54  * InfoFrame Descriptor entries in a InfoFrame data block.
55  *
56  * Each data block has its size described in a 5-bit field, so its maximum size
57  * is 63 bytes, the header takes up at least 2 bytes and the smallest Short
58  * InfoFrame Descriptor is 1 byte.
59  */
60 #define EDID_CTA_INFOFRAME_BLOCK_ENTRIES 61
61 /**
62  * The maximum number of Speaker Location Descriptors in a Speaker Location data
63  * block.
64  *
65  * Each data block has its size described in a 5-bit field, so its maximum size
66  * is 63 bytes, and each Speaker Location Descriptors uses at least 2 byte.
67  */
68 #define EDID_CTA_MAX_SPEAKER_LOCATION_BLOCK_ENTRIES 31
69 /**
70  * The maximum number of SVR entries in a video format preference block.
71  *
72  * Each data block has its size described in a 5-bit field, so its maximum size
73  * is 63 bytes, and each SVR uses 1 byte.
74  */
75 #define EDID_CTA_MAX_VIDEO_FORMAT_PREF_BLOCK_ENTRIES 63
76 /**
77  * The maximum number of format entries in a HDMI audio block.
78  *
79  * Each data block has its size described in a 5-bit field, so its maximum size
80  * is 63 bytes, the header takes up 2 bytes and each format entry uses 4 bytes.
81  */
82 #define EDID_CTA_MAX_HDMI_AUDIO_BLOCK_ENTRIES 15
83 
84 struct di_edid_cta {
85 	int revision;
86 	struct di_edid_cta_flags flags;
87 
88 	/* NULL-terminated */
89 	struct di_cta_data_block *data_blocks[EDID_CTA_MAX_DATA_BLOCKS + 1];
90 	size_t data_blocks_len;
91 
92 	/* NULL-terminated */
93 	struct di_edid_detailed_timing_def_priv *detailed_timing_defs[EDID_CTA_MAX_DETAILED_TIMING_DEFS + 1];
94 	size_t detailed_timing_defs_len;
95 
96 	struct di_logger *logger;
97 };
98 
99 struct di_cta_hdr_static_metadata_block_priv {
100 	struct di_cta_hdr_static_metadata_block base;
101 	struct di_cta_hdr_static_metadata_block_eotfs eotfs;
102 	struct di_cta_hdr_static_metadata_block_descriptors descriptors;
103 };
104 
105 struct di_cta_hdr_dynamic_metadata_block_type3 {
106 	uint8_t unused;
107 };
108 
109 struct di_cta_hdr_dynamic_metadata_block_priv {
110 	struct di_cta_hdr_dynamic_metadata_block base;
111 	struct di_cta_hdr_dynamic_metadata_block_type1 type1;
112 	struct di_cta_hdr_dynamic_metadata_block_type2 type2;
113 	struct di_cta_hdr_dynamic_metadata_block_type3 type3;
114 	struct di_cta_hdr_dynamic_metadata_block_type4 type4;
115 	struct di_cta_hdr_dynamic_metadata_block_type256 type256;
116 };
117 
118 struct di_cta_video_block {
119 	/* NULL-terminated */
120 	struct di_cta_svd *svds[EDID_CTA_MAX_VIDEO_BLOCK_ENTRIES + 1];
121 	size_t svds_len;
122 };
123 
124 struct di_cta_sad_priv {
125 	struct di_cta_sad base;
126 	struct di_cta_sad_sample_rates supported_sample_rates;
127 	struct di_cta_sad_lpcm lpcm;
128 	struct di_cta_sad_mpegh_3d mpegh_3d;
129 	struct di_cta_sad_mpeg_aac mpeg_aac;
130 	struct di_cta_sad_mpeg_surround mpeg_surround;
131 	struct di_cta_sad_mpeg_aac_le mpeg_aac_le;
132 	struct di_cta_sad_enhanced_ac3 enhanced_ac3;
133 	struct di_cta_sad_mat mat;
134 	struct di_cta_sad_wma_pro wma_pro;
135 };
136 
137 struct di_cta_audio_block {
138 	/* NULL-terminated */
139 	struct di_cta_sad_priv *sads[EDID_CTA_MAX_AUDIO_BLOCK_ENTRIES + 1];
140 	size_t sads_len;
141 };
142 
143 struct di_cta_ycbcr420_cap_map {
144 	bool all;
145 	uint8_t svd_bitmap[EDID_CTA_MAX_YCBCR420_CAP_MAP_BLOCK_ENTRIES];
146 };
147 
148 
149 struct di_cta_hdmi_audio_block_priv {
150 	struct di_cta_hdmi_audio_block base;
151 	struct di_cta_hdmi_audio_multi_stream ms;
152 	struct di_cta_hdmi_audio_3d a3d;
153 	/* NULL-terminated */
154 	struct di_cta_sad_priv *sads[EDID_CTA_MAX_HDMI_AUDIO_BLOCK_ENTRIES + 1];
155 	size_t sads_len;
156 };
157 
158 struct di_cta_infoframe_block_priv {
159 	struct di_cta_infoframe_block block;
160 	struct di_cta_infoframe_descriptor *infoframes[EDID_CTA_INFOFRAME_BLOCK_ENTRIES + 1];
161 	size_t infoframes_len;
162 };
163 
164 struct di_cta_speaker_location_block {
165 	/* NULL-terminated */
166 	struct di_cta_speaker_locations *locations[EDID_CTA_MAX_SPEAKER_LOCATION_BLOCK_ENTRIES + 1];
167 	size_t locations_len;
168 };
169 
170 struct di_cta_video_format_pref_block {
171 	/* NULL-terminated */
172 	struct di_cta_svr *svrs[EDID_CTA_MAX_VIDEO_FORMAT_PREF_BLOCK_ENTRIES + 1];
173 	size_t svrs_len;
174 };
175 
176 struct di_cta_data_block {
177 	enum di_cta_data_block_tag tag;
178 
179 	/* Used for DI_CTA_DATA_BLOCK_VIDEO */
180 	struct di_cta_video_block video;
181 	/* Used for DI_CTA_DATA_BLOCK_YCBCR420 */
182 	struct di_cta_video_block ycbcr420;
183 	/* used for DI_CTA_DATA_BLOCK_AUDIO */
184 	struct di_cta_audio_block audio;
185 	/* Used for DI_CTA_DATA_BLOCK_SPEAKER_ALLOC */
186 	struct di_cta_speaker_alloc_block speaker_alloc;
187 	/* Used for DI_CTA_DATA_BLOCK_VIDEO_CAP */
188 	struct di_cta_video_cap_block video_cap;
189 	/* Used for DI_CTA_DATA_BLOCK_VESA_DISPLAY_DEVICE */
190 	struct di_cta_vesa_dddb vesa_dddb;
191 	/* Used for DI_CTA_DATA_BLOCK_COLORIMETRY */
192 	struct di_cta_colorimetry_block colorimetry;
193 	/* Used for DI_CTA_DATA_BLOCK_HDR_STATIC_METADATA */
194 	struct di_cta_hdr_static_metadata_block_priv hdr_static_metadata;
195 	/* Used for DI_CTA_DATA_BLOCK_HDR_DYNAMIC_METADATA */
196 	struct di_cta_hdr_dynamic_metadata_block_priv hdr_dynamic_metadata;
197 	/* Used for DI_CTA_DATA_BLOCK_VESA_DISPLAY_TRANSFER_CHARACTERISTIC */
198 	struct di_cta_vesa_transfer_characteristics vesa_transfer_characteristics;
199 	/* Used for DI_CTA_DATA_BLOCK_YCBCR420_CAP_MAP */
200 	struct di_cta_ycbcr420_cap_map ycbcr420_cap_map;
201 	/* Used for DI_CTA_DATA_BLOCK_HDMI_AUDIO */
202 	struct di_cta_hdmi_audio_block_priv hdmi_audio;
203 	/* Used for DI_CTA_DATA_BLOCK_INFOFRAME */
204 	struct di_cta_infoframe_block_priv infoframe;
205 	/* Used for DI_CTA_DATA_BLOCK_ROOM_CONFIG */
206 	struct di_cta_room_configuration room_config;
207 	/* Used for DI_CTA_DATA_BLOCK_SPEAKER_LOCATION */
208 	struct di_cta_speaker_location_block speaker_location;
209 	/* Used for DI_CTA_DATA_BLOCK_VIDEO_FORMAT_PREF */
210 	struct di_cta_video_format_pref_block video_format_pref;
211 	/* Used for DI_CTA_DATA_BLOCK_DISPLAYID_VIDEO_TIMING_VII */
212 	struct di_displayid_type_i_ii_vii_timing did_vii_timing;
213 };
214 
215 extern const struct di_cta_video_format _di_cta_video_formats[];
216 extern const size_t _di_cta_video_formats_len;
217 
218 bool
219 _di_edid_cta_parse(struct di_edid_cta *cta, const uint8_t *data, size_t size,
220 		   struct di_logger *logger);
221 
222 void
223 _di_edid_cta_finish(struct di_edid_cta *cta);
224 
225 #endif
226