handle pages with no terminated packet

This commit is contained in:
philippe44
2024-01-03 23:25:08 -08:00
parent 7902af2bf0
commit f677695fc7

View File

@@ -64,6 +64,7 @@ struct EXT_RAM_ATTR streamstate stream;
static EXT_RAM_ATTR struct {
enum { OGG_OFF, OGG_SYNC, OGG_HEADER, OGG_SEGMENTS, OGG_PAGE } state;
u32_t want, miss, match;
u64_t granule;
u8_t* data, segments[255];
#pragma pack(push, 1)
struct {
@@ -128,7 +129,6 @@ static int _poll(SSL *ssl, struct pollfd *pollinfo, int timeout) {
}
#endif
static bool send_header(void) {
char *ptr = stream.header;
int len = stream.header_len;
@@ -232,7 +232,7 @@ static void stream_ogg(size_t n) {
for (int i = 0; i < ogg.want; i++) ogg.miss += ogg.data[i];
ogg.want = ogg.miss;
if (ogg.header.granule == 0) {
if (ogg.header.granule == 0 || (ogg.header.granule == -1 && ogg.granule == 0)) {
// granule 0 means a new stream, so let's look into it
ogg.state = OGG_PAGE;
ogg.data = malloc(ogg.want);
@@ -240,6 +240,7 @@ static void stream_ogg(size_t n) {
// otherwise, jump over data
ogg.state = OGG_SYNC;
ogg.data = NULL;
ogg.granule = ogg.header.granule;
}
break;
case OGG_PAGE: {
@@ -271,6 +272,7 @@ static void stream_ogg(size_t n) {
stream.header[stream.header_len++] = len;
memcpy(stream.header + stream.header_len, p, len);
stream.header_len += len;
LOG_INFO("metadata: %.*s", len, p);
}
}
@@ -280,6 +282,7 @@ static void stream_ogg(size_t n) {
break;
}
free(ogg.data);
ogg.data = NULL;
ogg.state = OGG_SYNC;
break;
}