OSDN Git Service

jpeg size(width, height) 取得ルーチンを追加
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Sun, 10 Oct 2010 16:30:15 +0000 (16:30 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Sun, 10 Oct 2010 16:30:15 +0000 (16:30 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@237 7c90b180-03d5-4157-b861-58a559ae9d1e

src/config.m4
src/jpeg_size.c [new file with mode: 0644]
src/jpeg_size.h [new file with mode: 0644]

index e31f63c..18533a1 100644 (file)
@@ -63,7 +63,7 @@ if test "$PHP_SWFED" != "no"; then
 
   PHP_NEW_EXTENSION(swfed, php_swfed.c \
        swf_object.c swf_header.c swf_tag.c bitstream.c swf_debug.c \
-       swf_jpeg.c jpeg_segment.c swf_png.c swf_gif.c \
+       swf_jpeg.c jpeg_segment.c jpeg_size.c swf_png.c swf_gif.c \
        swf_rgb.c swf_rgba.c swf_argb.c swf_xrgb.c \
        swf_rect.c swf_matrix.c swf_action.c \
        swf_shape_with_style.c swf_styles.c swf_fill_style_array.c \
@@ -76,4 +76,3 @@ if test "$PHP_SWFED" != "no"; then
        swf_tag_sound.c swf_tag_sprite.c swf_tag_shape.c \
        , $ext_shared)
 fi
-
diff --git a/src/jpeg_size.c b/src/jpeg_size.c
new file mode 100644 (file)
index 0000000..0ce547d
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+  gcc -W -Wall -D__JPEG_SIZE_DEBUG__ jpeg_size.c jpeg_segment.c  bitstream.c
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "jpeg_segment.h"
+
+int jpeg_size(unsigned char *data, unsigned long data_len,
+              int *width, int *height) {
+    jpeg_segment_t *jpeg_seg;
+    jpeg_segment_node_t *node;
+    jpeg_seg = jpeg_segment_parse(data, data_len, 0);
+    for (node = jpeg_seg->head ; node ; node = node->next) {
+        if ((0xC0 <= node->marker) && (node->marker <= 0xCF)) { // SOF
+            *width  = 0x100 * node->data_ref[3] + node->data_ref[4];
+            *height = 0x100 * node->data_ref[1] + node->data_ref[2];
+            jpeg_segment_destroy(jpeg_seg);
+            return 0;
+        }
+    }
+    jpeg_segment_destroy(jpeg_seg);
+    return 1;
+}
+
+#ifdef __JPEG_SIZE_DEBUG__  /* for component debug */
+
+#include <sys/stat.h>
+
+int main(int argc, char **argv) {
+    char *filename;
+    struct stat sbuf;
+    FILE *fp = NULL;
+    unsigned char *data;
+    unsigned long data_len;
+    int width = 0, height = 0;
+    int ret;
+    if (argc != 2) {
+        fprintf(stderr, "Usage: %s <jpeg_infile>\n", argv[0]);
+        return EXIT_FAILURE;
+    }
+    filename = argv[1];
+    if (stat(filename, &sbuf)) {
+        fprintf(stderr, "Can't stat file(%s)\n", filename);
+        return EXIT_FAILURE;
+    }
+    data_len = sbuf.st_size;
+    fp = fopen(filename, "rb");
+    if (fp == NULL) {
+        fprintf(stderr, "Can't open infile(%s)\n", filename);
+        return EXIT_FAILURE;
+    }
+    data = malloc(data_len);
+    if (fread(data, 1, data_len, fp) != data_len) {
+        fclose(fp);
+        return 1;
+    }
+    fclose(fp);
+    ret = jpeg_size(data, data_len, &width, &height);
+    free(data);
+    if (ret) {
+        fprintf(stderr, "Can't get jpeg size(%s)\n", filename);
+        return EXIT_FAILURE;
+    }
+    printf("width=%d height=%d\n", width, height);
+    return EXIT_SUCCESS;
+}
+
+#endif /* __JPEG_SIZE_DEBUG__ */
diff --git a/src/jpeg_size.h b/src/jpeg_size.h
new file mode 100644 (file)
index 0000000..a6818b9
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+  +----------------------------------------------------------------------+
+  | Author: yoya@awm.jp                                                  |
+  +----------------------------------------------------------------------+
+*/
+
+
+#ifndef __JPEG_SIZE_H__
+#define __JPEG_SIZE_H__
+
+extern int jpeg_size(unsigned char *data, unsigned long data_len,
+                     int *width, int *height);
+
+#endif /* __JPEG_SEGMENT_H__ */