[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] /srv/bzr/gnash/trunk r9729: Fix latest youtube player.
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] /srv/bzr/gnash/trunk r9729: Fix latest youtube player. |
Date: |
Fri, 12 Sep 2008 19:49:20 +0200 |
User-agent: |
Bazaar (1.5) |
------------------------------------------------------------
revno: 9729
committer: Sandro Santilli <address@hidden>
branch nick: trunk
timestamp: Fri 2008-09-12 19:49:20 +0200
message:
Fix latest youtube player.
modified:
libcore/as_value.cpp
libmedia/FLVParser.cpp
------------------------------------------------------------
revno: 9727.1.3
committer: Sandro Santilli <address@hidden>
branch nick: mybranch
timestamp: Fri 2008-09-12 18:46:35 +0200
message:
fix unused variable warning
modified:
libcore/as_value.cpp
------------------------------------------------------------
revno: 9727.1.4
committer: Sandro Santilli <address@hidden>
branch nick: mybranch
timestamp: Fri 2008-09-12 19:45:15 +0200
message:
AMF deserializer: be more tolerant about malformed AMF
(sorry, this commit also includes some indentation changes)
modified:
libcore/as_value.cpp
------------------------------------------------------------
revno: 9727.1.5
committer: Sandro Santilli <address@hidden>
branch nick: mybranch
timestamp: Fri 2008-09-12 19:45:56 +0200
message:
Call NOTIFY tags even if errors occurred in AMF deserializer as it
looks like the YouTube Metadata Injector sucks...
modified:
libmedia/FLVParser.cpp
=== modified file 'libcore/as_value.cpp'
--- a/libcore/as_value.cpp 2008-09-12 15:04:27 +0000
+++ b/libcore/as_value.cpp 2008-09-12 17:45:15 +0000
@@ -58,7 +58,7 @@
//#define GNASH_DEBUG_SOFT_REFERENCES
// Define this macto to make AMF parsing verbose
-//#define GNASH_DEBUG_AMF_DESERIALIZE
+#define GNASH_DEBUG_AMF_DESERIALIZE
// Define this macto to make AMF writing verbose
//#define GNASH_DEBUG_AMF_SERIALIZE
@@ -740,7 +740,7 @@
as_value::to_element() const
{
VM& vm = VM::get();
- int swfVersion = vm.getSWFVersion();
+ //int swfVersion = vm.getSWFVersion();
std::auto_ptr<amf::Element> el ( new amf::Element );
boost::intrusive_ptr<as_object> ptr = to_object();
@@ -1817,7 +1817,7 @@
m_type(UNDEFINED)
{
VM& vm = VM::get();
- int swfVersion = vm.getSWFVersion();
+ //int swfVersion = vm.getSWFVersion();
string_table& st = vm.getStringTable();
switch (el.getType()) {
@@ -2133,7 +2133,9 @@
}
}
- switch(amf_type) {
+ switch(amf_type)
+ {
+
case amf::Element::BOOLEAN_AMF0:
{
bool val = *b; b += 1;
@@ -2143,7 +2145,9 @@
ret.set_bool(val);
return true;
}
+
case amf::Element::NUMBER_AMF0:
+ {
if(b + 8 > end) {
log_error(_("AMF0 read: premature end of input
reading Number type"));
return false;
@@ -2155,7 +2159,10 @@
#endif
ret.set_double(dub);
return true;
+ }
+
case amf::Element::STRING_AMF0:
+ {
if(b + 2 > end) {
log_error(_("AMF0 read: premature end of input
reading String type"));
return false;
@@ -2176,8 +2183,10 @@
}
break;
+ }
+
case amf::Element::STRICT_ARRAY_AMF0:
- {
+ {
boost::intrusive_ptr<as_array_object> array(new
as_array_object());
objRefs.push_back(array.get());
@@ -2197,12 +2206,17 @@
ret.set_as_object(array);
return true;
- }
+ }
+
case amf::Element::ECMA_ARRAY_AMF0:
- {
+ {
as_array_object* obj = new as_array_object();
// GC-managed...
objRefs.push_back(obj);
+ // set the value immediately, so if there's any problem parsing
+ // (like premature end of buffer) we still get something.
+ ret.set_as_object(obj);
+
li = readNetworkLong(b); b += 4;
// the count specifies array size, so to have that even if
none of the members are indexed
// if short, will be incremented everytime an indexed member
is found
@@ -2249,18 +2263,23 @@
obj->set_member(st.find(name),
objectElement);
}
- ret.set_as_object(obj);
return true;
- }
+ }
+
case amf::Element::OBJECT_AMF0:
- {
+ {
string_table& st = vm.getStringTable();
- boost::intrusive_ptr<as_object> obj(new
as_object(getObjectInterface()));
+ as_object* obj = new
as_object(getObjectInterface()); // GC-managed
+
+ // set the value immediately, so if there's any problem parsing
+ // (like premature end of buffer) we still get something.
+ ret.set_as_object(obj);
+
#ifdef GNASH_DEBUG_AMF_DESERIALIZE
- log_debug("amf0 starting read of object");
+ log_debug("amf0 starting read of OBJECT");
#endif
- objRefs.push_back(obj.get());
+ objRefs.push_back(obj);
as_value tmp;
std::string keyString;
@@ -2279,7 +2298,6 @@
} else {
log_error("AMF buffer
terminated just before object end byte. continueing anyway.");
}
- ret.set_as_object(obj);
return true;
}
@@ -2289,25 +2307,28 @@
}
obj->set_member(st.find(keyString),
tmp);
}
- }
+ }
+
case amf::Element::UNDEFINED_AMF0:
- {
+ {
#ifdef GNASH_DEBUG_AMF_DESERIALIZE
log_debug("readAMF0: undefined value");
#endif
ret.set_undefined();
return true;
- }
+ }
+
case amf::Element::NULL_AMF0:
- {
+ {
#ifdef GNASH_DEBUG_AMF_DESERIALIZE
log_debug("readAMF0: null value");
#endif
ret.set_null();
return true;
- }
+ }
+
case amf::Element::REFERENCE_AMF0:
- {
+ {
si = readNetworkShort(b); b += 2;
#ifdef GNASH_DEBUG_AMF_DESERIALIZE
log_debug("readAMF0: reference #%d", si);
@@ -2319,11 +2340,14 @@
}
ret.set_as_object(objRefs[si-1]);
return true;
- }
+ }
+
// TODO define other types (function, sprite, etc)
default:
+ {
log_unimpl("AMF0 to as_value: unsupported type: %i",
amf_type);
return false;
+ }
}
// this function was called with a zero-length buffer
=== modified file 'libmedia/FLVParser.cpp'
--- a/libmedia/FLVParser.cpp 2008-09-09 09:20:50 +0000
+++ b/libmedia/FLVParser.cpp 2008-09-12 17:45:56 +0000
@@ -630,10 +630,11 @@
std::vector<as_object*> objRefs;
if ( ! arg.readAMF0(ptr, endptr, -1, objRefs, vm) )
{
- log_error("Could not convert FLV metatag to as_value");
- return;
+ log_error("Could not convert FLV metatag to as_value, but will
try passing it anyway. It's an %s", arg);
+ //return;
}
+ log_debug("Calling %s(%s)", funcName, arg);
thisPtr->callMethod(funcKey, arg);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] /srv/bzr/gnash/trunk r9729: Fix latest youtube player.,
Sandro Santilli <=