aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_flv/AMFObject.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_flv/AMFObject.h')
-rw-r--r--Src/Plugins/Input/in_flv/AMFObject.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_flv/AMFObject.h b/Src/Plugins/Input/in_flv/AMFObject.h
new file mode 100644
index 00000000..bb423a9c
--- /dev/null
+++ b/Src/Plugins/Input/in_flv/AMFObject.h
@@ -0,0 +1,182 @@
+#ifndef NULLSOFT_AMFOBJECT_H
+#define NULLSOFT_AMFOBJECT_H
+
+#include "FLVUtil.h"
+#include <windows.h>
+#include <map>
+#include <string>
+#include <vector>
+#include <time.h>
+
+
+class AMFType // no, not bowling, ActionScript Message Format
+{
+public:
+ AMFType() : refCount(1) {}
+ virtual ~AMFType() {}
+ virtual size_t Read(uint8_t *data, size_t size)=0; // returns number of bytes read, 0 on failure
+ uint8_t type;
+ virtual void DebugPrint(int spaces, wchar_t *&str, size_t &len)=0;
+ enum
+ {
+ TYPE_DOUBLE = 0x0,
+ TYPE_BOOL = 0x1,
+ TYPE_STRING = 0x2,
+ TYPE_OBJECT = 0x3,
+ TYPE_MOVIE = 0x4,
+ TYPE_NULL = 0x5,
+ TYPE_REFERENCE = 0x7,
+ TYPE_MIXEDARRAY = 0x8,
+ TYPE_TERMINATOR = 0x9,
+ TYPE_ARRAY = 0xA,
+ TYPE_DATE = 0xB,
+ TYPE_LONG_STRING = 0xC,
+ TYPE_XML = 0xF,
+ };
+
+ ULONG AddRef(void)
+ {
+ return InterlockedIncrement((volatile LONG *)&refCount);
+ }
+
+ ULONG Release(void)
+ {
+ ULONG count = InterlockedDecrement((volatile LONG *)&refCount);
+ if (count == 0)
+ delete this;
+ return count;
+ }
+private:
+ ULONG refCount;
+};
+
+class AMFString : public AMFType
+{
+public:
+ AMFString();
+ ~AMFString();
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size);
+ wchar_t *str;
+};
+
+class AMFLongString : public AMFType
+{
+public:
+ AMFLongString();
+ ~AMFLongString();
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size);
+ wchar_t *str;
+};
+
+class AMFObj : public AMFType
+{
+public:
+ size_t Read(uint8_t *data, size_t size);
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+};
+
+class AMFArray : public AMFType
+{
+public:
+ size_t Read(uint8_t *data, size_t size);
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ ~AMFArray();
+ std::vector<AMFType*> array;
+};
+
+class AMFMixedArray : public AMFType
+{
+public:
+ size_t Read(uint8_t *data, size_t size);
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ ~AMFMixedArray();
+ typedef std::map<std::wstring, AMFType *> AMFTypeList;
+ AMFTypeList array;
+};
+
+class AMFDouble : public AMFType
+{
+public:
+void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size)
+ {
+ if (size < 8)
+ return 0;
+
+ val = FLV::ReadDouble(data);
+ return 8;
+ }
+ double val;
+};
+
+class AMFTime : public AMFType
+{
+public:
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size)
+ {
+ if (size < 10)
+ return 0;
+
+ val = FLV::ReadDouble(data);
+ data+=8;
+
+ offset = FLV::Read16(data);
+
+ return 10;
+ }
+ double val; // same epoch as time_t, just stored as a double instead of an unsigned int
+ int16_t offset; // offset in minutes from UTC. presumably from the encoding machine's timezone
+};
+
+class AMFBoolean : public AMFType
+{
+public:
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size)
+ {
+ if (size < 1)
+ return 0;
+ boolean = !!data[0];
+ return 1;
+ }
+
+ bool boolean;
+};
+
+class AMFTerminator : public AMFType
+{
+public:
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size)
+ {
+ return 0;
+ }
+};
+
+class AMFReference : public AMFType
+{
+public:
+ void DebugPrint(int spaces, wchar_t *&str, size_t &len);
+ size_t Read(uint8_t *data, size_t size)
+ {
+ if (size < 2)
+ return 0;
+ val = FLV::Read16(data);
+ return 2;
+ }
+ uint16_t val;
+};
+
+inline double AMFGetDouble(AMFType *obj)
+{
+ if (obj->type == 0x0)
+ return ((AMFDouble *)obj)->val;
+
+ return 0;
+}
+
+AMFType *MakeObject(uint8_t type);
+#endif \ No newline at end of file