Files
squeezelite-esp32/components/spotify/cspot/bell/src/audio/container/WebmUtils.cpp
2022-11-17 14:06:00 -08:00

68 lines
1.3 KiB
C++

// Copyright (c) Kuba Szczodrzyński 2022-1-16.
#include "WebmContainer.h"
uint32_t WebmContainer::readVarNum32(bool raw) {
uint32_t result = readUint8();
if (!result) {
closed = true;
return 0;
}
uint8_t len = 0;
for (; !(result >> (7 - len)); len++) {}
if (!raw)
result &= ~(1 << (7 - len));
for (uint8_t i = 0; i < len; i++) {
result <<= 8;
result |= readUint8();
}
return result;
}
uint64_t WebmContainer::readVarNum64() {
uint64_t result = readUint8();
if (!result) {
closed = true;
return 0;
}
uint8_t len = 0;
for (; !(result >> (7 - len)); len++) {}
result &= ~(1 << (7 - len));
for (uint8_t i = 0; i < len; i++) {
result <<= 8;
result |= readUint8();
}
return result;
}
uint32_t WebmContainer::readUint(uint8_t len) {
if (len >= 4) {
skipBytes(len - 4);
return readUint32();
}
if (len == 3)
return readUint24();
if (len == 2)
return readUint16();
return readUint8();
}
uint64_t WebmContainer::readUlong(uint8_t len) {
if (len == 8)
return readUint64();
return readUint(len);
}
float WebmContainer::readFloat(uint8_t len) {
double result = 0;
auto *b = (uint8_t *)&result;
for (uint8_t i = 0; i < len; i++)
b[len - i - 1] = readUint8();
return (float)result;
}
void WebmContainer::readElem() {
eid = (ElementId)readVarNum32(true);
esize = readVarNum32();
}