Benjamin Otte
2007-Nov-10 21:22 UTC
[Swfdec] 7 commits - libswfdec/swfdec_movie.c libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h libswfdec/swfdec_sprite_movie_as.c test/trace
libswfdec/swfdec_movie.c | 4 + libswfdec/swfdec_resource.c | 48 ++++++++---------- libswfdec/swfdec_resource.h | 3 - libswfdec/swfdec_sprite_movie_as.c | 8 ++- test/trace/Makefile.am | 9 +++ test/trace/moviecliploader-unknown-format-5.swf |binary test/trace/moviecliploader-unknown-format-5.swf.trace | 3 + test/trace/moviecliploader-unknown-format-6.swf |binary test/trace/moviecliploader-unknown-format-6.swf.trace | 3 + test/trace/moviecliploader-unknown-format-7.swf |binary test/trace/moviecliploader-unknown-format-7.swf.trace | 16 ++++++ test/trace/moviecliploader-unknown-format-8.swf |binary test/trace/moviecliploader-unknown-format-8.swf.trace | 16 ++++++ test/trace/moviecliploader-unknown-format.as | 36 +++++++++++++ 14 files changed, 117 insertions(+), 29 deletions(-) New commits: commit a357df6ea473ee8c6f8e1c6c189d2dd4b7adb004 Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 22:19:56 2007 +0100 mark the parent, too diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 8ec7961..2f79b06 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1018,6 +1018,8 @@ swfdec_movie_mark (SwfdecAsObject *object) GList *walk; GSList *iter; + if (movie->parent) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (movie->parent)); swfdec_as_string_mark (movie->original_name); swfdec_as_string_mark (movie->name); for (walk = movie->list; walk; walk = walk->next) { commit 0167ea2e783500c2c0290194fc2f7998f5720c6b Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 19:35:20 2007 +0100 seems I never compiled this :o diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 9ad4105..c93d151 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -242,7 +242,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l SwfdecStatus status; guint parsed; - if (dec == NULL && swfdec_buffer_queue_get_offset (loader->queue == 0)) { + if (dec == NULL && swfdec_buffer_queue_get_offset (loader->queue) == 0) { if (swfdec_buffer_queue_get_depth (loader->queue) < SWFDEC_DECODER_DETECT_LENGTH) return; buffer = swfdec_buffer_queue_peek (loader->queue, 4); commit ca60b5b27a2c9d9b0a83d14b46a5250cfdac4272 Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 18:57:04 2007 +0100 add a test for the recent SEGV when loading unknown formats diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index e4efc2a..bbb3ac2 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -1041,6 +1041,15 @@ EXTRA_DIST = \ moviecliploader-properties-7.swf.trace \ moviecliploader-properties-8.swf \ moviecliploader-properties-8.swf.trace \ + moviecliploader-unknown-format.as \ + moviecliploader-unknown-format-5.swf \ + moviecliploader-unknown-format-5.swf.trace \ + moviecliploader-unknown-format-6.swf \ + moviecliploader-unknown-format-6.swf.trace \ + moviecliploader-unknown-format-7.swf \ + moviecliploader-unknown-format-7.swf.trace \ + moviecliploader-unknown-format-8.swf \ + moviecliploader-unknown-format-8.swf.trace \ name.swf \ name.swf.trace \ name2.swf \ diff --git a/test/trace/moviecliploader-unknown-format-5.swf b/test/trace/moviecliploader-unknown-format-5.swf new file mode 100644 index 0000000..9b0ddd9 Binary files /dev/null and b/test/trace/moviecliploader-unknown-format-5.swf differ diff --git a/test/trace/moviecliploader-unknown-format-5.swf.trace b/test/trace/moviecliploader-unknown-format-5.swf.trace new file mode 100644 index 0000000..12917c7 --- /dev/null +++ b/test/trace/moviecliploader-unknown-format-5.swf.trace @@ -0,0 +1,3 @@ +true +/ +/ diff --git a/test/trace/moviecliploader-unknown-format-6.swf b/test/trace/moviecliploader-unknown-format-6.swf new file mode 100644 index 0000000..e9d0039 Binary files /dev/null and b/test/trace/moviecliploader-unknown-format-6.swf differ diff --git a/test/trace/moviecliploader-unknown-format-6.swf.trace b/test/trace/moviecliploader-unknown-format-6.swf.trace new file mode 100644 index 0000000..a535854 --- /dev/null +++ b/test/trace/moviecliploader-unknown-format-6.swf.trace @@ -0,0 +1,3 @@ +true +1/1 +0/0 diff --git a/test/trace/moviecliploader-unknown-format-7.swf b/test/trace/moviecliploader-unknown-format-7.swf new file mode 100644 index 0000000..4123e54 Binary files /dev/null and b/test/trace/moviecliploader-unknown-format-7.swf differ diff --git a/test/trace/moviecliploader-unknown-format-7.swf.trace b/test/trace/moviecliploader-unknown-format-7.swf.trace new file mode 100644 index 0000000..2928133 --- /dev/null +++ b/test/trace/moviecliploader-unknown-format-7.swf.trace @@ -0,0 +1,16 @@ +start +that's progress: 0/0 +that's progress: 0/-1 +that's progress: 0/0 +that's progress: 0/-1 +done \o/ +false +true +n-format.as +onEnterFrame +onEnterFrame +onEnterFrame +false +-1/0 +0/-1 +onEnterFrame diff --git a/test/trace/moviecliploader-unknown-format-8.swf b/test/trace/moviecliploader-unknown-format-8.swf new file mode 100644 index 0000000..56319ac Binary files /dev/null and b/test/trace/moviecliploader-unknown-format-8.swf differ diff --git a/test/trace/moviecliploader-unknown-format-8.swf.trace b/test/trace/moviecliploader-unknown-format-8.swf.trace new file mode 100644 index 0000000..2928133 --- /dev/null +++ b/test/trace/moviecliploader-unknown-format-8.swf.trace @@ -0,0 +1,16 @@ +start +that's progress: 0/0 +that's progress: 0/-1 +that's progress: 0/0 +that's progress: 0/-1 +done \o/ +false +true +n-format.as +onEnterFrame +onEnterFrame +onEnterFrame +false +-1/0 +0/-1 +onEnterFrame diff --git a/test/trace/moviecliploader-unknown-format.as b/test/trace/moviecliploader-unknown-format.as new file mode 100644 index 0000000..231bd11 --- /dev/null +++ b/test/trace/moviecliploader-unknown-format.as @@ -0,0 +1,36 @@ +// makeswf -v 7 -s 200x150 -r 1 -o moviecliploader-unknown-format.swf moviecliploader-unknown-format.as + +x = createEmptyMovieClip ("b", 1); +b._name = "a"; + +l = new MovieClipLoader (); +l.onLoadError = function (m, e, s) { + trace (m); + trace (e); + trace (s); +}; +l.onLoadStart = function (m) { + trace ("start"); +}; +l.onLoadProgress = function (m, l, t) { + trace ("that's progress: " + l + "/" + t); + trace ("that's progress: " + a.getBytesLoaded () + "/" + a.getBytesTotal ()); +}; +l.onLoadComplete = function (m, l, t) { + trace ("done \\o/"); +}; + +l.onLoadInit = function (m) { + trace (a == x); + trace (a == m); + trace (a._url.substr (-11)); + a.onEnterFrame = function () { trace ("onEnterFrame"); }; +}; +l.loadClip ("moviecliploader-unknown-format.as", a); + +setTimeout (function () { + trace (x == a); + trace (a._framesloaded + "/" + a._totalframes); + trace (a.getBytesLoaded () + "/" + a.getBytesTotal ()); + loadMovie ("fscommand:quit", ""); +}, 5000); commit 635f74859a767beceecf660b3d70d134a9b9ce5c Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 18:05:57 2007 +0100 make this work correctly if no decoder has been set due to unknown format diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 3c02af4..9ad4105 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -239,34 +239,24 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l SwfdecResource *resource = SWFDEC_RESOURCE (target); SwfdecBuffer *buffer; SwfdecDecoder *dec = resource->decoder; - SwfdecDecoderClass *klass; SwfdecStatus status; guint parsed; - if (dec == NULL) { + if (dec == NULL && swfdec_buffer_queue_get_offset (loader->queue == 0)) { if (swfdec_buffer_queue_get_depth (loader->queue) < SWFDEC_DECODER_DETECT_LENGTH) return; buffer = swfdec_buffer_queue_peek (loader->queue, 4); dec = swfdec_decoder_new (resource->player, buffer); swfdec_buffer_unref (buffer); if (dec == NULL) { - SWFDEC_ERROR ("no decoder found"); - swfdec_loader_set_target (loader, NULL); - return; - } - - if (SWFDEC_IS_SWF_DECODER (dec)) { + SWFDEC_ERROR ("no decoder found for format"); + } else if (SWFDEC_IS_SWF_DECODER (dec)) { swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_SWF); resource->decoder = dec; } else { SWFDEC_FIXME ("implement handling of %s", G_OBJECT_TYPE_NAME (dec)); - g_object_unref (dec); - swfdec_loader_set_target (loader, NULL); - return; } } - klass = SWFDEC_DECODER_GET_CLASS (dec); - g_return_if_fail (klass->parse); while (swfdec_buffer_queue_get_depth (loader->queue)) { parsed = 0; status = 0; @@ -282,7 +272,11 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l buffer = swfdec_buffer_queue_pull (loader->queue, 65536 - parsed); } parsed += buffer->length; - status = klass->parse (dec, buffer); + if (dec) { + status = swfdec_decoder_parse (dec, buffer); + } else { + swfdec_buffer_unref (buffer); + } } while ((status & (SWFDEC_STATUS_ERROR | SWFDEC_STATUS_NEEDBITS | SWFDEC_STATUS_EOF)) == 0); if (status & SWFDEC_STATUS_ERROR) { SWFDEC_ERROR ("parsing error"); commit c8db312e4f4e1f8e81a532d31de0f4f16572b624 Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 18:05:30 2007 +0100 unparsable files result in getBytesTotal() returning -1 diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index b751327..ec6fce9 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -90,8 +90,12 @@ swfdec_sprite_movie_getBytesTotal (SwfdecAsContext *cx, SwfdecAsObject *object, SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, (gpointer)&movie, ""); resource = swfdec_movie_get_own_resource (movie); - if (resource && resource->decoder) { - SWFDEC_AS_VALUE_SET_INT (rval, resource->decoder->bytes_total); + if (resource) { + if (resource->decoder) { + SWFDEC_AS_VALUE_SET_INT (rval, resource->decoder->bytes_total); + } else { + SWFDEC_AS_VALUE_SET_INT (rval, -1); + } } else { SWFDEC_AS_VALUE_SET_INT (rval, 0); } commit fd8483f0127ade0fac7abb99f82f7946ef4a555a Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 13:17:16 2007 +0100 use the resource's version, not the decoder's one. The decoder can be NULL if there's no file diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 57c18d0..8ec7961 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -390,7 +390,7 @@ swfdec_movie_resolve (SwfdecMovie *movie) guint swfdec_movie_get_version (SwfdecMovie *movie) { - return SWFDEC_SWF_DECODER (movie->resource->decoder)->version; + return movie->resource->version; } void commit 57466e38e16e8c4736884eac000099afe9fa16de Author: Benjamin Otte <otte at gnome.org> Date: Sat Nov 10 13:15:49 2007 +0100 add a version number to SwfdecResource diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 6b7f540..3c02af4 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -236,9 +236,9 @@ swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *lo static void swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) { - SwfdecResource *instance = SWFDEC_RESOURCE (target); + SwfdecResource *resource = SWFDEC_RESOURCE (target); SwfdecBuffer *buffer; - SwfdecDecoder *dec = instance->decoder; + SwfdecDecoder *dec = resource->decoder; SwfdecDecoderClass *klass; SwfdecStatus status; guint parsed; @@ -247,7 +247,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l if (swfdec_buffer_queue_get_depth (loader->queue) < SWFDEC_DECODER_DETECT_LENGTH) return; buffer = swfdec_buffer_queue_peek (loader->queue, 4); - dec = swfdec_decoder_new (instance->player, buffer); + dec = swfdec_decoder_new (resource->player, buffer); swfdec_buffer_unref (buffer); if (dec == NULL) { SWFDEC_ERROR ("no decoder found"); @@ -257,7 +257,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l if (SWFDEC_IS_SWF_DECODER (dec)) { swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_SWF); - instance->decoder = dec; + resource->decoder = dec; } else { SWFDEC_FIXME ("implement handling of %s", G_OBJECT_TYPE_NAME (dec)); g_object_unref (dec); @@ -289,15 +289,17 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l swfdec_loader_set_target (loader, NULL); return; } - if ((status & SWFDEC_STATUS_INIT) && - swfdec_resource_is_root (instance)) { - swfdec_player_initialize (instance->player, - SWFDEC_IS_SWF_DECODER (dec) ? SWFDEC_SWF_DECODER (dec)->version : 7, /* <-- HACK */ - dec->rate, dec->width, dec->height); + if ((status & SWFDEC_STATUS_INIT)) { + if (SWFDEC_IS_SWF_DECODER (dec)) + resource->version = SWFDEC_SWF_DECODER (dec)->version; + if (swfdec_resource_is_root (resource)) { + swfdec_player_initialize (resource->player, resource->version, + dec->rate, dec->width, dec->height); + } } if (status & SWFDEC_STATUS_IMAGE) - swfdec_resource_loader_target_image (instance); - swfdec_resource_emit_signal (instance, SWFDEC_AS_STR_onLoadProgress, TRUE, NULL, 0); + swfdec_resource_loader_target_image (resource); + swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadProgress, TRUE, NULL, 0); if (status & SWFDEC_STATUS_EOF) return; } @@ -422,6 +424,7 @@ swfdec_resource_new (SwfdecPlayer *player, SwfdecLoader *loader, const char *var g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); + resource->version = 7; resource->player = player; resource->variables = g_strdup (variables); swfdec_resource_set_loader (resource, loader); @@ -527,6 +530,7 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, g_free (path); } else { resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); + resource->version = SWFDEC_AS_CONTEXT (player)->version; resource->player = player; resource->target = path; if (loader) diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index bbf60dd..08de138 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -48,10 +48,11 @@ struct _SwfdecResource SwfdecFlashSecurity flash_security; SwfdecPlayer * player; /* player we belong to */ + guint version; /* version of this resource */ SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ SwfdecLoader * loader; /* the loader providing data for the decoder */ - SwfdecDecoder * decoder; /* decoder in use or NULL if not yet created (only happens after loadMovie()) */ + SwfdecDecoder * decoder; /* decoder in use or NULL if broken file */ char * variables; /* extra variables to be set */ GHashTable * exports; /* string->SwfdecCharacter mapping of exported characters */
Apparently Analagous Threads
- 8 commits - libswfdec/swfdec_movie_as_drawing.c libswfdec/swfdec_player.c libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h libswfdec/swfdec_sprite_movie.c
- 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
- 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
- 36 commits - doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_amf.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_strings.c libswfdec/swfdec_buffer.c libswfdec/swfdec_buffer.h
- 18 commits - doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_event.c libswfdec/swfdec_event.h libswfdec/swfdec_flash_security.c