85 lines · c
1// SPDX-License-Identifier: MIT2#include "hdmi.h"3 4void pack_hdmi_infoframe(struct packed_hdmi_infoframe *packed_frame,5 u8 *raw_frame, ssize_t len)6{7 u32 header = 0;8 u32 subpack0_low = 0;9 u32 subpack0_high = 0;10 u32 subpack1_low = 0;11 u32 subpack1_high = 0;12 13 switch (len) {14 /*15 * "When in doubt, use brute force."16 * -- Ken Thompson.17 */18 default:19 /*20 * We presume that no valid frame is longer than 1721 * octets, including header... And truncate to that22 * if it's longer.23 */24 case 17:25 subpack1_high = (raw_frame[16] << 16);26 fallthrough;27 case 16:28 subpack1_high |= (raw_frame[15] << 8);29 fallthrough;30 case 15:31 subpack1_high |= raw_frame[14];32 fallthrough;33 case 14:34 subpack1_low = (raw_frame[13] << 24);35 fallthrough;36 case 13:37 subpack1_low |= (raw_frame[12] << 16);38 fallthrough;39 case 12:40 subpack1_low |= (raw_frame[11] << 8);41 fallthrough;42 case 11:43 subpack1_low |= raw_frame[10];44 fallthrough;45 case 10:46 subpack0_high = (raw_frame[9] << 16);47 fallthrough;48 case 9:49 subpack0_high |= (raw_frame[8] << 8);50 fallthrough;51 case 8:52 subpack0_high |= raw_frame[7];53 fallthrough;54 case 7:55 subpack0_low = (raw_frame[6] << 24);56 fallthrough;57 case 6:58 subpack0_low |= (raw_frame[5] << 16);59 fallthrough;60 case 5:61 subpack0_low |= (raw_frame[4] << 8);62 fallthrough;63 case 4:64 subpack0_low |= raw_frame[3];65 fallthrough;66 case 3:67 header = (raw_frame[2] << 16);68 fallthrough;69 case 2:70 header |= (raw_frame[1] << 8);71 fallthrough;72 case 1:73 header |= raw_frame[0];74 fallthrough;75 case 0:76 break;77 }78 79 packed_frame->header = header;80 packed_frame->subpack0_low = subpack0_low;81 packed_frame->subpack0_high = subpack0_high;82 packed_frame->subpack1_low = subpack1_low;83 packed_frame->subpack1_high = subpack1_high;84}85