[Swfdec-commits] 4 commits - swfdec/swfdec_amf.c swfdec/swfdec_as_date.c swfdec/swfdec_as_date.h swfdec/swfdec_as_function.c swfdec/swfdec_bits.c test/trace

Pekka Lampila medar at kemper.freedesktop.org
Sat Feb 16 04:08:06 PST 2008


 swfdec/swfdec_amf.c                       |   19 +++++++-
 swfdec/swfdec_as_date.c                   |   24 +++++++++++
 swfdec/swfdec_as_date.h                   |    4 +
 swfdec/swfdec_as_function.c               |    2 
 swfdec/swfdec_bits.c                      |   23 +++++-----
 test/trace/Makefile.am                    |    3 +
 test/trace/netstream-onmetadata.c         |   64 ++++++++++++++++++++++++++++++
 test/trace/netstream-onmetadata.swf       |binary
 test/trace/netstream-onmetadata.swf.trace |   21 +++++++++
 test/trace/video.flv                      |binary
 10 files changed, 144 insertions(+), 16 deletions(-)

New commits:
commit c15179f9f669aff6f2aaabc6b3e385e1f08bc281
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Sat Feb 16 14:07:06 2008 +0200

    Change SWFDEC_FIXME to a comment in swfdec_as_function_call
    
    It was called so often it really slowed the test suite down for example

