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