[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