ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
video/frame_validator.c
Go to the documentation of this file.
1#include <ascii-chat/video/frame_validator.h>
2#include <string.h>
3#include <ascii-chat/logging.h>
4
15static size_t frame_find_final_reset(const char *frame_data, size_t frame_size) {
16 if (!frame_data || frame_size < 4) {
17 return SIZE_MAX;
18 }
19
20 const char *reset_seq = "\033[0m";
21 size_t reset_len = 4;
22
23 // Search backwards from end to find LAST reset sequence
24 for (int i = (int)frame_size - (int)reset_len; i >= 0; i--) {
25 if (memcmp(&frame_data[i], reset_seq, reset_len) == 0) {
26 return (size_t)i;
27 }
28 }
29
30 return SIZE_MAX;
31}
32
33bool frame_validate_integrity(const char *frame_data, size_t frame_size) {
34 if (!frame_data || frame_size == 0) {
35 return false;
36 }
37
38 size_t reset_pos = frame_find_final_reset(frame_data, frame_size);
39 if (reset_pos == SIZE_MAX) {
40 // No reset sequence found - this is suspicious
41 log_warn("FRAME_VALIDATION: No ESC[0m reset sequence found in %zu byte frame", frame_size);
42 return false;
43 }
44
45 size_t expected_end = reset_pos + 4; // 4 bytes for ESC[0m
46
47 // Check if there's garbage after the reset
48 if (expected_end < frame_size) {
49 // Calculate how much garbage we have
50 size_t garbage_size = frame_size - expected_end;
51
52 // Check what the garbage looks like
53 const uint8_t *garbage = (const uint8_t *)&frame_data[expected_end];
54
55 // Log the garbage for debugging
56 log_warn("FRAME_VALIDATION: Found %zu garbage bytes after reset at offset %zu (frame size %zu): "
57 "[%02x %02x %02x %02x ...]",
58 garbage_size, expected_end, frame_size, garbage[0], garbage_size > 1 ? garbage[1] : 0,
59 garbage_size > 2 ? garbage[2] : 0, garbage_size > 3 ? garbage[3] : 0);
60
61 return false;
62 }
63
64 // Frame looks valid
65 log_debug("FRAME_VALIDATION: Frame OK (%zu bytes, ends at offset %zu)", frame_size, expected_end);
66 return true;
67}
68
69size_t frame_get_valid_end(const char *frame_data, size_t frame_size) {
70 if (!frame_data || frame_size < 4) {
71 return frame_size;
72 }
73
74 size_t reset_pos = frame_find_final_reset(frame_data, frame_size);
75 if (reset_pos == SIZE_MAX) {
76 return frame_size; // No reset found, assume all data is valid
77 }
78
79 return reset_pos + 4; // Return position after the reset sequence
80}
bool frame_validate_integrity(const char *frame_data, size_t frame_size)
size_t frame_get_valid_end(const char *frame_data, size_t frame_size)