diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/libvp6/include/Rvd.hpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/libvp6/include/Rvd.hpp')
-rw-r--r-- | Src/libvp6/include/Rvd.hpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/Src/libvp6/include/Rvd.hpp b/Src/libvp6/include/Rvd.hpp new file mode 100644 index 00000000..078d6e32 --- /dev/null +++ b/Src/libvp6/include/Rvd.hpp @@ -0,0 +1,198 @@ +#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 |