Files
MontaukOS/programs/src/video/avi.hpp
T
2026-03-28 17:26:25 +01:00

74 lines
1.5 KiB
C++

#pragma once
#include <cstdint>
namespace avi {
enum class VideoCodec {
None,
RGB24,
RGB32,
MJPG,
};
struct ChunkRef {
uint32_t offset;
uint32_t size;
};
struct File {
int fd;
uint64_t size;
int width;
int height;
bool top_down;
int bits_per_pixel;
VideoCodec codec;
uint32_t stream_scale;
uint32_t stream_rate;
uint32_t microsec_per_frame;
uint32_t declared_frame_count;
uint16_t audio_format;
uint16_t audio_channels;
uint16_t audio_bits;
uint16_t audio_block_align;
uint32_t audio_rate;
uint32_t audio_avg_bytes_per_sec;
bool audio_supported;
ChunkRef* video_chunks;
int video_chunk_count;
int video_chunk_cap;
ChunkRef* audio_chunks;
int audio_chunk_count;
int audio_chunk_cap;
uint64_t total_audio_bytes;
uint64_t total_audio_frames;
uint8_t* decode_buffer;
uint32_t decode_buffer_cap;
bool valid;
char error[128];
};
void reset(File& file);
bool parse(File& file, int fd, uint64_t size);
bool read_bytes(const File& file, uint64_t offset, uint8_t* out, uint32_t size);
bool decode_frame(File& file, int frame_index, uint32_t* out_argb);
uint64_t video_duration_us(const File& file);
uint64_t audio_duration_us(const File& file);
uint64_t duration_us(const File& file);
int frame_index_for_time(const File& file, uint64_t time_us);
const char* codec_name(const File& file);
bool has_supported_audio(const File& file);
} // namespace avi