[Swfdec] 5 commits - libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h player/swfdec_slow_loader.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Thu Nov 8 08:49:47 PST 2007


 libswfdec/swfdec_net_stream.c              |    5 +++
 libswfdec/swfdec_player.c                  |   27 +++++++++++++++++---
 libswfdec/swfdec_resource.c                |   38 ++++++++++++++++++++++++-----
 libswfdec/swfdec_resource.h                |    1 
 player/swfdec_slow_loader.c                |    6 ++--
 test/trace/Makefile.am                     |    7 +++++
 test/trace/netstream-fscommand-6.swf       |binary
 test/trace/netstream-fscommand-6.swf.trace |    1 
 test/trace/netstream-fscommand-7.swf       |binary
 test/trace/netstream-fscommand-7.swf.trace |    1 
 test/trace/netstream-fscommand-8.swf       |binary
 test/trace/netstream-fscommand-8.swf.trace |    1 
 test/trace/netstream-fscommand.as          |   16 ++++++++++++
 13 files changed, 89 insertions(+), 14 deletions(-)

New commits:
commit 5b865db327ba55d958b4f07baa928f39a22be9ca
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Nov 8 17:48:53 2007 +0100

    make netstream actually push all data to the flv decoder
    
    This fixes Youtube playback inside a browser

diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c
index d4ac232..93493ca 100644
--- a/libswfdec/swfdec_net_stream.c
+++ b/libswfdec/swfdec_net_stream.c
@@ -281,8 +281,11 @@ swfdec_net_stream_loader_target_parse (SwfdecLoaderTarget *target,
   status = SWFDEC_STATUS_OK;
   do {
     SwfdecBuffer *buffer = swfdec_buffer_queue_pull_buffer (loader->queue);
+    if (buffer == NULL)
+      break;
+    status &= ~SWFDEC_STATUS_NEEDBITS;
     status |= klass->parse (SWFDEC_DECODER (stream->flvdecoder), buffer);
-  } while ((status & (SWFDEC_STATUS_ERROR | SWFDEC_STATUS_NEEDBITS | SWFDEC_STATUS_EOF)) == 0);
+  } while ((status & (SWFDEC_STATUS_ERROR | SWFDEC_STATUS_EOF)) == 0);
 
   if (status & SWFDEC_STATUS_IMAGE)
     swfdec_net_stream_loader_target_recheck (stream);
commit 54956ef570e85abc28964edceff8f036f07a74dd
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Nov 8 17:08:00 2007 +0100

    update to make it work again

diff --git a/player/swfdec_slow_loader.c b/player/swfdec_slow_loader.c
index 554de1c..4261800 100644
--- a/player/swfdec_slow_loader.c
+++ b/player/swfdec_slow_loader.c
@@ -97,14 +97,14 @@ swfdec_slow_loader_tick (gpointer data)
 static void
 swfdec_slow_loader_initialize (SwfdecSlowLoader *slow, SwfdecLoader *loader, guint duration)
 {
-  gulong size;
+  glong size;
 
   slow->tick_time = 100;
   slow->duration = duration * 1000;
   slow->loader = loader;
   g_signal_connect (loader, "notify", G_CALLBACK (swfdec_slow_loader_notify_cb), slow);
   size = swfdec_loader_get_size (loader);
-  if (size)
+  if (size >= 0)
     swfdec_loader_set_size (SWFDEC_LOADER (slow), size);
   slow->timeout_id = g_timeout_add (slow->tick_time, swfdec_slow_loader_tick, slow);
   swfdec_loader_open (SWFDEC_LOADER (slow), 0);
@@ -119,7 +119,7 @@ swfdec_slow_loader_load (SwfdecLoader *loader, SwfdecLoader *parent,
 
   /* FIXME: include request and data */
   new = swfdec_gtk_loader_new (swfdec_url_get_url (swfdec_loader_get_url (loader)));
-  swfdec_slow_loader_initialize (slow, new, slow->duration / 1000);
+  swfdec_slow_loader_initialize (slow, new, SWFDEC_SLOW_LOADER (parent)->duration / 1000);
 }
 
 static void
commit 044f91160c1cdaf3919c8ad28ef404232ec9a182
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Nov 8 16:05:45 2007 +0100

    emit onLoadInit events

diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index fd84130..d08215d 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1178,6 +1178,24 @@ swfdec_player_stage_to_global (SwfdecPlayer *player, double *x, double *y)
 }
 
 static void
+swfdec_player_execute_on_load_init (SwfdecPlayer *player)
+{
+  GList *walk;
+
+  /* FIXME: This can be made a LOT faster with correct caching, but I'm lazy */
+  do {
+    for (walk = player->movies; walk; walk = walk->next) {
+      SwfdecMovie *movie = walk->data;
+      SwfdecResource *resource = swfdec_movie_get_own_resource (movie);
+      if (resource == NULL)
+	continue;
+      if (swfdec_resource_emit_on_load_init (resource))
+	break;
+    }
+  } while (walk != NULL);
+}
+
+static void
 swfdec_player_iterate (SwfdecTimeout *timeout)
 {
   SwfdecPlayer *player = SWFDEC_PLAYER ((guint8 *) timeout - G_STRUCT_OFFSET (SwfdecPlayer, iterate_timeout));
@@ -1209,6 +1227,7 @@ swfdec_player_iterate (SwfdecTimeout *timeout)
     if (!klass->iterate_end (cur))
       swfdec_movie_destroy (cur);
   }
