[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