diff --git a/swfdec/swfdec_as_function.c b/swfdec/swfdec_as_function.c
index cc0e975..f99b28a 100644
--- a/swfdec/swfdec_as_function.c
+++ b/swfdec/swfdec_as_function.c
@@ -162,7 +162,7 @@ swfdec_as_function_call (SwfdecAsFunction *function, SwfdecAsObject *thisp, guin
   if (thisp != NULL) {
     swfdec_as_super_new (frame, thisp, thisp->prototype);
   } else {
-    SWFDEC_FIXME ("does the super object really reference the function when thisp is NULL?");
+    // FIXME: Does the super object really reference the function when thisp is NULL?
     swfdec_as_super_new (frame, SWFDEC_AS_OBJECT (function), SWFDEC_AS_OBJECT (function)->prototype);
   }
   swfdec_as_frame_preload (frame);
commit d0ae439ca396dcaaa54901e3e9276dd7f3838f89
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Sat Feb 16 14:00:51 2008 +0200

    Add a test for parsing onMetaData
    
    Added some metadata to test/trace/video.flv

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index e1be143..84e1729 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1744,6 +1744,9 @@ EXTRA_DIST = \
 	netstream-onstatus-notfound.as \
 	netstream-onstatus-notfound.swf \
 	netstream-onstatus-notfound.swf.trace \
+	netstream-onmetadata.c \
+	netstream-onmetadata.swf \
+	netstream-onmetadata.swf.trace \
 	newobject-paths.as \
 	newobject-paths-5.swf \
 	newobject-paths-5.swf.trace \
diff --git a/test/trace/netstream-onmetadata.c b/test/trace/netstream-onmetadata.c
new file mode 100644
index 0000000..6324bfc
--- /dev/null
+++ b/test/trace/netstream-onmetadata.c
@@ -0,0 +1,64 @@
+/* gcc `pkg-config --libs --cflags libming` netstream-onmetadata.c -o netstream-onmetadata && ./netstream-onmetadata
+ */
+
+#include <ming.h>
+
+int
+main (int argc, char **argv)
+{
+  SWFMovie movie;
+  SWFVideoStream video;
+  SWFDisplayItem item;
+  SWFAction action;
+
+  if (Ming_init ())
+    return 1;
+  Ming_useSWFVersion (7);
+
+  movie = newSWFMovie();
+  SWFMovie_setRate (movie, 1);
+  SWFMovie_setDimension (movie, 200, 150);
+  video = newSWFVideoStream ();
+  SWFVideoStream_setDimension (video, 200, 150);
+  item = SWFMovie_add (movie, (SWFBlock) video);
+  SWFDisplayItem_setName (item, "video");
+  action = compileSWFActionCode (""
+      "trace (\"Test parsing of onMetaData\");"
+      "nc = new NetConnection ();"
+      "nc.connect (null);"
+      "ns = new NetStream (nc);"
+      "ns.onMetaData = function (info)"
+      "{"
+      "  trace ('onMetaData');"
+      "  var props = [];"
+      "  for (var prop in info) {"
+      "    props.push (prop);"
+      "  }"
+      "  props.sort ();"
+      "  for (var i = 0; i < props.length; i++) {"
+      "    if (typeof (info[props[i]]) == 'object') {"
+      "      var keys = [];"
+      "      for (var key in info[props[i]]) {"
+      "        keys.push (key);"
+      "      }"
+      "      keys.sort ();"
+      "      trace (props[i] + ' = ');"
+      "      for (var j = 0; j < keys.length; j++) {"
+      "        trace ('  ' + keys[j] + ' = ' + typeof (info[props[i]][keys[j]]) + ': ' + info[props[i]][keys[j]]);"
+      "      }"
+      "    } else {"
+      "      trace (props[i] + ' = ' + typeof (info[props[i]]) + ': ' + info[props[i]]);"
+      "    }"
+      "  }"
+      "  loadMovie ('FSCommand:quit', '');"
+      "};"
+      "video.attachVideo (ns);"
+      "ns.setBufferTime (5);"
+      "trace (\"Calling play\");"
+      "ns.play (\"video.flv\");"
+      "trace (\"done calling play\");"
+      "");
+  SWFMovie_add (movie, (SWFBlock) action);
+  SWFMovie_save (movie, "netstream-onmetadata.swf");
+  return 0;
+}
diff --git a/test/trace/netstream-onmetadata.swf b/test/trace/netstream-onmetadata.swf
new file mode 100644
index 0000000..ac8da8c
Binary files /dev/null and b/test/trace/netstream-onmetadata.swf differ
diff --git a/test/trace/netstream-onmetadata.swf.trace b/test/trace/netstream-onmetadata.swf.trace
new file mode 100644
index 0000000..5ce482f
--- /dev/null
+++ b/test/trace/netstream-onmetadata.swf.trace
@@ -0,0 +1,21 @@
+Test parsing of onMetaData
+Calling play
+done calling play
+onMetaData
+audiodatarate = number: 0
+audiosize = number: 0
+canSeekToEnd = boolean: false
+creationdate = string: unknown
+datasize = number: 472
+duration = number: 4.995
+filesize = number: 326323
+framerate = number: 3.2
+height = number: 311
+lastkeyframetimestamp = number: 0
+lasttimestamp = number: 4.995
+metadatacreator = string: Manitu Group FLV MetaData Injector 2
+metadatadate = 
+videocodecid = number: 3
+videodatarate = number: 0
+videosize = number: 325838
+width = number: 466
diff --git a/test/trace/video.flv b/test/trace/video.flv
index 7ce58aa..3fb571f 100644
Binary files a/test/trace/video.flv and b/test/trace/video.flv differ
commit a6c15dd09084048ae1bb0c767eb485f7b4f6a407
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Sat Feb 16 13:46:16 2008 +0200

    Add support for parsing AMF dates

diff --git a/swfdec/swfdec_amf.c b/swfdec/swfdec_amf.c
index 688df0a..c3a091f 100644
--- a/swfdec/swfdec_amf.c
+++ b/swfdec/swfdec_amf.c
@@ -23,6 +23,7 @@
 
 #include "swfdec_amf.h"
 #include "swfdec_as_array.h"
+#include "swfdec_as_date.h"
 #include "swfdec_debug.h"
 
 typedef gboolean (* SwfdecAmfParseFunc) (SwfdecAsContext *cx, SwfdecBits *bits, SwfdecAsValue *val);
@@ -152,6 +153,21 @@ fail:
   return FALSE;
 }
 
