OSDN Git Service

create_detail を create_detail(=calloc)と input_detail(=parse)に分解
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 14 Oct 2008 14:20:05 +0000 (14:20 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 14 Oct 2008 14:20:05 +0000 (14:20 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@73 7c90b180-03d5-4157-b861-58a559ae9d1e

14 files changed:
src/swf_object.c
src/swf_tag.c
src/swf_tag.h
src/swf_tag_action.c
src/swf_tag_action.h
src/swf_tag_edit.c
src/swf_tag_edit.h
src/swf_tag_jpeg.c
src/swf_tag_jpeg.h
src/swf_tag_lossless.c
src/swf_tag_lossless.h
src/swf_tag_sound.c
src/swf_tag_sound.h
src/swfed.c

index f42b5c7..bbf69fa 100644 (file)
@@ -402,7 +402,7 @@ swf_object_get_actiondata(swf_object_t *swf, unsigned long *length, int tag_seqn
     if ((tag->tag != 12) &&  (tag->tag != 59)) { //  DoAction, DoInitAction
         return NULL;
     }
-    swf_tag_create_detail(tag, swf);
+    swf_tag_create_input_detail(tag, swf);
     swf_tag_action = (swf_tag_action_detail_t *) tag->detail;
     *length = swf_tag_action->action_record_len;
     return swf_tag_action->action_record;
index 3b00094..c6b0f31 100644 (file)
@@ -215,7 +215,7 @@ swf_tag_print(swf_tag_t *tag, struct swf_object_ *swf) {
     printf("\n");
     if (tag_info && tag_info->detail_handler) {
         if (tag->detail == NULL) {
-            swf_tag_create_detail(tag, swf);
+            swf_tag_create_input_detail(tag, swf);
         }
         swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
         if (detail_handler->print) {
@@ -224,25 +224,31 @@ swf_tag_print(swf_tag_t *tag, struct swf_object_ *swf) {
     }
 }
 
-int swf_tag_create_detail(swf_tag_t *tag, struct swf_object_ *swf) {
+int swf_tag_create_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
     swf_tag_info_t *tag_info;
     if (tag == NULL) {
-        fprintf(stderr, "swf_tag_create_detail: tag == NULL\n");
+        fprintf(stderr, "swf_tag_create_input_detail: tag == NULL\n");
         return 1;
     }
     tag_info = get_swf_tag_info(tag->tag);
     if (tag_info && tag_info->detail_handler) {
+        int result;
         swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
         if (detail_handler->create == NULL) {
             fprintf(stderr, "detail_handler->create == NULL (tag=%d)\n",
                     tag->tag);
             return 1;
         }
-        tag->detail = detail_handler->create(tag->data, tag->length, tag, swf);
+        tag->detail = detail_handler->create();
         if (tag->detail == NULL) {
             fprintf(stderr, "can't create tag detail (tag=%d)\n", tag->tag);
             return 1;
         }
+        result = detail_handler->input(tag->data, tag->length, tag, swf);
+        if (result) {
+            fprintf(stderr, "can't input tag detail (result=%d)\n", result);
+            return 1;
+        }
     }
     return 1;
 }
@@ -260,7 +266,7 @@ swf_tag_get_jpeg_data(swf_tag_t *tag, unsigned long *length, int image_id, swf_t
         return NULL;
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_get_jpeg_data: Can't create tag\n");
@@ -297,7 +303,7 @@ swf_tag_get_alpha_data(swf_tag_t *tag, unsigned long *length, int image_id) {
         }
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_get_alpha_data: Can't create tag\n");
@@ -331,7 +337,7 @@ swf_tag_replace_jpeg_data(swf_tag_t *tag, int image_id,
         }
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_replace_jpeg_data: Can't create tag\n");
@@ -361,7 +367,7 @@ swf_tag_get_png_data(swf_tag_t *tag, unsigned long *length, int image_id) {
         return NULL;
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_get_png_data: Can't create tag\n");
@@ -393,7 +399,7 @@ swf_tag_replace_png_data(swf_tag_t *tag, int image_id,
         }
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_replace_png_data: Can't create tag\n");
@@ -426,7 +432,7 @@ swf_tag_get_sound_data(swf_tag_t *tag, unsigned long *length, int sound_id) {
         return NULL;
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_get_sound_data: Can't create tag detail\n");
@@ -458,7 +464,7 @@ swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id,
         }
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, NULL);
+        swf_tag_create_input_detail(tag, NULL);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_replace_melog_data: Can't create tag\n");
@@ -486,7 +492,7 @@ swf_tag_get_edit_string(swf_tag_t *tag,
         return NULL;
     }
     if (! tag->detail) {
-        swf_tag_create_detail(tag, swf);
+        swf_tag_create_input_detail(tag, swf);
     }
     if (! tag->detail) {
         fprintf(stderr, "Can't create tag\n");
@@ -512,7 +518,7 @@ swf_tag_replace_edit_string(swf_tag_t *tag,
     }
     
     if (! tag->detail) {
-        swf_tag_create_detail(tag, swf);
+        swf_tag_create_input_detail(tag, swf);
     }
     if (! tag->detail) {
         fprintf(stderr, "swf_tag_replace_edit_string: Can't create tag\n");
index e14dd3a..d571ce1 100644 (file)
@@ -22,7 +22,8 @@ typedef struct swf_tag_ {
 } swf_tag_t;
 
 typedef struct swf_tag_detail_handler_ {
-    void          * (*create)   (unsigned char *data,
+    void          * (*create)   (void);
+    int             (*input)    (unsigned char *data,
                                  unsigned long length,
                                  swf_tag_t *tag,
                                  struct swf_object_ *swf);
index 7e0b9e5..a1c6b58 100644 (file)
@@ -15,6 +15,7 @@ swf_tag_detail_handler_t action_detail_handler;
 swf_tag_detail_handler_t *
 swf_tag_action_detail_handler(void) {
     action_detail_handler.create   = swf_tag_action_create_detail;
+    action_detail_handler.input    = swf_tag_action_input_detail;
     action_detail_handler.identity = swf_tag_action_identity_detail;
     action_detail_handler.output   = swf_tag_action_output_detail;
     action_detail_handler.print    = swf_tag_action_print_detail;
@@ -23,19 +24,33 @@ swf_tag_action_detail_handler(void) {
 }
 
 void *
-swf_tag_action_create_detail(unsigned char *data,
-                             unsigned long length,
-                             swf_tag_t *tag,
-                             struct swf_object_ *swf) {
+swf_tag_action_create_detail(void) {
     swf_tag_action_detail_t *swf_tag_action;
-    bitstream_t *bs;
-    unsigned long pos, len;
-    (void) swf;
     swf_tag_action = calloc(sizeof(*swf_tag_action), 1);
     if (swf_tag_action == NULL) {
         fprintf(stderr, "ERROR: swf_tag_action_create_detail: can't calloc\n");
         return NULL;
     }
+    swf_tag_action->action_sprite = 0;
+    swf_tag_action->action_record = NULL;
+    swf_tag_action->action_record_len = 0;
+    return swf_tag_action;
+}
+
+int
+swf_tag_action_input_detail(unsigned char *data,
+                            unsigned long length,
+                            swf_tag_t *tag,
+                            struct swf_object_ *swf) {
+    swf_tag_action_detail_t *swf_tag_action;
+    bitstream_t *bs;
+    unsigned long pos, len;
+    (void) swf;
+    swf_tag_action = tag->detail;
+    if (swf_tag_action == NULL) {
+        fprintf(stderr, "ERROR: swf_tag_action_create_detail: swf_tag_action == NULL\n");
+        return 1;
+    }
     bs = bitstream_open();
     bitstream_input(bs, data, length);
 
@@ -49,7 +64,7 @@ swf_tag_action_create_detail(unsigned char *data,
     swf_tag_action->action_record = bitstream_output_sub(bs, pos, len);
     swf_tag_action->action_record_len = len;
     bitstream_close(bs);
-    return (void *) swf_tag_action;
+    return 0;
 }
 
 int swf_tag_action_identity_detail(unsigned char *data, int id,
index f785baf..3cbc5ee 100644 (file)
@@ -18,10 +18,11 @@ typedef struct swf_tag_action_detail_ {
 
 extern swf_tag_detail_handler_t *swf_tag_action_detail_handler(void);
 
-extern void *swf_tag_action_create_detail(unsigned char *data,
-                                          unsigned long length,
-                                          swf_tag_t *tag,
-                                          struct swf_object_ *swf);
+extern void *swf_tag_action_create_detail(void);
+extern int swf_tag_action_input_detail(unsigned char *data,
+                                        unsigned long length,
+                                        swf_tag_t *tag,
+                                        struct swf_object_ *swf);
 extern int swf_tag_action_identity_detail(unsigned char *data, int id,
                                           swf_tag_t *tag);
 extern unsigned char *swf_tag_action_output_detail(void *detail,
index 15c9917..d7e80b9 100644 (file)
@@ -16,6 +16,7 @@ swf_tag_detail_handler_t edit_detail_handler;
 swf_tag_detail_handler_t *
 swf_tag_edit_detail_handler(void) {
     edit_detail_handler.create   = swf_tag_edit_create_detail;
+    edit_detail_handler.input    = swf_tag_edit_input_detail;
     edit_detail_handler.identity = swf_tag_edit_identity_detail;
     edit_detail_handler.output   = swf_tag_edit_output_detail;
     edit_detail_handler.print    = swf_tag_edit_print_detail;
@@ -23,17 +24,29 @@ swf_tag_edit_detail_handler(void) {
     return &edit_detail_handler;
 }
 
+
 void *
-swf_tag_edit_create_detail(unsigned char *data, unsigned long length,
+swf_tag_edit_create_detail(void) {
+    swf_tag_edit_detail_t *swf_tag_edit;
+    swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
+    if (swf_tag_edit == NULL) {
+        fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
+        return NULL;
+    }
+    return swf_tag_edit;
+}
+
+int
+swf_tag_edit_input_detail(unsigned char *data, unsigned long length,
                            swf_tag_t *tag,
                            struct swf_object_ *swf) {
     swf_tag_edit_detail_t *swf_tag_edit;
     bitstream_t *bs;
     (void) tag;
-    swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
+    swf_tag_edit = tag->detail;
     if (swf_tag_edit == NULL) {
-        fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
-        return NULL;
+        fprintf(stderr, "ERROR: swf_tag_edit_input_detail: swf_tag_edit == NULL\n");
+        return 1;
     }
     bs = bitstream_open();
     bitstream_input(bs, data, length);
@@ -86,7 +99,7 @@ swf_tag_edit_create_detail(unsigned char *data, unsigned long length,
     }
     
     bitstream_close(bs);
-    return (void *) swf_tag_edit;
+    return 0;
 }
 
 int swf_tag_edit_identity_detail(unsigned char *data, int id,
index 977acf7..53fc210 100644 (file)
@@ -49,10 +49,11 @@ typedef struct swf_tag_edit_detail_ {
 
 extern swf_tag_detail_handler_t *swf_tag_edit_detail_handler(void);
 
-extern void *swf_tag_edit_create_detail(unsigned char *data,
-                                        unsigned long length,
-                                        swf_tag_t *tag,
-                                        struct swf_object_ *swf);
+extern void *swf_tag_edit_create_detail(void);
+extern int swf_tag_edit_input_detail(unsigned char *data,
+                                     unsigned long length,
+                                     swf_tag_t *tag,
+                                     struct swf_object_ *swf);
 extern int swf_tag_edit_identity_detail(unsigned char *data, int id,
                                         swf_tag_t *tag);
 extern unsigned char *swf_tag_edit_output_detail(void *detail,
index b6c1c66..11fe180 100644 (file)
@@ -19,6 +19,7 @@ swf_tag_detail_handler_t jpeg_detail_handler;
 
 swf_tag_detail_handler_t *swf_tag_jpeg_detail_handler(void) {
     jpeg_detail_handler.create   = swf_tag_jpeg_create_detail;
+    jpeg_detail_handler.input    = swf_tag_jpeg_input_detail;
     jpeg_detail_handler.identity = swf_tag_jpeg_identity_detail;
     jpeg_detail_handler.output   = swf_tag_jpeg_output_detail;
     jpeg_detail_handler.print    = swf_tag_jpeg_print_detail;
@@ -27,7 +28,8 @@ swf_tag_detail_handler_t *swf_tag_jpeg_detail_handler(void) {
 }
 
 swf_tag_detail_handler_t *swf_tag_jpeg3_detail_handler(void) {
-    jpeg_detail_handler.create   = swf_tag_jpeg3_create_detail;
+    jpeg_detail_handler.create   = swf_tag_jpeg_create_detail;
+    jpeg_detail_handler.input    = swf_tag_jpeg3_input_detail;
     jpeg_detail_handler.identity = swf_tag_jpeg_identity_detail;
     jpeg_detail_handler.output   = swf_tag_jpeg3_output_detail;
     jpeg_detail_handler.print    = swf_tag_jpeg_print_detail;
@@ -36,17 +38,34 @@ swf_tag_detail_handler_t *swf_tag_jpeg3_detail_handler(void) {
 }
 
 void *
-swf_tag_jpeg_create_detail(unsigned char *data, unsigned long length,
+swf_tag_jpeg_create_detail(void) {
+    swf_tag_jpeg_detail_t *swf_tag_jpeg;
+    bitstream_t *bs;
+    swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+    if (swf_tag_jpeg == NULL) {
+        fprintf(stderr, "ERROR: swf_tag_jpeg_create_detail: can't calloc\n");
+        return NULL;
+    }
+    swf_tag_jpeg->image_id = -1;
+    swf_tag_jpeg->jpeg_data = NULL;
+    swf_tag_jpeg->jpeg_data_len = 0;
+    swf_tag_jpeg->alpha_data = NULL;
+    swf_tag_jpeg->alpha_data_len = 0;
+    return (void *) swf_tag_jpeg;
+}
+
+int
+swf_tag_jpeg_input_detail(unsigned char *data, unsigned long length,
                            swf_tag_t *tag,
                            struct swf_object_ *swf) {
     swf_tag_jpeg_detail_t *swf_tag_jpeg;
     bitstream_t *bs;
     (void) tag;
     (void) swf;
-    swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+    swf_tag_jpeg = tag->detail;
     if (swf_tag_jpeg == NULL) {
-        fprintf(stderr, "ERROR: swf_tag_jpeg_create_detail: can't calloc\n");
-        return NULL;
+        fprintf(stderr, "ERROR: swf_tag_jpeg_input_detail: swf_tag_jpeg == NULL\n");
+        return 1;
     }
     bs = bitstream_open();
     bitstream_input(bs, data, length);
@@ -56,14 +75,14 @@ swf_tag_jpeg_create_detail(unsigned char *data, unsigned long length,
     swf_tag_jpeg->alpha_data = NULL;
     swf_tag_jpeg->alpha_data_len = 0;
     bitstream_close(bs);
-    return (void *) swf_tag_jpeg;
+    return 0;
 }
 
-void *
-swf_tag_jpeg3_create_detail(unsigned char *data,
-                            unsigned long length,
-                            swf_tag_t *tag,
-                            struct swf_object_ *swf) {
+int
+swf_tag_jpeg3_input_detail(unsigned char *data,
+                           unsigned long length,
+                           swf_tag_t *tag,
+                           struct swf_object_ *swf) {
     swf_tag_jpeg_detail_t *swf_tag_jpeg;
     unsigned long offset_to_alpha;
     bitstream_t *bs;
@@ -73,10 +92,10 @@ swf_tag_jpeg3_create_detail(unsigned char *data,
     int result;
     (void) tag;
     (void) swf;
-    swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+    swf_tag_jpeg = tag->detail;
     if (swf_tag_jpeg == NULL) {
-        fprintf(stderr, "swf_tag_jpeg_create_detail: can't calloc\n");
-        return NULL;
+        fprintf(stderr, "ERROR: swf_tag_jpeg3_input_detail: swf_tag_jpeg == NULL\n");
+        return 1;
     }
     bs = bitstream_open();
     bitstream_input(bs, data, length);
@@ -88,19 +107,18 @@ swf_tag_jpeg3_create_detail(unsigned char *data,
         free(swf_tag_jpeg);
         bitstream_close(bs);
         fprintf(stderr, "swf_tag_jpeg3_create_detail: swf_tag_jpeg->jpeg_data\n");
-        return NULL;
+        return 1;
     }
     
     swf_tag_jpeg->jpeg_data_len = offset_to_alpha;
     offset = 2 + 4 + offset_to_alpha;
     alpha_data_len = length - offset;
     origsize = 256 * alpha_data_len;
-    new_buff = malloc(origsize);
+    new_buff = malloc(origsize); // enough size
     old_buff_ref = bitstream_buffer(bs, offset);
     result = uncompress(new_buff, &origsize, old_buff_ref, alpha_data_len);
     if (result == Z_OK) {
         swf_tag_jpeg->alpha_data = realloc(new_buff, origsize);
-        swf_tag_jpeg->alpha_data = new_buff;
         swf_tag_jpeg->alpha_data_len = origsize;
     } else {
         if (result == Z_MEM_ERROR) {
@@ -115,7 +133,8 @@ swf_tag_jpeg3_create_detail(unsigned char *data,
         free(new_buff);
     }
     bitstream_close(bs);
-    return (void *) swf_tag_jpeg;
+    (void *) swf_tag_jpeg;
+    return 0;
 }
 
 int
@@ -281,7 +300,7 @@ swf_tag_jpeg_replace_jpeg_data(void *detail, int image_id,
                                unsigned long jpeg_data_len,
                                unsigned char *alpha_data,
                                unsigned long alpha_data_len,
-                                          swf_tag_t *tag) {
+                               swf_tag_t *tag) {
     swf_tag_jpeg_detail_t *swf_tag_jpeg = (swf_tag_jpeg_detail_t *) detail;
     if (detail == NULL) {
         fprintf(stderr, "swf_tag_jpeg_replace_jpeg_data: detail == NULL\n");
index f208fb0..a20052a 100644 (file)
@@ -21,10 +21,16 @@ typedef struct swf_tag_jpeg_detail_ {
 extern swf_tag_detail_handler_t *swf_tag_jpeg_detail_handler(void);
 extern swf_tag_detail_handler_t *swf_tag_jpeg3_detail_handler(void);
 
-extern void *swf_tag_jpeg_create_detail(unsigned char *data,
-                                        unsigned long length,
-                                        swf_tag_t *tag,
-                                        struct swf_object_ *swf);
+extern void *swf_tag_jpeg_create_detail(void);
+
+extern int swf_tag_jpeg_input_detail(unsigned char *data,
+                                     unsigned long length,
+                                     swf_tag_t *tag,
+                                     struct swf_object_ *swf);
+extern int swf_tag_jpeg3_input_detail(unsigned char *data,
+                                      unsigned long length,
+                                      swf_tag_t *tag,
+                                      struct swf_object_ *swf);
 extern int swf_tag_jpeg_identity_detail(unsigned char *data, int id,
                                         swf_tag_t *tag);
 extern void *swf_tag_jpeg3_create_detail(unsigned char *data,
index ef6d360..2091a90 100644 (file)
@@ -17,6 +17,7 @@ swf_tag_detail_handler_t lossless_detail_handler;
 
 swf_tag_detail_handler_t *swf_tag_lossless_detail_handler(void) {
     lossless_detail_handler.create   = swf_tag_lossless_create_detail;
+    lossless_detail_handler.input    = swf_tag_lossless_input_detail;
     lossless_detail_handler.identity = swf_tag_lossless_identity_detail;
     lossless_detail_handler.output   = swf_tag_lossless_output_detail;
     lossless_detail_handler.print    = swf_tag_lossless_print_detail;
@@ -25,7 +26,18 @@ swf_tag_detail_handler_t *swf_tag_lossless_detail_handler(void) {
 }
 
 void *
-swf_tag_lossless_create_detail(unsigned char *data,
+swf_tag_lossless_create_detail(void) {
+    swf_tag_lossless_detail_t *swf_tag_lossless;
+    swf_tag_lossless = calloc(sizeof(*swf_tag_lossless), 1);
+    if (swf_tag_lossless == NULL) {
+        fprintf(stderr, "swf_tag_lossless_create_detail: can't calloc swf_tag_lossless\n");
+        return NULL;
+    }
+    return swf_tag_lossless;
+}
+
+int
+swf_tag_lossless_input_detail(unsigned char *data,
                                unsigned long length,
                                swf_tag_t *tag,
                                struct swf_object_ *swf) {
@@ -36,12 +48,12 @@ swf_tag_lossless_create_detail(unsigned char *data,
     unsigned char *tmp_buff, *old_buff_ref;
     unsigned long origsize, old_size, offset;
     int result;
-    
-    swf_tag_lossless = calloc(sizeof(*swf_tag_lossless), 1);
+    swf_tag_lossless = tag->detail;
     if (swf_tag_lossless == NULL) {
-        fprintf(stderr, "swf_tag_lossless_create_detail: can't calloc swf_tag_lossless\n");
-        return NULL;
+        fprintf(stderr, "swf_tag_lossless_input_detail: swf_tag_lossless == NULL\n");
+        return 1;
     }
+
     bs = bitstream_open();
     bitstream_input(bs, data, length);
     swf_tag_lossless->image_id = bitstream_getbytesLE(bs, 2);
@@ -76,7 +88,7 @@ swf_tag_lossless_create_detail(unsigned char *data,
             }
             free(tmp_buff);
             bitstream_close(bs);
-            return NULL;
+            return 1;
         }
         if (indices_len != origsize - bytes_per_color * swf_tag_lossless->colormap_count) {
             fprintf(stderr, "swf_tag_lossless_create_detail: indices_len(%lu) != origsize(%lu) - %d * swf_tag_lossless->colormap_count(%d) at line(%d)\n",
@@ -84,7 +96,7 @@ swf_tag_lossless_create_detail(unsigned char *data,
                     swf_tag_lossless->colormap_count, __LINE__);
             free(tmp_buff);
             bitstream_close(bs);
-            return NULL;
+            return 1;
         }
         bs2 = bitstream_open();
         bitstream_input(bs2, tmp_buff, origsize);
@@ -128,7 +140,7 @@ swf_tag_lossless_create_detail(unsigned char *data,
             }
             free(tmp_buff);
             bitstream_close(bs);
-            return NULL;
+            return 1;
         }
         bs2 = bitstream_open();
         bitstream_input(bs2, tmp_buff, origsize);
@@ -149,7 +161,8 @@ swf_tag_lossless_create_detail(unsigned char *data,
         free(tmp_buff);
     }
     bitstream_close(bs);
-    return (void *) swf_tag_lossless;
+    return 0;
+
 }
 
 int
index 11a4156..08a95cd 100644 (file)
@@ -29,24 +29,17 @@ typedef struct swf_tag_lossless_detail_ {
 
 extern swf_tag_detail_handler_t *swf_tag_lossless_detail_handler(void);
 
-extern void *swf_tag_lossless_create_detail(unsigned char *data,
-                                            unsigned long length,
-                                            swf_tag_t *tag,
-                                            struct swf_object_ *swf);
-extern void *swf_tag_lossless2_create_detail(unsigned char *data,
-                                             unsigned long length,
-                                             swf_tag_t *tag,
-                                             struct swf_object_ *swf);
+extern void *swf_tag_lossless_create_detail(void);
+extern int swf_tag_lossless_input_detail(unsigned char *data,
+                                         unsigned long length,
+                                         swf_tag_t *tag,
+                                         struct swf_object_ *swf);
 extern int swf_tag_lossless_identity_detail(unsigned char *data, int id,
                                             swf_tag_t *tag);
 extern unsigned char *swf_tag_lossless_output_detail(void *detail,
                                                      unsigned long *length,
                                                      swf_tag_t *tag,
                                                      struct swf_object_ *swf);
-extern unsigned char *swf_tag_lossless2_output_detail(void *detail,
-                                                      unsigned long *length,
-                                                      swf_tag_t *tag,
-                                                      struct swf_object_ *swf);
 extern void swf_tag_lossless_print_detail(void *detail,
                                           swf_tag_t *tag,
                                           struct swf_object_ *swf);
index d36697e..8d18f9c 100644 (file)
@@ -15,6 +15,7 @@ swf_tag_detail_handler_t sound_detail_handler;
 swf_tag_detail_handler_t *
 swf_tag_sound_detail_handler(void) {
     sound_detail_handler.create   = swf_tag_sound_create_detail;
+    sound_detail_handler.input    = swf_tag_sound_input_detail;
     sound_detail_handler.identity = swf_tag_sound_identity_detail;
     sound_detail_handler.output   = swf_tag_sound_output_detail;
     sound_detail_handler.print    = swf_tag_sound_print_detail;
@@ -23,19 +24,29 @@ swf_tag_sound_detail_handler(void) {
 }
 
 void *
-swf_tag_sound_create_detail(unsigned char *data, unsigned long length,
-                           swf_tag_t *tag,
-                           struct swf_object_ *swf) {
+swf_tag_sound_create_detail(void) {
+    swf_tag_sound_detail_t *swf_tag_sound;
+    swf_tag_sound = calloc(sizeof(*swf_tag_sound), 1);
+    if (swf_tag_sound == NULL) {
+        fprintf(stderr, "ERROR: swf_tag_sound_create_detail: can't calloc\n");
+        return NULL;
+    }
+}
+
+int
+swf_tag_sound_input_detail(unsigned char *data, unsigned long length,
+                            swf_tag_t *tag,
+                            struct swf_object_ *swf) {
     swf_tag_sound_detail_t *swf_tag_sound;
     bitstream_t *bs;
     unsigned long sound_data_len;
     unsigned char *sound_data_ref;
     (void) tag;
     (void) swf;
-    swf_tag_sound = calloc(sizeof(*swf_tag_sound), 1);
+    swf_tag_sound = tag->detail;
     if (swf_tag_sound == NULL) {
-        fprintf(stderr, "ERROR: swf_tag_sound_create_detail: can't calloc\n");
-        return NULL;
+        fprintf(stderr, "ERROR: swf_tag_sound_input_detail: swf_tag_sound == NULL\n");
+        return 1;
     }
     bs = bitstream_open();
     bitstream_input(bs, data, length);
@@ -51,13 +62,13 @@ swf_tag_sound_create_detail(unsigned char *data, unsigned long length,
         fprintf(stderr, "swf_tag_sound_create_detail: swf_tag_sound->sound_data == NULL at line(%d): sound_data_len=%lu\n",
                 __LINE__, sound_data_len);
         bitstream_close(bs);
-        return NULL;
+        return 1;
     }
     sound_data_ref = bitstream_buffer(bs, bitstream_getbytepos(bs));
     memcpy(swf_tag_sound->sound_data, sound_data_ref, sound_data_len);
     swf_tag_sound->sound_data_len = sound_data_len;
     bitstream_close(bs);
-    return (void *) swf_tag_sound;
+    return 0;
 }
 
 int
index c9d7d3c..e872591 100644 (file)
@@ -22,10 +22,11 @@ typedef struct swf_tag_sound_detail_ {
 
 extern swf_tag_detail_handler_t *swf_tag_sound_detail_handler(void);
 
-extern void *swf_tag_sound_create_detail(unsigned char *data,
-                                         unsigned long length,
-                                         swf_tag_t *tag,
-                                         struct swf_object_ *swf);
+extern void *swf_tag_sound_create_detail(void);
+extern int swf_tag_sound_input_detail(unsigned char *data,
+                                      unsigned long length,
+                                      swf_tag_t *tag,
+                                      struct swf_object_ *swf);
 extern int swf_tag_sound_identity_detail(unsigned char *data, int id,
                                          swf_tag_t *tag);
 extern unsigned char *swf_tag_sound_output_detail(void *detail,
index 345108d..5394631 100644 (file)
@@ -371,7 +371,7 @@ PHP_METHOD(swfed, getTagDetail) {
     if ((tag_info == NULL) || (tag_info->detail_handler == NULL)) {
         RETURN_FALSE;
     }
-    swf_tag_create_detail(tag, swf);
+    swf_tag_create_input_detail(tag, swf);
     switch (tag->tag) {
         swf_tag_jpeg_detail_t     *tag_jpeg;
         swf_tag_lossless_detail_t *tag_lossless;