27 if (len < FRAME_HEADER_SIZE_LEGACY) {
28 SET_ERRNO(ERROR_INVALID_FRAME,
"Legacy frame header too small: %zu bytes", len);
29 return ERROR_INVALID_FRAME;
34 if (err != ASCIICHAT_OK) {
38 size_t expected_total = FRAME_HEADER_SIZE_LEGACY + expected_rgb_size;
39 if (len != expected_total) {
40 SET_ERRNO(ERROR_INVALID_FRAME,
"Legacy frame length mismatch: expected %zu got %zu", expected_total, len);
41 return ERROR_INVALID_FRAME;
47asciichat_error_t
frame_validate_new(
void *data,
size_t len,
bool *out_compressed, uint32_t *out_data_size) {
49 if (len < FRAME_HEADER_SIZE_NEW) {
50 SET_ERRNO(ERROR_INVALID_FRAME,
"New frame header too small: %zu bytes", len);
51 return ERROR_INVALID_FRAME;
54 uint32_t compressed_flag, data_size;
57 size_t data_size_sz = (size_t)data_size;
60 if (data_size_sz > IMAGE_MAX_PIXELS_SIZE) {
63 SET_ERRNO(ERROR_INVALID_FRAME,
"Frame data too large: %s", size_str);
64 return ERROR_INVALID_FRAME;
69 if (err != ASCIICHAT_OK) {
73 size_t expected_total = FRAME_HEADER_SIZE_NEW + data_size_sz;
74 if (len != expected_total) {
75 SET_ERRNO(ERROR_INVALID_FRAME,
"New frame length mismatch: expected %zu got %zu", expected_total, len);
76 return ERROR_INVALID_FRAME;
80 *out_compressed = (compressed_flag != 0);
82 *out_data_size = data_size;
87 uint32_t width_net, height_net;
88 memcpy(&width_net, data, FRAME_HEADER_FIELD_SIZE);
89 memcpy(&height_net, (
char *)data + FRAME_HEADER_FIELD_SIZE, FRAME_HEADER_FIELD_SIZE);
90 *width = NET_TO_HOST_U32(width_net);
91 *height = NET_TO_HOST_U32(height_net);
95 uint32_t compressed_net, size_net;
96 memcpy(&compressed_net, (
char *)data + FRAME_HEADER_FIELD_SIZE * 2, FRAME_HEADER_FIELD_SIZE);
97 memcpy(&size_net, (
char *)data + FRAME_HEADER_FIELD_SIZE * 3, FRAME_HEADER_FIELD_SIZE);
98 *compressed = NET_TO_HOST_U32(compressed_net);
99 *data_size = NET_TO_HOST_U32(size_net);