|
@@ -281,7 +281,7 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std
|
|
|
const Scope& sc = GetRequiredScope(element);
|
|
|
|
|
|
const Element* const Type = sc["Type"];
|
|
|
- const Element* const FileName = sc["FileName"];
|
|
|
+ const Element* const FileName = sc.FindElementCaseInsensitive("FileName"); //some files retain the information as "Filename", others "FileName", who knows
|
|
|
const Element* const RelativeFilename = sc["RelativeFilename"];
|
|
|
const Element* const Content = sc["Content"];
|
|
|
|
|
@@ -291,35 +291,40 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std
|
|
|
|
|
|
if(FileName) {
|
|
|
fileName = ParseTokenAsString(GetRequiredToken(*FileName,0));
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
if(RelativeFilename) {
|
|
|
relativeFileName = ParseTokenAsString(GetRequiredToken(*RelativeFilename,0));
|
|
|
}
|
|
|
|
|
|
if(Content) {
|
|
|
- const Token& token = GetRequiredToken(*Content, 0);
|
|
|
- const char* data = token.begin();
|
|
|
- if(!token.IsBinary()) {
|
|
|
- DOMWarning("video content is not binary data, ignoring", &element);
|
|
|
- }
|
|
|
- else if(static_cast<size_t>(token.end() - data) < 5) {
|
|
|
- DOMError("binary data array is too short, need five (5) bytes for type signature and element count", &element);
|
|
|
- }
|
|
|
- else if(*data != 'R') {
|
|
|
- DOMWarning("video content is not raw binary data, ignoring", &element);
|
|
|
- }
|
|
|
- else {
|
|
|
- // read number of elements
|
|
|
- uint32_t len = 0;
|
|
|
- ::memcpy(&len, data + 1, sizeof(len));
|
|
|
- AI_SWAP4(len);
|
|
|
-
|
|
|
- contentLength = len;
|
|
|
-
|
|
|
- content = new uint8_t[len];
|
|
|
- ::memcpy(content, data + 5, len);
|
|
|
- }
|
|
|
+ //this field is ommited when the embedded texture is already loaded, let's ignore if it´s not found
|
|
|
+ try {
|
|
|
+ const Token& token = GetRequiredToken(*Content, 0);
|
|
|
+ const char* data = token.begin();
|
|
|
+ if (!token.IsBinary()) {
|
|
|
+ DOMWarning("video content is not binary data, ignoring", &element);
|
|
|
+ }
|
|
|
+ else if (static_cast<size_t>(token.end() - data) < 5) {
|
|
|
+ DOMError("binary data array is too short, need five (5) bytes for type signature and element count", &element);
|
|
|
+ }
|
|
|
+ else if (*data != 'R') {
|
|
|
+ DOMWarning("video content is not raw binary data, ignoring", &element);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // read number of elements
|
|
|
+ uint32_t len = 0;
|
|
|
+ ::memcpy(&len, data + 1, sizeof(len));
|
|
|
+ AI_SWAP4(len);
|
|
|
+
|
|
|
+ contentLength = len;
|
|
|
+
|
|
|
+ content = new uint8_t[len];
|
|
|
+ ::memcpy(content, data + 5, len);
|
|
|
+ }
|
|
|
+ } catch (runtime_error runtimeError) {
|
|
|
+ //we don´t need the content data for contents that has already been loaded
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
props = GetPropertyTable(doc,"Video.FbxVideo",element,sc);
|