Status updates
This commit is contained in:
parent
126f8d0ba6
commit
7fd717d75e
52
main2.c
52
main2.c
@ -10,6 +10,7 @@
|
|||||||
#include<sys/types.h>
|
#include<sys/types.h>
|
||||||
#include<fcntl.h>
|
#include<fcntl.h>
|
||||||
#include<unistd.h>
|
#include<unistd.h>
|
||||||
|
#include<time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include<stdbool.h>
|
#include<stdbool.h>
|
||||||
@ -123,13 +124,14 @@ static void transmit_all(const char *buf, size_t sz) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define WS_TXT 1
|
||||||
#define WS_BIN 2
|
#define WS_BIN 2
|
||||||
#define WS_CLOSE 8
|
#define WS_CLOSE 8
|
||||||
#define WS_FIN 128
|
#define WS_FIN 128
|
||||||
#define WS_HEADER_MAX 10
|
#define WS_HEADER_MAX 10
|
||||||
static int ws_header(size_t sz, uint8_t hdr[static WS_HEADER_MAX]) {
|
static int ws_header(size_t sz, bool binary, uint8_t hdr[static WS_HEADER_MAX]) {
|
||||||
int i;
|
int i;
|
||||||
hdr[0] = WS_BIN | WS_FIN;
|
hdr[0] = (binary ? WS_BIN : WS_TXT) | WS_FIN;
|
||||||
if(sz < 126) {
|
if(sz < 126) {
|
||||||
hdr[1] = sz;
|
hdr[1] = sz;
|
||||||
i = 2;
|
i = 2;
|
||||||
@ -154,27 +156,53 @@ static int ws_header(size_t sz, uint8_t hdr[static WS_HEADER_MAX]) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ws_send(Client *cli, const uint8_t *buf, size_t sz) {
|
static void ws_send(Client *cli, bool binary, const uint8_t *buf, size_t sz) {
|
||||||
if(sz == 0) return;
|
if(sz == 0) return;
|
||||||
|
|
||||||
uint8_t wshdr[WS_HEADER_MAX];
|
uint8_t wshdr[WS_HEADER_MAX];
|
||||||
int wshdrsz = ws_header(sz, wshdr);
|
int wshdrsz = ws_header(sz, binary, wshdr);
|
||||||
|
|
||||||
transmit(cli, wshdr, wshdrsz);
|
transmit(cli, wshdr, wshdrsz);
|
||||||
transmit(cli, buf, sz);
|
transmit(cli, buf, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ws_broadcast(const uint8_t *buf, size_t sz) {
|
static void ws_broadcast(bool binary, const uint8_t *buf, size_t sz) {
|
||||||
if(sz == 0) return;
|
if(sz == 0) return;
|
||||||
|
|
||||||
uint8_t wshdr[WS_HEADER_MAX];
|
uint8_t wshdr[WS_HEADER_MAX];
|
||||||
int wshdrsz = ws_header(sz, wshdr);
|
int wshdrsz = ws_header(sz, binary, wshdr);
|
||||||
|
|
||||||
transmit_all(wshdr, wshdrsz);
|
transmit_all(wshdr, wshdrsz);
|
||||||
transmit_all(buf, sz);
|
transmit_all(buf, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool should_send_status_update() {
|
||||||
|
static uint64_t lastSec = 0;
|
||||||
|
|
||||||
|
struct timespec tv;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &tv);
|
||||||
|
|
||||||
|
if(tv.tv_sec - lastSec < 10) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastSec = tv.tv_sec;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_status_update() {
|
||||||
|
char buf[512] = {};
|
||||||
|
snprintf(buf, sizeof(buf) - 1, "{\"status\": {\"viewer_count\": %lu}}", clientsSz);
|
||||||
|
|
||||||
|
ws_broadcast(false, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
|
||||||
static void stream_step(const uint8_t *newbuf, size_t newsz) {
|
static void stream_step(const uint8_t *newbuf, size_t newsz) {
|
||||||
|
if(should_send_status_update()) {
|
||||||
|
send_status_update();
|
||||||
|
}
|
||||||
|
|
||||||
if(Stream.state == LOADING_HEADER) {
|
if(Stream.state == LOADING_HEADER) {
|
||||||
Stream.mkvHeader = realloc(Stream.mkvHeader, Stream.mkvHeaderSz + newsz);
|
Stream.mkvHeader = realloc(Stream.mkvHeader, Stream.mkvHeaderSz + newsz);
|
||||||
memcpy(Stream.mkvHeader + Stream.mkvHeaderSz, newbuf, newsz);
|
memcpy(Stream.mkvHeader + Stream.mkvHeaderSz, newbuf, newsz);
|
||||||
@ -182,8 +210,8 @@ static void stream_step(const uint8_t *newbuf, size_t newsz) {
|
|||||||
|
|
||||||
uint8_t *clusterEl = memmem(Stream.mkvHeader, Stream.mkvHeaderSz, "\x1F\x43\xB6\x75", 4);
|
uint8_t *clusterEl = memmem(Stream.mkvHeader, Stream.mkvHeaderSz, "\x1F\x43\xB6\x75", 4);
|
||||||
if(clusterEl) {
|
if(clusterEl) {
|
||||||
ws_broadcast(Stream.mkvHeader, clusterEl - Stream.mkvHeader);
|
ws_broadcast(true, Stream.mkvHeader, clusterEl - Stream.mkvHeader);
|
||||||
ws_broadcast(clusterEl, Stream.mkvHeader + Stream.mkvHeaderSz - clusterEl);
|
ws_broadcast(true, clusterEl, Stream.mkvHeader + Stream.mkvHeaderSz - clusterEl);
|
||||||
|
|
||||||
Stream.mkvHeaderSz = clusterEl - Stream.mkvHeader;
|
Stream.mkvHeaderSz = clusterEl - Stream.mkvHeader;
|
||||||
Stream.state = STREAMING;
|
Stream.state = STREAMING;
|
||||||
@ -210,15 +238,17 @@ static void stream_step(const uint8_t *newbuf, size_t newsz) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(Stream.state == LOADING_HEADER) {
|
if(Stream.state == LOADING_HEADER) {
|
||||||
|
puts("New header");
|
||||||
|
|
||||||
if(i > 4) {
|
if(i > 4) {
|
||||||
ws_broadcast(newbuf, i - 4);
|
ws_broadcast(true, newbuf, i - 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream.mkvHeader = realloc(Stream.mkvHeader, Stream.mkvHeaderSz = 4 + (newsz - i));
|
Stream.mkvHeader = realloc(Stream.mkvHeader, Stream.mkvHeaderSz = 4 + (newsz - i));
|
||||||
memcpy(Stream.mkvHeader, "\x1A\x45\xDF\xA3", 4);
|
memcpy(Stream.mkvHeader, "\x1A\x45\xDF\xA3", 4);
|
||||||
memcpy(Stream.mkvHeader + 4, newbuf + i, newsz - i);
|
memcpy(Stream.mkvHeader + 4, newbuf + i, newsz - i);
|
||||||
} else {
|
} else {
|
||||||
ws_broadcast(newbuf, newsz);
|
ws_broadcast(true, newbuf, newsz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,7 +332,7 @@ static int handle(Client *cli) {
|
|||||||
|
|
||||||
if(Stream.state == STREAMING && Stream.mkvHeader) {
|
if(Stream.state == STREAMING && Stream.mkvHeader) {
|
||||||
printf("Sending header\n");
|
printf("Sending header\n");
|
||||||
ws_send(cli, Stream.mkvHeader, Stream.mkvHeaderSz);
|
ws_send(cli, true, Stream.mkvHeader, Stream.mkvHeaderSz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user