Benjamin Otte
2007-Apr-03 01:07 UTC
[Swfdec] 11 commits - libswfdec-gtk/swfdec_gtk_loader.c libswfdec-gtk/swfdec_playback_alsa.c libswfdec-gtk/swfdec_source.c libswfdec/swfdec_cached.c libswfdec/swfdec_font.c libswfdec/swfdec_morphshape.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_script.c libswfdec/swfdec_video.c
libswfdec-gtk/swfdec_gtk_loader.c | 10 ++++++++-- libswfdec-gtk/swfdec_playback_alsa.c | 3 +-- libswfdec-gtk/swfdec_source.c | 32 ++++++++++++++++++++++++-------- libswfdec/swfdec_cached.c | 3 +-- libswfdec/swfdec_font.c | 19 ++++++++++++++----- libswfdec/swfdec_morphshape.c | 10 ++++++++-- libswfdec/swfdec_net_stream.c | 3 ++- libswfdec/swfdec_script.c | 8 +++++--- libswfdec/swfdec_video.c | 9 ++++++--- 9 files changed, 69 insertions(+), 28 deletions(-) New commits: diff-tree 7495e883f55098c1b6cb22873cb6ac2bd99052e7 (from 35b8ff9083919b168d2090d4ccf72aa5cec99538) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 10:06:59 2007 +0200 get rid of the constant pool in swfdec_script_interpret, since we allocate it there diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 21c1fff..d8ce1ad 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -3022,6 +3022,10 @@ no_catch: /* Reset sp before freeing stack slots, because our caller may GC soon. */ fp->sp = fp->spbase; fp->spbase = NULL; + if (fp->constant_pool) { + swfdec_constant_pool_free (fp->constant_pool); + fp->constant_pool = NULL; + } js_FreeRawStack(cx, mark); cx->interpLevel--; swfdec_script_unref (script); @@ -3123,8 +3127,6 @@ swfdec_script_execute (SwfdecScript *scr ok = swfdec_script_interpret (script, cx, &frame.rval); js_FreeRawStack (cx, mark); - if (frame.constant_pool) - swfdec_constant_pool_free (frame.constant_pool); cx->fp = oldfp; if (oldfp) { diff-tree 35b8ff9083919b168d2090d4ccf72aa5cec99538 (from 23af06e2fcd39f80bd13b10ee02d57eb7b0e9aee) Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Thu Mar 22 19:58:07 2007 +0000 Free the glyph array along with the font. ==24359== 580 (260 direct, 320 indirect) bytes in 3 blocks are definitely lost in loss record 70 of 101 ==24359== at 0x4021620: malloc (vg_replace_malloc.c:149) ==24359== by 0x4E7BCB5: g_malloc (gmem.c:131) ==24359== by 0x4E8B887: g_slice_alloc (gslice.c:777) ==24359== by 0x4E56E38: g_array_sized_new (garray.c:94) ==24359== by 0x4E56F56: g_array_new (garray.c:86) ==24359== by 0x4044B2D: swfdec_font_init (swfdec_font.c:61) ==24359== by 0x4E35838: g_type_create_instance (gtype.c:1569) ==24359== by 0x4E1C901: g_object_constructor (gobject.c:1041) ==24359== by 0x4E1AC0A: g_object_newv (gobject.c:937) ==24359== by 0x4E1B74E: g_object_new_valist (gobject.c:981) ==24359== by 0x4E1B8FF: g_object_new (gobject.c:795) ==24359== by 0x406CE47: swfdec_swf_decoder_create_character (swfdec_swf_decoder.c:385) Slightly misleading as the leak resolution wasn't high enough to distinguish between g_slice_allocs. diff --git a/libswfdec/swfdec_font.c b/libswfdec/swfdec_font.c index 6794e0f..1b032d8 100644 --- a/libswfdec/swfdec_font.c +++ b/libswfdec/swfdec_font.c @@ -37,14 +37,23 @@ swfdec_font_dispose (GObject *object) SwfdecFont * font = SWFDEC_FONT (object); guint i; - for (i = 0; i < font->glyphs->len; i++) { - g_object_unref (g_array_index (font->glyphs, SwfdecFontEntry, i).shape); + if (font->glyphs) { + for (i = 0; i < font->glyphs->len; i++) { + g_object_unref (g_array_index (font->glyphs, SwfdecFontEntry, i).shape); + } + g_array_free (font->glyphs, TRUE); + font->glyphs = NULL; } - if (font->desc) + if (font->desc) { pango_font_description_free (font->desc); - g_free (font->name); + font->desc = NULL; + } + if (font->name) { + g_free (font->name); + font->name = NULL; + } - G_OBJECT_CLASS (swfdec_font_parent_class)->dispose (G_OBJECT (font)); + G_OBJECT_CLASS (swfdec_font_parent_class)->dispose (object); } static void diff-tree 23af06e2fcd39f80bd13b10ee02d57eb7b0e9aee (from 9068d5785dee8a9575cbf88e8b8813a0a69d9d89) Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Tue Apr 3 09:44:35 2007 +0200 Unref the cached value when disposing the SwfdecCached. diff --git a/libswfdec/swfdec_cached.c b/libswfdec/swfdec_cached.c index aa6a694..b7216e6 100644 --- a/libswfdec/swfdec_cached.c +++ b/libswfdec/swfdec_cached.c @@ -32,7 +32,7 @@ swfdec_cached_dispose (GObject *object) { SwfdecCached * cached = SWFDEC_CACHED (object); - swfdec_cached_unload (cached); + swfdec_cached_set_cache (cached, NULL); G_OBJECT_CLASS (swfdec_cached_parent_class)->dispose (object); } @@ -54,7 +54,6 @@ void swfdec_cached_set_cache (SwfdecCached *cached, SwfdecCache *cache) { g_return_if_fail (SWFDEC_IS_CACHED (cached)); - g_return_if_fail (cache != NULL); if (cached->cache) { if (cached->handle.unload) diff-tree 9068d5785dee8a9575cbf88e8b8813a0a69d9d89 (from 079bedb48b51463f22ccd91ddf24a8a5a1f18618) Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Thu Mar 22 19:35:11 2007 +0000 Free the path data when disposing the morph shape. ==18759== 2,048 bytes in 2 blocks are definitely lost in loss record 83 of 101 ==18759== at 0x402171B: realloc (vg_replace_malloc.c:306) ==18759== by 0x4E7BB7A: g_realloc (gmem.c:168) ==18759== by 0x40664FA: swfdec_path_ensure_size (swfdec_shape.c:72) ==18759== by 0x4066B48: swfdec_path_append (swfdec_shape.c:128) ==18759== by 0x4066C29: swfdec_shape_accumulate_one_polygon (swfdec_shape.c:472) ==18759== by 0x4067159: swfdec_shape_accumulate_one_fill (swfdec_shape.c:529) ==18759== by 0x4067583: swfdec_shape_initialize_from_sub_paths (swfdec_shape.c:580) ==18759== by 0x40680B9: tag_define_morph_shape (swfdec_shape.c:995) ==18759== by 0x406D5C2: swfdec_swf_decoder_parse (swfdec_swf_decoder.c:298) ==18759== by 0x40507DE: swfdec_loader_target_parse_default (swfdec_loadertarget.c:109) ==18759== by 0x4050ADA: swfdec_loader_target_parse (swfdec_loadertarget.c:160) ==18759== by 0x404E858: swfdec_loader_parse (swfdec_loader.c:409) diff --git a/libswfdec/swfdec_morphshape.c b/libswfdec/swfdec_morphshape.c index 06e8a9d..623e790 100644 --- a/libswfdec/swfdec_morphshape.c +++ b/libswfdec/swfdec_morphshape.c @@ -52,9 +52,15 @@ swfdec_graphic_create_movie (SwfdecGraph static void swfdec_morph_shape_dispose (GObject *object) { - SwfdecMorphShape *shape = SWFDEC_MORPH_SHAPE (object); + SwfdecMorphShape *morph = SWFDEC_MORPH_SHAPE (object); + guint i; - g_array_free (shape->end_vecs, TRUE); + if (morph->end_vecs != NULL) { + for (i = 0; i < morph->end_vecs->len; i++) + g_free (g_array_index (morph->end_vecs, SwfdecShapeVec, i).path.data); + g_array_free (morph->end_vecs, TRUE); + morph->end_vecs = NULL; + } G_OBJECT_CLASS (swfdec_morph_shape_parent_class)->dispose (object); } diff-tree 079bedb48b51463f22ccd91ddf24a8a5a1f18618 (from 0598ab8797606c967fb2087d9cfffd4be175e432) Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Tue Apr 3 09:38:33 2007 +0200 Fix minor leak of function_name. diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 0aff14c..21c1fff 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -1680,7 +1680,7 @@ swfdec_action_define_function (JSContext gboolean v2 = (action == 0x8e); swfdec_bits_init_data (&bits, data, len); - function_name = swfdec_bits_get_string (&bits); + function_name = swfdec_bits_skip_string (&bits); if (function_name == NULL) { SWFDEC_ERROR ("could not parse function name"); return JS_FALSE; diff-tree 0598ab8797606c967fb2087d9cfffd4be175e432 (from 06570fb5489008d491213428b25be15716f6e448) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 09:16:30 2007 +0200 fix a leak which caused whole videos to be leaked You notice 5MB per leak at some point... diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 681e401..b0bcd4d 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -395,6 +395,7 @@ swfdec_net_stream_set_url (SwfdecNetStre /* FIXME: use the connection once connections are implemented */ loader = swfdec_player_load (stream->player, url); swfdec_net_stream_set_loader (stream, loader); + g_object_unref (loader); } void diff-tree 06570fb5489008d491213428b25be15716f6e448 (from c9974a9671427543b289eb19eb556d4b890aa8c1) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 09:03:14 2007 +0200 fix a memleak diff --git a/libswfdec/swfdec_video.c b/libswfdec/swfdec_video.c index f163ffd..a044606 100644 --- a/libswfdec/swfdec_video.c +++ b/libswfdec/swfdec_video.c @@ -119,16 +119,19 @@ swfdec_video_input_disconnect (SwfdecVid static SwfdecVideoMovieInput * swfdec_video_input_new (SwfdecVideo *video) { - SwfdecVideoInput *input = g_new0 (SwfdecVideoInput, 1); - + SwfdecVideoInput *input; + if (video->n_frames == 0) return NULL; if (video->codec == NULL) return NULL; + input = g_new0 (SwfdecVideoInput, 1); if (video->codec) input->decoder = swfdec_video_codec_init (video->codec); - if (input->decoder == NULL) + if (input->decoder == NULL) { + g_free (input); return NULL; + } input->input.connect = swfdec_video_input_connect; input->input.iterate = swfdec_video_input_iterate; input->input.disconnect = swfdec_video_input_disconnect; diff-tree c9974a9671427543b289eb19eb556d4b890aa8c1 (from 2bd12763b607d0729b0c97b7900599220d4f479c) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 09:01:47 2007 +0200 include the file name in error messages diff --git a/libswfdec-gtk/swfdec_gtk_loader.c b/libswfdec-gtk/swfdec_gtk_loader.c index 643fb3e..4b1e57f 100644 --- a/libswfdec-gtk/swfdec_gtk_loader.c +++ b/libswfdec-gtk/swfdec_gtk_loader.c @@ -105,7 +105,10 @@ swfdec_gtk_loader_read_cb (GnomeVFSAsync gtk->handle = NULL; return; } else if (result != GNOME_VFS_OK) { - swfdec_loader_error (loader, gnome_vfs_result_to_string (result)); + char *err = g_strdup_printf ("%s: %s", loader->url, + gnome_vfs_result_to_string (result)); + swfdec_loader_error (loader, err); + g_free (err); swfdec_buffer_unref (gtk->current_buffer); gtk->current_buffer = NULL; gnome_vfs_async_cancel (gtk->handle); @@ -141,7 +144,10 @@ swfdec_gtk_loader_open_cb (GnomeVFSAsync SwfdecLoader *loader = loaderp; if (result != GNOME_VFS_OK) { - swfdec_loader_error (loader, gnome_vfs_result_to_string (result)); + char *err = g_strdup_printf ("%s: %s", loader->url, + gnome_vfs_result_to_string (result)); + swfdec_loader_error (loader, err); + g_free (err); gnome_vfs_async_cancel (gtk->handle); gtk->handle = NULL; return; diff-tree 2bd12763b607d0729b0c97b7900599220d4f479c (from b3030fd82079172d16451d6c265077cc21a60802) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 09:01:23 2007 +0200 Do not ref the player anymore Using a refcount was a good idea when SwfdecSource was seperate. Now it's used from the player itself, so it'll get into a refcount loop. We use weak references instead, so it's theoretically possible to use the source outside of a player. It'll remove itself when the player goes away. diff --git a/libswfdec-gtk/swfdec_source.c b/libswfdec-gtk/swfdec_source.c index f001de3..10d0f0e 100644 --- a/libswfdec-gtk/swfdec_source.c +++ b/libswfdec-gtk/swfdec_source.c @@ -34,7 +34,7 @@ my_time_val_difference (const GTimeVal * typedef struct _SwfdecIterateSource SwfdecIterateSource; struct _SwfdecIterateSource { GSource source; - SwfdecPlayer * player; + SwfdecPlayer * player; /* player we manage or NULL if player was deleted */ double speed; /* inverse playback speed (so 0.5 means double speed) */ gulong notify; /* set for iterate notifications */ GTimeVal last; /* last time */ @@ -47,6 +47,7 @@ swfdec_iterate_get_msecs_to_next_event ( GTimeVal now; glong diff; + g_assert (source->player); diff = swfdec_player_get_next_event (source->player); if (diff == 0) return G_MAXLONG; @@ -62,7 +63,13 @@ swfdec_iterate_get_msecs_to_next_event ( static gboolean swfdec_iterate_prepare (GSource *source, gint *timeout) { - glong diff = swfdec_iterate_get_msecs_to_next_event (source); + glong diff; + + diff = swfdec_iterate_get_msecs_to_next_event (source); + if (((SwfdecIterateSource *) source)->player == NULL) { + *timeout = 0; + return TRUE; + } if (diff == G_MAXLONG) { *timeout = -1; @@ -79,8 +86,11 @@ swfdec_iterate_prepare (GSource *source, static gboolean swfdec_iterate_check (GSource *source) { - glong diff = swfdec_iterate_get_msecs_to_next_event (source); - + glong diff; + + if (((SwfdecIterateSource *) source)->player == NULL) + return 0; + diff = swfdec_iterate_get_msecs_to_next_event (source); return diff < 0; } @@ -88,8 +98,11 @@ static gboolean swfdec_iterate_dispatch (GSource *source_, GSourceFunc callback, gpointer user_data) { SwfdecIterateSource *source = (SwfdecIterateSource *) source_; - glong diff = swfdec_iterate_get_msecs_to_next_event (source_); - + glong diff; + + if (source->player == NULL) + return FALSE; + diff = swfdec_iterate_get_msecs_to_next_event (source_); if (diff > 0) return TRUE; diff = swfdec_player_get_next_event (source->player) - diff; @@ -105,7 +118,9 @@ swfdec_iterate_finalize (GSource *source if (source->notify) { g_signal_handler_disconnect (source->player, source->notify); } - g_object_unref (source->player); + if (source->player) { + g_object_remove_weak_pointer (G_OBJECT (source->player), (gpointer *) &source->player); + } } GSourceFuncs swfdec_iterate_funcs = { @@ -132,7 +147,8 @@ swfdec_iterate_source_new (SwfdecPlayer source = (SwfdecIterateSource *) g_source_new (&swfdec_iterate_funcs, sizeof (SwfdecIterateSource)); - source->player = g_object_ref (player); + source->player = player; + g_object_add_weak_pointer (G_OBJECT (source->player), (gpointer *) &source->player); source->speed = 1.0 / speed; source->notify = g_signal_connect (player, "advance", G_CALLBACK (swfdec_iterate_source_advance_cb), source); diff-tree b3030fd82079172d16451d6c265077cc21a60802 (from ea7b64b68489721b867fef1edf55c809de2e2b8a) Author: Benjamin Otte <otte@gnome.org> Date: Tue Apr 3 09:00:34 2007 +0200 Do not ref the player anymore Using a refcount was a good idea when SwfdecPlayback was seperate. Now it's used from the player itself, so it'll get into a refcount loop. diff --git a/libswfdec-gtk/swfdec_playback_alsa.c b/libswfdec-gtk/swfdec_playback_alsa.c index b6a2f1a..ee4da3e 100644 --- a/libswfdec-gtk/swfdec_playback_alsa.c +++ b/libswfdec-gtk/swfdec_playback_alsa.c @@ -318,7 +318,7 @@ swfdec_playback_open (SwfdecPlayer *play g_return_val_if_fail (context != NULL, NULL); sound = g_new0 (SwfdecPlayback, 1); - sound->player = g_object_ref (player); + sound->player = player; g_signal_connect (player, "advance", G_CALLBACK (advance_before), sound); g_signal_connect (player, "audio-added", G_CALLBACK (audio_added), sound); g_signal_connect (player, "audio-removed", G_CALLBACK (audio_removed), sound); @@ -346,7 +346,6 @@ swfdec_playback_close (SwfdecPlayback *s REMOVE_HANDLER (sound->player, advance_before, sound); REMOVE_HANDLER (sound->player, audio_added, sound); REMOVE_HANDLER (sound->player, audio_removed, sound); - g_object_unref (sound->player); g_main_context_unref (sound->context); g_free (sound); } diff-tree ea7b64b68489721b867fef1edf55c809de2e2b8a (from cba7ba2518e522d3f695d41a7f4c8dc4d1d19da8) Author: Benjamin Otte <otte@gnome.org> Date: Mon Apr 2 17:38:29 2007 +0200 this debugging message is not that important diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 99363f9..681e401 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -225,7 +225,7 @@ swfdec_net_stream_loader_target_parse (S return; } if (!loader->eof && swfdec_buffer_queue_get_depth (loader->queue) == 0) { - SWFDEC_WARNING ("nothing to parse?!"); + SWFDEC_INFO ("nothing to do"); return; } if (stream->flvdecoder == NULL) {
Maybe Matching Threads
- Branch 'as' - 17 commits - configure.ac doc/Makefile.am doc/swfdec-docs.sgml doc/swfdec-sections.txt doc/swfdec.types libswfdec-gtk/Makefile.am libswfdec-gtk/swfdec-gtk.h libswfdec-gtk/swfdec_gtk_loader.c libswfdec-gtk/swfdec_gtk_loader.h
- 15 commits - configure.ac doc/Makefile.am doc/swfdec-docs.sgml doc/swfdec-sections.txt doc/swfdec.types libswfdec-gtk/.gitignore libswfdec-gtk/Makefile.am libswfdec-gtk/swfdec-gtk.h libswfdec-gtk/swfdec_gtk_player.c libswfdec-gtk/swfdec_gtk_player.h
- Branch 'vivi' - 2 commits - libswfdec-gtk/swfdec_source.c vivified/ui
- 9 commits - libswfdec-gtk/swfdec_source.c libswfdec/swfdec_marshal.list libswfdec/swfdec_player.c libswfdec/swfdec_player.h libswfdec/swfdec_player_internal.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_swf_instance.c test/dump.c test/Makefile.am
- 4 commits - libswfdec-gtk/swfdec_gtk_loader.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_load_object.c