[Swfdec] 4 commits - libswfdec/swfdec_bits.c libswfdec/swfdec_compiler.c libswfdec/swfdec_sprite.c

Benjamin Otte company at kemper.freedesktop.org
Fri Feb 2 14:10:19 PST 2007


 libswfdec/swfdec_bits.c     |    4 +++-
 libswfdec/swfdec_compiler.c |    6 +++++-
 libswfdec/swfdec_sprite.c   |   26 ++++++++++++++------------
 3 files changed, 22 insertions(+), 14 deletions(-)

New commits:
diff-tree 12bf86eb10e873ca735fad310d7ab9e517f6662b (from b144bf362ce73d4a739663f8a28261eb317f45be)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Feb 2 18:59:45 2007 +0100

    Finish compiling at end of bitstream, too, not just with 0 action

diff --git a/libswfdec/swfdec_compiler.c b/libswfdec/swfdec_compiler.c
index abeec0b..68221e3 100644
--- a/libswfdec/swfdec_compiler.c
+++ b/libswfdec/swfdec_compiler.c
@@ -559,6 +559,10 @@ compile_push (CompileState *state, guint
     switch (type) {
       case 0: /* string */
 	s = swfdec_bits_skip_string (state->bits);
+	if (s) {
+	  compile_state_error (state, "Push: Could not get string");
+	  return;
+	}
 	compile_state_debug_add (state, "Push \"%s\"", s);
 	push_string (state, s);
 	break;
@@ -1300,7 +1304,7 @@ swfdec_compile (SwfdecPlayer *player, Sw
     name = "Unnamed script";
   compile_state_init (player->jscx, bits, version, &state);
   SWFDEC_INFO ("Creating new script in frame");
-  while ((action = swfdec_bits_get_u8 (bits))) {
+  while (swfdec_bits_left (bits) && (action = swfdec_bits_get_u8 (bits))) {
     if (action & 0x80) {
       len = swfdec_bits_get_u16 (bits);
     } else {
diff-tree b144bf362ce73d4a739663f8a28261eb317f45be (from c93579e07522e43a3d4d3ba9927d50ee74d5d5cb)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Feb 2 18:59:15 2007 +0100

    Clean up parsing of actions in PlaceObject2

diff --git a/libswfdec/swfdec_sprite.c b/libswfdec/swfdec_sprite.c
index 440c3b8..9201218 100644
--- a/libswfdec/swfdec_sprite.c
+++ b/libswfdec/swfdec_sprite.c
@@ -395,10 +395,13 @@ swfdec_spriteseg_place_object_2 (SwfdecS
     else
       script_name = g_strdup_printf ("Sprite%u", SWFDEC_CHARACTER (content->graphic)->id);
     while ((event_flags = swfdec_get_clipeventflags (s, bits)) != 0) {
-      guint tmp = swfdec_bits_get_u32 (bits);
-      SwfdecBits save = *bits;
-      swfdec_bits_skip_bytes (&save, tmp);
-
+      guint length = swfdec_bits_get_u32 (bits);
+      SwfdecBits action_bits;
+      SwfdecBuffer *buffer = swfdec_bits_get_buffer (bits, length);
+
+      if (buffer == NULL)
+	break;
+      swfdec_bits_init (&action_bits, buffer);
       if (event_flags & SWFDEC_EVENT_KEY_PRESS)
 	key_code = swfdec_bits_get_u8 (bits);
       else
@@ -413,14 +416,13 @@ swfdec_spriteseg_place_object_2 (SwfdecS
       }
       if (content->events == NULL)
 	content->events = swfdec_event_list_new (SWFDEC_DECODER (s)->player);
-      swfdec_event_list_parse (content->events, &s->b, s->version, 
+      swfdec_event_list_parse (content->events, &action_bits, s->version, 
 	  event_flags, key_code, script_name);
-      if (bits->ptr != save.ptr) {
-	SWFDEC_ERROR ("record size and actual parsed action differ by %d bytes",
-	    (int) (save.ptr - bits->ptr));
+      if (swfdec_bits_left (&action_bits)) {
+	SWFDEC_ERROR ("not all action data was parsed: %u bytes left",
+	    swfdec_bits_left (&action_bits));
       }
-      /* FIXME: who should we trust with parsing here? */
-      *bits = save;
+      swfdec_buffer_unref (buffer);
     }
     g_free (script_name);
   }
diff-tree c93579e07522e43a3d4d3ba9927d50ee74d5d5cb (from f8448012991988e247c42ba67603b46e29a8d59f)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Feb 2 18:58:14 2007 +0100

    when checking available bits fails, consume all bits

diff --git a/libswfdec/swfdec_bits.c b/libswfdec/swfdec_bits.c
index f9f2749..fb18394 100644
--- a/libswfdec/swfdec_bits.c
+++ b/libswfdec/swfdec_bits.c
@@ -55,7 +55,9 @@ swfdec_bits_left (SwfdecBits *b)
 
 #define SWFDEC_BITS_CHECK(b,n) G_STMT_START { \
   if (swfdec_bits_left(b) < (n)) { \
-    SWFDEC_ERROR("reading past end of buffer"); \
+    SWFDEC_ERROR ("reading past end of buffer"); \
+    b->ptr = b->end; \
+    b->idx = 0; \
     return 0; \
   } \
 }G_STMT_END
diff-tree f8448012991988e247c42ba67603b46e29a8d59f (from a7b8850adba4086c321e69c8933f6248b3de0803)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Feb 2 15:32:35 2007 +0100

    Set clip depth correctly
    
    Real depths get 16384 subtracted when reading from a file,
    this is necessary for clip depths, too.

diff --git a/libswfdec/swfdec_sprite.c b/libswfdec/swfdec_sprite.c
index ffb8eb7..440c3b8 100644
--- a/libswfdec/swfdec_sprite.c
+++ b/libswfdec/swfdec_sprite.c
@@ -376,8 +376,8 @@ swfdec_spriteseg_place_object_2 (SwfdecS
     SWFDEC_LOG ("  name = %s", content->name);
   }
   if (has_clip_depth) {
-    content->clip_depth = swfdec_bits_get_u16 (bits);
-    SWFDEC_LOG ("  clip_depth = %d (=> %d)", content->clip_depth, content->clip_depth - 16384);
+    content->clip_depth = swfdec_bits_get_u16 (bits) - 16384;
+    SWFDEC_LOG ("  clip_depth = %d (=> %d)", content->clip_depth + 16384, content->clip_depth);
   }
   if (has_clip_actions) {
     int reserved, clip_event_flags, event_flags, key_code;


More information about the Swfdec mailing list