| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- #include "FLVMetadata.h"
 
- #include "FLVUtil.h"
 
- #include <windows.h>
 
- /*
 
- (c) 2006 Nullsoft, Inc.
 
- Author: Ben Allison [email protected] 
 
- */
 
- /*
 
- 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();
 
- 		}
 
 
  |