#pragma once //typedef uint8_t FOURCC[4]; union FOURCC { uint32_t u32; uint8_t bytes[4]; char chars[4]; FOURCC() {} FOURCC(const char* str) : chars{str[0], str[1], str[2], str[3]} {} bool operator == (const FOURCC other) const {return u32 == other.u32;} bool operator != (const FOURCC other) const {return u32 != other.u32;} }; //struct AVICommonHeader { // FOURCC fourcc; // uint32_t length; //}; //struct AVITypeHeader { // FOURCC fourcc; // uint32_t length; // FOURCC type; //}; struct AVIChunk { FOURCC type; uint32_t size; // uint8_t data[size] follows hereafter bool isJUNK() const {return type == FOURCC("JUNK");} /** is an audio data chunk? */ bool isAudioData() const {return type.chars[2] == 'w' && type.chars[3] == 'b';} /** is a video data chunk? */ bool isVideoData() const {return type.chars[2] == 'd' && type.chars[3] == 'c';} }; struct AVIList : AVIChunk { // AVIList is an AVIChunk with type "RIFF" or "LIST" FOURCC content; // uint8_t data[size-4] follows hereafter, contains lists and chunks uint32_t getPayloadSize() const {return size-4;} }; struct RIFFHeader : AVIList { }; struct AVIMainHeader : AVIChunk { // uint32_t ms_per_frame; uint32_t max_bytes_per_sec; uint32_t padding_granularity; uint32_t flags; uint32_t total_frames; uint32_t initial_frames; uint32_t streams; uint32_t suggested_buffer_size; uint32_t width; uint32_t height; uint32_t reserved[4]; }; struct AVIRect { uint16_t left; uint16_t top; uint16_t right; uint16_t bottom; }; struct AVIStreamHeader : AVIChunk { // FOURCC fccType; // "vids" or "auds" or "txts" FOURCC fccHandler; // video format, e.g. "MJPG" uint32_t flags; uint16_t priority; uint16_t language; uint32_t initial_frames; uint32_t scale; uint32_t rate; uint32_t start; uint32_t length; uint32_t suggested_buffer_size; uint32_t quality; uint32_t sample_size; AVIRect rcFrame; bool isVideo() const {return fccType == FOURCC("vids");} bool isAudio() const {return fccType == FOURCC("auds");} }; struct BitMapInfoHeader { uint32_t biSize; int32_t biWidth; int32_t biHeight; int16_t biPlanes; uint16_t biBitCount; uint32_t biCompression; uint32_t biSizeImage; int32_t biXPelsPerMeter; int32_t biYPelsPerMeter; uint32_t biClrUsed; uint32_t biClrImportant; }; struct RGBQUAD { uint8_t rgbBlue; uint8_t rgbGreen; uint8_t rgbRed; uint8_t rgbReserved; }; struct BitMapInfo : AVIChunk { // BitMapInfoHeader bmi_header; RGBQUAD bmi_colors[1]; }; struct WaveFormat : AVIChunk { // uint16_t format_tag; uint16_t channels; uint32_t samples_per_sec; uint32_t avg_bytes_per_sec; uint16_t block_align; uint16_t size; }; struct AVIIndexEntry { uint32_t ckid; uint32_t flags; uint32_t chunk_offset; uint32_t chunk_length; }; struct ChunkInfo { uint32_t offset; uint32_t entry_offset; uint32_t size; };