+// FIXME: untested
+static gboolean
+swfdec_amf_parse_date (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsValue *val)
+{
+  double milliseconds = swfdec_bits_get_bdouble (bits);
+  int utc_offset = swfdec_bits_get_bu16 (bits);
+
+  if (utc_offset > 12 * 60)
+    utc_offset -= 12 * 60;
+
+  SWFDEC_AS_VALUE_SET_OBJECT (val,
+      swfdec_as_date_new (context, milliseconds, utc_offset));
+  return TRUE;
+}
+
 const SwfdecAmfParseFunc parse_funcs[SWFDEC_AMF_N_TYPES] = {
   [SWFDEC_AMF_NUMBER] = swfdec_amf_parse_number,
   [SWFDEC_AMF_BOOLEAN] = swfdec_amf_parse_boolean,
@@ -159,14 +175,13 @@ const SwfdecAmfParseFunc parse_funcs[SWFDEC_AMF_N_TYPES] = {
   [SWFDEC_AMF_OBJECT] = swfdec_amf_parse_object,
   [SWFDEC_AMF_MIXED_ARRAY] = swfdec_amf_parse_mixed_array,
   [SWFDEC_AMF_ARRAY] = swfdec_amf_parse_array,
+  [SWFDEC_AMF_DATE] = swfdec_amf_parse_date,
 #if 0
   SWFDEC_AMF_MOVIECLIP = 4,
   SWFDEC_AMF_NULL = 5,
   SWFDEC_AMF_UNDEFINED = 6,
   SWFDEC_AMF_REFERENCE = 7,
   SWFDEC_AMF_END_OBJECT = 9,
-  SWFDEC_AMF_ARRAY = 10,
-  SWFDEC_AMF_DATE = 11,
   SWFDEC_AMF_BIG_STRING = 12,
   SWFDEC_AMF_RECORDSET = 14,
   SWFDEC_AMF_XML = 15,
diff --git a/swfdec/swfdec_as_date.c b/swfdec/swfdec_as_date.c
index 890d274..14f1cd9 100644
--- a/swfdec/swfdec_as_date.c
+++ b/swfdec/swfdec_as_date.c
@@ -1160,3 +1160,27 @@ swfdec_as_date_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
+
+SwfdecAsObject *
+swfdec_as_date_new (SwfdecAsContext *context, double milliseconds,
+    int utc_offset)
+{
+  SwfdecAsObject *ret;
+  SwfdecAsValue val;
+
+  g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
+
+  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsDate)))
+    return NULL;
+
+  ret = g_object_new (SWFDEC_TYPE_AS_DATE, NULL);
+  swfdec_as_object_add (ret, context, sizeof (SwfdecAsDate));
+  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_Date, &val);
+  if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
+    swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+
+  SWFDEC_AS_DATE (ret)->milliseconds = milliseconds;
+  SWFDEC_AS_DATE (ret)->utc_offset = utc_offset;
+
+  return ret;
+}
diff --git a/swfdec/swfdec_as_date.h b/swfdec/swfdec_as_date.h
index 77d4eab..ceacce0 100644
--- a/swfdec/swfdec_as_date.h
+++ b/swfdec/swfdec_as_date.h
@@ -53,7 +53,9 @@ struct _SwfdecAsDateClass {
 
 GType		swfdec_as_date_get_type	(void);
 
-SwfdecAsObject *swfdec_as_date_new		(SwfdecAsContext *	context);
+SwfdecAsObject *swfdec_as_date_new		(SwfdecAsContext *	context,
+						 double			milliseconds,
+						 int			utc_offset);
 
 
 G_END_DECLS
commit dde4650fbd9b7dfba2fdea75f7eaa50f05cff48c
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Sat Feb 16 13:04:33 2008 +0200

    Fix AMF number parsing

diff --git a/swfdec/swfdec_bits.c b/swfdec/swfdec_bits.c
index 9e7a207..19e0a64 100644
--- a/swfdec/swfdec_bits.c
+++ b/swfdec/swfdec_bits.c
@@ -350,25 +350,24 @@ swfdec_bits_get_double (SwfdecBits * b)
 double
 swfdec_bits_get_bdouble (SwfdecBits * b)
 {
-  double d;
+  guint8 x[8];
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
-  guint64 tmp;
-  gpointer p;
+  guint8 c;
 #endif
 
   SWFDEC_BYTES_CHECK (b, 8);
 
-#if G_BYTE_ORDER == G_BIG_ENDIAN
-  memcpy (&d, b->ptr, 8);
-#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
-  memcpy (&tmp, b->ptr, 8);
-  tmp = GUINT64_FROM_BE (tmp);
-  p = &tmp;
-  d = *((double *) p);
-#endif
+  memcpy (&x, b->ptr, 8);
   b->ptr += 8;
 
-  return d;
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+  c=x[0]; x[0]=x[7]; x[7]=c;
+  c=x[1]; x[1]=x[6]; x[6]=c;
+  c=x[2]; x[2]=x[5]; x[5]=c;
+  c=x[3]; x[3]=x[4]; x[4]=c;
+#endif
+
+  return *(double *)&x;
 }
 
 void


More information about the Swfdec-commits mailing list