+  swfdec_player_execute_on_load_init (player);
   swfdec_player_resource_request_perform (player);
   swfdec_player_perform_actions (player);
 }
diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c
index 4e50123..5b7b448 100644
--- a/libswfdec/swfdec_resource.c
+++ b/libswfdec/swfdec_resource.c
@@ -102,7 +102,7 @@ swfdec_resource_loader_target_image (SwfdecResource *instance)
 }
 
 /* NB: name must be GC'ed */
-static void
+static SwfdecSpriteMovie *
 swfdec_resource_emit_signal (SwfdecResource *resource, const char *name, gboolean progress, 
     SwfdecAsValue *args, guint n_args)
 {
@@ -112,14 +112,14 @@ swfdec_resource_emit_signal (SwfdecResource *resource, const char *name, gboolea
   SwfdecAsValue vals[n_args + skip];
 
   if (resource->clip_loader == NULL)
-    return;
+    return NULL;
   cx = SWFDEC_AS_OBJECT (resource->clip_loader)->context;
   g_assert (resource->target);
   movie = swfdec_action_lookup_object (cx, SWFDEC_PLAYER (cx)->roots->data, 
       resource->target, resource->target + strlen (resource->target));
   if (!SWFDEC_IS_SPRITE_MOVIE (movie)) {
     SWFDEC_FIXME ("figure out if we emit nonetheless");
-    return;
+    return NULL;
   }
 
   SWFDEC_AS_VALUE_SET_STRING (&vals[0], name);
@@ -144,6 +144,7 @@ swfdec_resource_emit_signal (SwfdecResource *resource, const char *name, gboolea
     memcpy (&vals[skip], args, sizeof (SwfdecAsValue) * n_args);
   swfdec_as_object_call (SWFDEC_AS_OBJECT (resource->clip_loader), SWFDEC_AS_STR_broadcastMessage, 
       n_args + skip, vals, NULL);
+  return SWFDEC_SPRITE_MOVIE (movie);
 }
 
 static void
@@ -297,13 +298,20 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l
 static void
 swfdec_resource_loader_target_eof (SwfdecLoaderTarget *target, SwfdecLoader *loader)
 {
-  SwfdecAsValue val;
   SwfdecResource *resource = SWFDEC_RESOURCE (target);
+  SwfdecAsValue val;
+  SwfdecSpriteMovie *movie;
 
   swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadProgress, TRUE, NULL, 0);
   SWFDEC_AS_VALUE_SET_INT (&val, 0); /* FIXME */
-  swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadComplete, FALSE, &val, 1);
-  resource->state = SWFDEC_RESOURCE_COMPLETE;
+  movie = swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadComplete, FALSE, &val, 1);
+  /* FIXME: I bet this is wrong for figuring out if movies should emit onLoadInit */
+  if (resource->clip_loader == NULL ||
+      movie != resource->movie) {
+    resource->state = SWFDEC_RESOURCE_DONE;
+  } else {
+    resource->state = SWFDEC_RESOURCE_COMPLETE;
+  }
 }
 
 static void
@@ -498,3 +506,21 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url,
   swfdec_player_request_resource (player, SWFDEC_AS_CONTEXT (player)->frame->security, 
       url, request, buffer, swfdec_resource_do_load, resource, g_object_unref);
 }
+
+gboolean
+swfdec_resource_emit_on_load_init (SwfdecResource *resource)
+{
+  g_return_val_if_fail (SWFDEC_IS_RESOURCE (resource), FALSE);
+
+  if (resource->state != SWFDEC_RESOURCE_COMPLETE)
+    return FALSE;
+
+  swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadInit, FALSE, NULL, 0);
+  resource->state = SWFDEC_RESOURCE_DONE;
+  /* free now unneeded resources */
+  if (resource->clip_loader) {
+    g_object_unref (resource->clip_loader);
+    resource->clip_loader = NULL;
+  }
+  return TRUE;
+}
diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h
index ecc80ab..c6d6875 100644
--- a/libswfdec/swfdec_resource.h
+++ b/libswfdec/swfdec_resource.h
@@ -76,6 +76,7 @@ SwfdecResource *swfdec_resource_new			(SwfdecPlayer *		player,
 							 const char *		variables);
 void		swfdec_resource_mark			(SwfdecResource *	resource);
 
+gboolean	swfdec_resource_emit_on_load_init	(SwfdecResource *	resource);
 void		swfdec_resource_add_export		(SwfdecResource *	instance,
 							 SwfdecCharacter *	character,
 							 const char * 		name);
