gnash-commit
[Top][All Lists]
Advanced

[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);
 }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]