Benjamin Otte
2007-Nov-08 16:49 UTC
[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
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", ""); + } +};
Seemingly Similar Threads
- 11 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource_request.c
- 7 commits - doc/swfdec-sections.txt libswfdec-gtk/swfdec_gtk_widget.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_decoder.c libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_movie_asprops.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c
- libswfdec/swfdec_load_object.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h
- 13 commits - libswfdec/Makefile.am libswfdec/swfdec_decoder.c libswfdec/swfdec_decoder.h libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_flv_decoder.h libswfdec/swfdec_image.c libswfdec/swfdec_image_decoder.c libswfdec/swfdec_image_decoder.h
- 4 commits - libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_resource.c test/image test/trace