winamp/Src/libvp6/include/Rvd.hpp
2024-09-24 14:54:57 +02:00

199 lines
3.6 KiB
C++

#ifndef RVD_HPP
#define RVD_HPP
#pragma warning(disable:4786)
#include "FourCC.hpp"
//#include <io.h>
#include <windows.h>
#include <exception>
#include <cstdlib>
#include <cstddef>
#include <string>
#include <map>
namespace Rvd
{
class FileError : public exception
{
public:
explicit FileError(const char*);
explicit FileError(DWORD);
const char* what() const;
private:
std::string message;
};
bool nameIsOK(const char* name);
enum Format { rgb24, rgb32, yuv12 };
const char* asStr(Format f);
struct Header
{
FourCC code;
__int32 width;
__int32 height;
__int32 blockSize;
FourCC compression;
__int32 unknown; //frame count?
__int32 rate;
__int32 scale;
__int8 pad[480];
};
typedef unsigned __int64 size_type;
size_type estimatedFileSize(
int width,
int height,
Format format,
int frameCount);
class File
{
public:
enum mode_t {in, out, inout};
File();
File(const char* name, mode_t mode);
~File();
void open(const char* name, mode_t mode, DWORD flags = 0);
void close();
void setFormat(Format);
void setWidth(int w);
void setHeight(int h);
void setRate(int rate);
void setScale(int scale);
void reset(int frameNum) const;
void advance(int count) const;
void read(void* frame) const;
void write(const void* frame);
void writeHeader();
bool isOpen() const;
bool eof() const;
mode_t mode() const;
const char* name() const;
int frameNum() const;
int frameCount() const;
bool frameCountIsOK() const;
Format format() const;
const FourCC compression() const;
int width() const;
int height() const;
int rate() const;
int scale() const;
size_t frameSize() const;
size_t paddedFrameSize() const;
private:
File& operator=(const File&);
File(const File&);
//int file;
HANDLE m_handle;
mutable int frameNum_;
int frameCount_;
bool frameCountIsOK_;
char name_[_MAX_PATH];
mode_t mode_;
Header* const m_header;
Format format_;
size_t frameSize_;
size_t paddedFrameSize_;
size_t paddingSize_;
bool unbuffered;
};
class MappedFile
{
public:
MappedFile();
MappedFile(const char* name);
~MappedFile();
void open(const char* name);
void close();
bool isOpen() const;
const char* name() const;
int frameCount() const;
Format format() const;
int width() const;
int height() const;
int rate() const;
int scale() const;
size_t frameSize() const;
void* map(int frameNum) const;
void unmap(int frameNum) const;
void unmap() const;
bool isMapped(int frameNum) const;
private:
MappedFile(const MappedFile&);
MappedFile& operator=(const MappedFile&);
void init();
Header header;
Format m_format;
size_t m_frameSize;
size_t m_paddedFrameSize;
std::string m_name;
HANDLE file;
HANDLE mapping;
DWORD allocationGranularity;
int m_frameCount;
struct ViewInfo
{
void* view;
void* frame;
};
typedef std::map<int, ViewInfo> Views;
mutable Views views;
};
}
#endif