commit 9b7ffe29c6a2889f518657bce01d4c301caa113c
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Nov 8 15:30:58 2007 +0100

    add the timeout again immediately.
    
    Some functions expect it to be set.

diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index fb5e2d6..fd84130 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1183,6 +1183,10 @@ swfdec_player_iterate (SwfdecTimeout *timeout)
   SwfdecPlayer *player = SWFDEC_PLAYER ((guint8 *) timeout - G_STRUCT_OFFSET (SwfdecPlayer, iterate_timeout));
   GList *walk;
 
+  /* add timeout again - do this first because later code can change it */
+  /* FIXME: rounding issues? */
+  player->iterate_timeout.timestamp += SWFDEC_TICKS_PER_SECOND * 256 / player->rate;
+  swfdec_player_add_timeout (player, &player->iterate_timeout);
   swfdec_player_perform_external_actions (player);
   SWFDEC_INFO ("=== START ITERATION ===");
   /* start the iteration. This performs a goto next frame on all 
@@ -1207,10 +1211,6 @@ swfdec_player_iterate (SwfdecTimeout *timeout)
   }
   swfdec_player_resource_request_perform (player);
   swfdec_player_perform_actions (player);
-  /* add timeout again */
-  /* FIXME: rounding issues? */
-  player->iterate_timeout.timestamp += SWFDEC_TICKS_PER_SECOND * 256 / player->rate;
-  swfdec_player_add_timeout (player, &player->iterate_timeout);
 }
 
 static void
commit 8cdc95177d17b96770bdc7e81f25f34ad8bacc6b
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Nov 8 15:26:46 2007 +0100

    Check if fscommands work from NetStream.play
    
    hint: It's not what you'd expect

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 0cc753f..ab9d1c4 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1022,6 +1022,13 @@ EXTRA_DIST = \
 	names.swf.trace \
 	netconnection.swf \
 	netconnection.swf.trace \
+	netstream-fscommand.as \
+	netstream-fscommand-6.swf \
+	netstream-fscommand-6.swf.trace \
+	netstream-fscommand-7.swf \
+	netstream-fscommand-7.swf.trace \
+	netstream-fscommand-8.swf \
+	netstream-fscommand-8.swf.trace \
 	netstream-load-loop.as \
 	netstream-load-loop-6.swf \
 	netstream-load-loop-6.swf.trace \
diff --git a/test/trace/netstream-fscommand-6.swf b/test/trace/netstream-fscommand-6.swf
new file mode 100644
index 0000000..ffb266a
Binary files /dev/null and b/test/trace/netstream-fscommand-6.swf differ
diff --git a/test/trace/netstream-fscommand-6.swf.trace b/test/trace/netstream-fscommand-6.swf.trace
new file mode 100644
index 0000000..2a49fc7
--- /dev/null
+++ b/test/trace/netstream-fscommand-6.swf.trace
@@ -0,0 +1 @@
+Check if fscommand works for NetStream.play
diff --git a/test/trace/netstream-fscommand-7.swf b/test/trace/netstream-fscommand-7.swf
new file mode 100644
index 0000000..9483351
Binary files /dev/null and b/test/trace/netstream-fscommand-7.swf differ
diff --git a/test/trace/netstream-fscommand-7.swf.trace b/test/trace/netstream-fscommand-7.swf.trace
new file mode 100644
index 0000000..2a49fc7
--- /dev/null
+++ b/test/trace/netstream-fscommand-7.swf.trace
@@ -0,0 +1 @@
+Check if fscommand works for NetStream.play
diff --git a/test/trace/netstream-fscommand-8.swf b/test/trace/netstream-fscommand-8.swf
new file mode 100644
index 0000000..7f1e661
Binary files /dev/null and b/test/trace/netstream-fscommand-8.swf differ
diff --git a/test/trace/netstream-fscommand-8.swf.trace b/test/trace/netstream-fscommand-8.swf.trace
new file mode 100644
index 0000000..2a49fc7
--- /dev/null
+++ b/test/trace/netstream-fscommand-8.swf.trace
@@ -0,0 +1 @@
+Check if fscommand works for NetStream.play
diff --git a/test/trace/netstream-fscommand.as b/test/trace/netstream-fscommand.as
new file mode 100644
index 0000000..61be3bd
--- /dev/null
+++ b/test/trace/netstream-fscommand.as
@@ -0,0 +1,16 @@
+// makeswf -v 7 -s 200x150 -r 1 -o netstream-fscommand.swf netstream-fscommand.as
+
+trace ("Check if fscommand works for NetStream.play");
+nc = new NetConnection ();
+nc.connect (null);
+ns = new NetStream (nc);
+ns.play ("fscommand:quit");
+onEnterFrame = function () {
+  if (nc) {
+    delete nc;
+  } else if (ns) {
+    delete ns;
+  } else {
+    loadMovie ("fscommand:quit", "");
+  }
+};


More information about the Swfdec mailing list