diff options
Diffstat (limited to 'Src/Plugins/Input/in_flv/FLVMetadata.cpp')
-rw-r--r-- | Src/Plugins/Input/in_flv/FLVMetadata.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_flv/FLVMetadata.cpp b/Src/Plugins/Input/in_flv/FLVMetadata.cpp new file mode 100644 index 00000000..b98e801b --- /dev/null +++ b/Src/Plugins/Input/in_flv/FLVMetadata.cpp @@ -0,0 +1,112 @@ +#include "FLVMetadata.h" +#include "FLVUtil.h" +#include <windows.h> + +/* +(c) 2006 Nullsoft, Inc. +Author: Ben Allison benski@nullsoft.com +*/ + +/* + +type - uint8 - +length - uint16 + +*/ + + +AMFType *MakeObject(uint8_t type) +{ + switch(type) + { + case AMFType::TYPE_DOUBLE: // double + return new AMFDouble; + case AMFType::TYPE_BOOL: // bool + return new AMFBoolean; + case AMFType::TYPE_STRING: // string + return new AMFString; + case AMFType::TYPE_OBJECT: // object + return new AMFObj; + case AMFType::TYPE_MOVIE: // movie (basically just a URL) + return new AMFString; + case AMFType::TYPE_NULL: // null + return 0; + case AMFType::TYPE_REFERENCE: // reference + return 0; + case AMFType::TYPE_MIXEDARRAY: + return new AMFMixedArray; + case AMFType::TYPE_TERMINATOR: + return new AMFTerminator; + case AMFType::TYPE_ARRAY: + return new AMFArray; + case AMFType::TYPE_DATE: // date + return new AMFTime; + case AMFType::TYPE_LONG_STRING: // long string + return new AMFLongString; + case AMFType::TYPE_XML: // XML + return 0; + default: + return 0; + } +} + +FLVMetadata::FLVMetadata() +{ +} + +FLVMetadata::~FLVMetadata() +{ + for ( FLVMetadata::Tag *tag : tags ) + delete tag; +} + +bool FLVMetadata::Read(uint8_t *data, size_t size) +{ + // TODO: there can be multiple name/value pairs so we could read them all + while(size) + { + uint8_t type=*data; + data++; + size--; + + if (type == 0 && size >= 2 && data[0] == 0 && data[1] == AMFType::TYPE_TERMINATOR) // check for terminator + return true; // array is done + + if (type != AMFType::TYPE_STRING) // first entry is a string, verify this + return false; // malformed, lets bail + + FLVMetadata::Tag *tag = new FLVMetadata::Tag; + + // read name + size_t skip = tag->name.Read(data, size); + data+=skip; + size-=skip; + + type=*data; + data++; + size--; + + if (type != AMFType::TYPE_MIXEDARRAY) // second entry is an associative array, verify this + { + delete tag; + return false; // malformed, lets bail + } + + tag->parameters = new AMFMixedArray; // we're new'ing this because we need to reference count + skip = tag->parameters->Read(data, size); + data+=skip; + size-=skip; + tags.push_back(tag); + } + + return true; +} + +FLVMetadata::Tag::Tag() : parameters(0) +{ +} + FLVMetadata::Tag::~Tag() + { + if (parameters) + parameters->Release(); + }
\ No newline at end of file |