obs-studio/build_dependencies/aja/include/ajalibraries/ajabase/common/bytestream.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

233 lines
4.6 KiB
C++

/* SPDX-License-Identifier: MIT */
/**
@file bytestream.h
@brief Declaration of AJAByteStream class.
@copyright (C) 2012-2021 AJA Video Systems, Inc. All rights reserved.
**/
#ifndef AJA_BYTESTREAM_H
#define AJA_BYTESTREAM_H
#include <stddef.h>
#include <string.h>
#include "ajabase/common/types.h"
class AJAByteStream {
public:
AJAByteStream(void *buf = NULL, size_t pos = 0);
size_t Pos() const;
void *Buffer() const;
void Reset();
void Seek(size_t val); // Seeks to an absolute position
void SeekFwd(size_t val); // Seeks forward n bytes
void SeekRev(size_t val); // Seeks backwards n bytes
void Set(uint8_t val, size_t bytes);
void Write(const void *buf, size_t bytes);
void Write8(uint8_t val);
void Write16LE(uint16_t val);
void Write16BE(uint16_t val);
void Write32LE(uint32_t val);
void Write32BE(uint32_t val);
void Write64LE(uint64_t val);
void Write64BE(uint64_t val);
void Read(void *buf, size_t LEn);
uint8_t Read8();
uint16_t Read16LE();
uint16_t Read16BE();
uint32_t Read32LE();
uint32_t Read32BE();
uint64_t Read64LE();
uint64_t Read64BE();
private:
uint8_t *b; // Beginning buffer position
uint8_t *c; // Current buffer position
};
inline AJAByteStream::AJAByteStream(void *buf, size_t pos) : b((uint8_t *)buf) {
Seek(pos);
}
inline size_t AJAByteStream::Pos() const {
return (size_t)(c - b);
}
inline void *AJAByteStream::Buffer() const {
return b;
}
inline void AJAByteStream::Reset() {
c = b;
return;
}
inline void AJAByteStream::Seek(size_t val) {
c = b + val;
return;
}
inline void AJAByteStream::SeekFwd(size_t val) {
c += val;
return;
}
inline void AJAByteStream::SeekRev(size_t val) {
c -= val;
return;
}
inline void AJAByteStream::Set(uint8_t val, size_t bytes) {
uint8_t *last = c + bytes;
while(c != last) *c++ = val;
return;
}
inline void AJAByteStream::Write(const void *buf, size_t bytes) {
memcpy(c, buf, bytes);
c += bytes;
return;
}
inline void AJAByteStream::Write8(uint8_t val) {
*c++ = val;
return;
}
inline void AJAByteStream::Write16LE(uint16_t val) {
c[0] = val & 0xFF;
c[1] = (val >> 8) & 0xFF;
c += 2;
return;
}
inline void AJAByteStream::Write16BE(uint16_t val) {
c[0] = (val >> 8) & 0xFF;
c[1] = val & 0xFF;
c += 2;
return;
}
inline void AJAByteStream::Write32LE(uint32_t val) {
c[0] = val & 0xFF;
c[1] = (val >> 8) & 0xFF;
c[2] = (val >> 16) & 0xFF;
c[3] = (val >> 24) & 0xFF;
c += 4;
return;
}
inline void AJAByteStream::Write32BE(uint32_t val) {
c[0] = (val >> 24) & 0xFF;
c[1] = (val >> 16) & 0xFF;
c[2] = (val >> 8) & 0xFF;
c[3] = val & 0xFF;
c += 4;
return;
}
inline void AJAByteStream::Write64LE(uint64_t val) {
c[0] = val & 0xFF;
c[1] = (val >> 8) & 0xFF;
c[2] = (val >> 16) & 0xFF;
c[3] = (val >> 24) & 0xFF;
c[4] = (val >> 32) & 0xFF;
c[5] = (val >> 40) & 0xFF;
c[6] = (val >> 48) & 0xFF;
c[7] = (val >> 56) & 0xFF;
c += 8;
return;
}
inline void AJAByteStream::Write64BE(uint64_t val) {
c[0] = (val >> 56) & 0xFF;
c[1] = (val >> 48) & 0xFF;
c[2] = (val >> 40) & 0xFF;
c[3] = (val >> 32) & 0xFF;
c[4] = (val >> 24) & 0xFF;
c[5] = (val >> 16) & 0xFF;
c[6] = (val >> 8) & 0xFF;
c[7] = val & 0xFF;
c += 8;
return;
}
inline void AJAByteStream::Read(void *buf, size_t bytes) {
uint8_t *last = c + bytes, *o = (uint8_t *)buf;
while(c != last) *o++ = *c++;
return;
}
inline uint8_t AJAByteStream::Read8() {
return *c++;
}
inline uint16_t AJAByteStream::Read16LE() {
uint16_t ret;
ret = (uint16_t)c[0];
ret |= (uint16_t)c[1] << 8;
c += 2;
return ret;
}
inline uint16_t AJAByteStream::Read16BE() {
uint16_t ret;
ret = (uint16_t)c[0] << 8;
ret |= (uint16_t)c[1];
c += 2;
return ret;
}
inline uint32_t AJAByteStream::Read32LE() {
uint32_t ret;
ret = (uint32_t)c[0];
ret |= (uint32_t)c[1] << 8;
ret |= (uint32_t)c[2] << 16;
ret |= (uint32_t)c[3] << 24;
c += 4;
return ret;
}
inline uint32_t AJAByteStream::Read32BE() {
uint32_t ret;
ret = (uint32_t)c[0] << 24;
ret |= (uint32_t)c[1] << 16;
ret |= (uint32_t)c[2] << 8;
ret |= (uint32_t)c[3];
c += 4;
return ret;
}
inline uint64_t AJAByteStream::Read64LE() {
uint64_t ret;
ret = (uint64_t)c[0];
ret |= (uint64_t)c[1] << 8;
ret |= (uint64_t)c[2] << 16;
ret |= (uint64_t)c[3] << 24;
ret |= (uint64_t)c[4] << 32;
ret |= (uint64_t)c[5] << 40;
ret |= (uint64_t)c[6] << 48;
ret |= (uint64_t)c[7] << 56;
c += 8;
return ret;
}
inline uint64_t AJAByteStream::Read64BE() {
uint64_t ret;
ret = (uint64_t)c[0] << 56;
ret |= (uint64_t)c[1] << 48;
ret |= (uint64_t)c[2] << 40;
ret |= (uint64_t)c[3] << 32;
ret |= (uint64_t)c[4] << 24;
ret |= (uint64_t)c[5] << 16;
ret |= (uint64_t)c[6] << 8;
ret |= (uint64_t)c[7];
c += 8;
return ret;
}
#endif /* ifndef AJA_BYTESTREAM_H */