-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbytestream.c
More file actions
127 lines (93 loc) · 2.95 KB
/
bytestream.c
File metadata and controls
127 lines (93 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// bytestream.c
//
// Author: Luke van der Hoeven
// Date: 7/5/12
#include <time.h>
#include "bytestream.h"
sc_bytestream_header create_header(uint8_t type) {
return create_header_with_time(type, time(NULL) * SC_TimeBase);
}
sc_bytestream_header create_header_with_time(uint8_t type, sc_time timestamp) {
sc_bytestream_header header = {(uint16_t)type, timestamp};
return header;
}
tpl_bin create_body(void *addr, int sz) {
tpl_bin body;
body.addr = addr;
body.sz = sz;
return body;
}
sc_bytestream_packet sc_bytestream_put_start(int fd) {
sc_bytestream_packet packet = {create_header(START), create_body(NULL, 0)};
serialize_packet(fd, packet);
return packet;
}
sc_bytestream_packet sc_bytestream_put_stop(int fd) {
sc_bytestream_packet packet = {create_header(STOP), create_body(NULL, 0)};
serialize_packet(fd, packet);
return packet;
}
sc_bytestream_packet sc_bytestream_put_mouse_data(int fd, sc_mouse_coords coords) {
sc_bytestream_packet packet = {create_header(MOUSE), create_body(&coords, sizeof(coords))};
serialize_packet(fd, packet);
return packet;
}
sc_mouse_coords sc_bytestream_get_mouse_data(int fd) {
sc_bytestream_packet packet = deserialize_packet(fd);
return parse_mouse_coords(packet);
}
sc_bytestream_packet sc_bytestream_put_frame(int fd, sc_frame frame, sc_time timestamp) {
sc_bytestream_packet packet = {create_header_with_time(VIDEO, timestamp), create_body(frame.framePtr, frame.size)};
serialize_packet(fd, packet);
return packet;
}
sc_frame sc_bytestream_get_frame(int fd) {
sc_bytestream_packet packet = deserialize_packet(fd);
return parse_frame(packet);
}
sc_bytestream_packet sc_bytestream_get_event(int fd) {
sc_bytestream_packet packet = deserialize_packet(fd);
return packet;
}
sc_bytestream_header sc_bytestream_get_event_header(int fd) {
sc_bytestream_packet packet = sc_bytestream_get_event(fd);
return packet.header;
}
// ENCODING/DECODING HELPERS
sc_mouse_coords parse_mouse_coords(sc_bytestream_packet packet) {
void *data = packet.body.addr;
sc_mouse_coords coords = *((sc_mouse_coords *) data);
// free(data);
return coords;
}
sc_frame parse_frame(sc_bytestream_packet packet) {
void *data = packet.body.addr;
sc_frame frame = {(uint8_t *) data, packet.body.sz};
// free(data);
return frame;
}
void serialize_packet(int fd, sc_bytestream_packet packet) {
tpl_node *tn = tpl_map(TPL_STRUCTURE, &packet.header, &packet.body);
tpl_pack(tn, 0);
tpl_dump(tn, TPL_FD, fd);
tpl_free(tn);
}
sc_bytestream_packet deserialize_packet(int fd) {
sc_bytestream_packet packet;
sc_bytestream_header header;
tpl_bin data = {NULL, 0};
tpl_node *tn = tpl_map(TPL_STRUCTURE, &header, &data);
int loaded = tpl_load(tn, TPL_FD, fd);
if( loaded == -1 ) {
packet.header = create_header(NO_DATA);
} else {
tpl_unpack(tn, 0);
packet.header = header;
}
packet.body = data;
tpl_free(tn);
if(data.addr != NULL) {
free(data.addr);
}
return packet;
}