aboutsummaryrefslogtreecommitdiff
path: root/Src/libvp6/include/NSV.hpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/libvp6/include/NSV.hpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/libvp6/include/NSV.hpp')
-rw-r--r--Src/libvp6/include/NSV.hpp381
1 files changed, 381 insertions, 0 deletions
diff --git a/Src/libvp6/include/NSV.hpp b/Src/libvp6/include/NSV.hpp
new file mode 100644
index 00000000..e6a9fd39
--- /dev/null
+++ b/Src/libvp6/include/NSV.hpp
@@ -0,0 +1,381 @@
+#if !defined(NSV_HPP)
+#define NSV_HPP
+//______________________________________________________________________________
+//
+// NSV.hpp
+// NSV File I/O Classes
+
+#include <FourCC.hpp>
+
+#include <exception>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iosfwd>
+
+namespace NSV
+{
+
+#if (defined(__POWERPC__) || defined(__APPLE__))
+ typedef long long INT64;
+ typedef long long POS_TYPE;
+ typedef std::ios IOS_BASE;
+#elif (defined(__linux) || defined(linux))
+ typedef long long INT64; // Assumes WIN32
+ typedef std::ios::pos_type POS_TYPE;
+ typedef std::ios_base IOS_BASE;
+#else
+ typedef __int64 INT64; // Assumes WIN32
+ typedef std::ios::pos_type POS_TYPE;
+ typedef std::ios_base IOS_BASE;
+#endif
+
+ enum
+ {
+ FrameRates = 256
+ };
+
+ double frameRate(int nFrameRate);
+ int frameRate(unsigned int uiRateNum, unsigned int uiRateDenom);
+ bool video(FourCC fccNSV);
+ bool audio(FourCC fccNSV);
+ FourCC videoFormat(FourCC fccCompression);
+ FourCC audioFormat(unsigned short wFormatTag);
+ FourCC videoCompression(FourCC fccNSV);
+ int videoBitCount(FourCC fccNSV);
+ unsigned short audioFormatTag(FourCC fccNSV);
+
+ //--------------------------------------
+ class Exception : public std::exception
+ {
+ public:
+ Exception();
+ Exception(const std::string& strException);
+ Exception(const Exception& e);
+ ~Exception() throw();
+
+ Exception& operator=(const Exception& e);
+
+ const char* what() const throw();
+
+ private:
+ std::string m_strException;
+ };
+
+ //--------------------------------------
+ class IndexEntry
+ {
+ public:
+ IndexEntry(POS_TYPE posOffset = 0, size_t sizeData = -1, bool bKeyFrame = false) :
+ m_posOffset(posOffset),
+ m_sizeData(sizeData),
+ m_bKeyFrame(bKeyFrame)
+ {
+ }
+
+ //private:
+ POS_TYPE m_posOffset;
+ size_t m_sizeData;
+ bool m_bKeyFrame;
+ };
+
+ typedef std::vector<IndexEntry> Index;
+
+ //--------------------------------------
+ class FileHeader
+ {
+ public:
+ friend std::ostream& operator<<(std::ostream& os, const FileHeader& fh);
+
+ FileHeader() :
+ m_fccSignature(0UL),
+ m_sizeHeader(0),
+ m_sizeFile(0),
+ m_iFileSize_ms(0),
+ m_sizeMetaData(0),
+ m_nTOCAlloc(0),
+ m_nTOCSize(0),
+ m_strMetaData(),
+ m_index()
+ {
+ }
+
+ //private:
+ FourCC m_fccSignature;
+ size_t m_sizeHeader;
+ size_t m_sizeFile;
+ int m_iFileSize_ms;
+ size_t m_sizeMetaData;
+ int m_nTOCAlloc;
+ int m_nTOCSize;
+ std::string m_strMetaData;
+ std::vector<size_t> m_index;
+ };
+
+ //--------------------------------------
+ class FrameHeader
+ {
+ public:
+ friend std::ostream& operator<<(std::ostream& os, const FrameHeader& fh);
+
+ FrameHeader() :
+ m_fccSignature(0UL),
+ m_fccVideo(0UL),
+ m_fccAudio(0UL),
+ m_iWidth(0),
+ m_iHeight(0),
+ m_iFrameRate(0),
+ m_iSyncOffset_ms(0),
+ m_bKeyFrame(false)
+ {
+ }
+
+ //private:
+ FourCC m_fccSignature;
+ FourCC m_fccVideo;
+ FourCC m_fccAudio;
+ int m_iWidth;
+ int m_iHeight;
+ int m_iFrameRate;
+ int m_iSyncOffset_ms;
+ bool m_bKeyFrame;
+ };
+
+ class Stream;
+
+ //--------------------------------------
+ class File
+ {
+ friend std::ostream& operator<<(std::ostream& os, const File& f);
+
+ public:
+ File();
+ ~File();
+
+ // File header
+ void header(const std::string& strMetaData, int nIndexEntries);
+ void metaData(const std::string& strMetaData);
+ const std::string& metaData() const;
+
+ void indexEntry(int nEntry, POS_TYPE posOffset, size_t sizeData = -1, bool bKeyFrame = false);
+ void appendIndexEntry(POS_TYPE posOffset, size_t sizeData = -1, bool bKeyFrame = false);
+ Index& index(); // Relative index
+ int indexEntriesUsed() const;
+
+ // Synchronization frame header
+ FourCC videoFormat() const;
+ FourCC audioFormat() const;
+
+ void size(int iWidth, int iHeight);
+ int width()const;
+ int height() const;
+
+ void frameRate(unsigned char ucFrameRate);
+ unsigned char frameRate() const;
+
+ void rate(unsigned int uiRateNum, unsigned int uiRateDenom);
+ unsigned int rateNum() const;
+ unsigned int rateDenom() const;
+
+ void syncOffset(int iSyncOffset_ms);
+ int syncOffset() const;
+ void finalizeSyncOffset();
+
+ void frames(INT64 nFrames);
+ INT64 frames() const;
+
+ Stream& newStream(FourCC fccDataType, unsigned int uiRateNum = 0, unsigned int uiRateDenom = 0, INT64 nSamples = -1);
+ int streams() const;
+ int streamsAux() const;
+ Stream& stream(int nStream);
+ const Stream& stream(int nStream) const;
+
+ int streamVideo() const;
+ int streamAudio() const;
+ int streamAux(int nAux) const;
+
+ void dataOffset(POS_TYPE posDataOffset);
+ POS_TYPE dataOffset();
+
+ private:
+ File(const File& f); // Not implemented
+ File& operator=(const File& f); // Not implemented
+
+ std::string m_strMetaData;
+ Index m_index;
+ int m_nIndexEntriesUsed;
+
+ int m_iWidth;
+ int m_iHeight;
+
+ unsigned int m_uiRateNum;
+ unsigned int m_uiRateDenom;
+ unsigned char m_ucFrameRate;
+
+ int m_iSyncOffset_ms;
+
+ std::vector<Stream> m_vStream;
+
+ POS_TYPE m_posDataOffset;
+
+ int m_nStreamVideo;
+ int m_nStreamAudio;
+
+ INT64 m_nFrames;
+ };
+
+ //--------------------------------------
+ class Stream
+ {
+ friend std::ostream& operator<<(std::ostream& os, const Stream& s);
+
+ public:
+ Stream(File* pFile, int nStream, FourCC fccDataType, unsigned int uiRateNum, unsigned int uiRateDenom, INT64 nSamples);
+ Stream(const Stream& s);
+ ~Stream();
+
+ Stream& operator=(const Stream& s);
+
+ void open();
+ void close();
+
+ int stream() const;
+ FourCC type() const; // Returns AVI types, vids, auds, ...
+ FourCC dataType() const;
+
+ void samples(INT64 nSamples);
+ INT64 samples() const;
+
+ void sample(INT64 nSample);
+ INT64 sample() const;
+
+ void rate(unsigned int uiRateNum, unsigned int uiRateDenom);
+ unsigned int rateNum() const;
+ unsigned int rateDenom() const;
+
+ void dataSize(size_t sizeData);
+ void data(const unsigned char* pData, size_t sizeData);
+ unsigned char* data();
+ size_t dataSize() const;
+
+ void keyFrame(bool bKeyFrame);
+ bool keyFrame() const;
+
+
+ private:
+ File* m_pFile;
+ int m_nStream;
+ FourCC m_fccDataType;
+ INT64 m_nSamples;
+ INT64 m_nSample;
+
+ unsigned int m_uiRateNum;
+ unsigned int m_uiRateDenom;
+
+ unsigned char* m_pBuffer;
+ size_t m_sizeBuffer;
+ size_t m_sizeData;
+
+ bool m_bKeyFrame;
+ };
+
+/*
+ //--------------------------------------
+ class Reader
+ {
+ public:
+ Reader(File& f);
+ Reader(File& f, const std::string& strFile);
+ ~Reader();
+
+ void open(const std::string& strFile);
+ void open();
+ void close();
+
+ File& file();
+ const std::string& fileName() const;
+
+ void readFileHeader();
+ void readFrame();
+ void readFrameInfo();
+ void readFrameHeader();
+ void readPayload();
+ void readPayloadInfo();
+ void readPayloadHeader(int& nAux, int& iAuxPlusVideo, int& iAudio);
+
+ INT64 frames() const;
+ INT64 frame() const;
+ void seek(INT64 nFrame);
+ void readSample(int nStream, unsigned char* pData, size_t sizeDataMax, size_t& sizeData, bool& bKeyFrame);
+ bool eof();
+
+ const FileHeader& fileHeader() const;
+ const FrameHeader& frameHeader() const;
+
+ private:
+ Reader(const Reader& r); // Not implemented
+ Reader& operator=(const Reader& r); // Not implemented
+
+ short read_i16();
+ unsigned short read_ui16();
+ int read_i32();
+ unsigned int read_ui32();
+
+ File& m_file;
+ std::string m_strFile;
+ std::ifstream m_ifs;
+
+ FileHeader m_fileHeader;
+ FrameHeader m_frameHeader;
+ bool m_bFrameHeader;
+
+ INT64 m_nFrame;
+ };
+*/
+
+ //--------------------------------------
+ class Writer
+ {
+ public:
+ Writer(File& f);
+ Writer(File& f, const std::string& strFile);
+ ~Writer();
+
+ void open(const std::string& strFile);
+ void open();
+ void close();
+
+ File& file();
+ const std::string& fileName() const;
+
+ INT64 frame() const;
+ void seek(POS_TYPE posOffset);
+
+ void header(const std::string& strMetaData, int nIndexEntries);
+ void sample(int nStream, const unsigned char* pData, size_t sizeData, bool bKeyframe);
+ void writeFrame();
+
+ private:
+ Writer(const Writer& w); // Not implemented
+ Writer& operator=(const Writer& w); // Not implemented
+
+ void writeFileHeader();
+ void writeFrameHeader(bool bKeyFrame);
+ void writePayloadHeader();
+
+ void write_i16(short i16);
+ void write_ui16(unsigned short ui16);
+ void write_i32(int i32);
+ void write_ui32(unsigned int ui32);
+
+ File& m_file;
+ std::string m_strFile;
+ std::ofstream m_ofs;
+
+ INT64 m_nFrame;
+ bool m_bKeyFrame;
+ };
+
+} // namespace NSV
+
+#endif // NSV_HPP