X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fjpeg2swf.c;h=9981a15f65848e074403ad91742903b3d4c79716;hp=fad11522bd90b646909b79153713fb576677e9ca;hb=f29d8006b1d8253c50808d6eb4941bdeb808c601;hpb=5480f1eae83c641a75b225db52bbfc1fcb62e6b6 diff --git a/src/jpeg2swf.c b/src/jpeg2swf.c index fad1152..9981a15 100644 --- a/src/jpeg2swf.c +++ b/src/jpeg2swf.c @@ -42,8 +42,19 @@ struct { int verbose; char *outfile; int mx; + int next_id; + char *asset_name; + int version; + int fit_to_movie; + float scale; } global; +static int custom_move=0; +static int move_x=0; +static int move_y=0; +static int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; +static int custom_clip = 0; + typedef struct _image { char *filename; int quality; @@ -61,10 +72,20 @@ TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) memset(swf, 0x00, sizeof(SWF)); - swf->fileVersion = 4; + swf->fileVersion = global.version; swf->frameRate = (int)(256.0 * framerate); - swf->movieSize.xmax = dx * 20; - swf->movieSize.ymax = dy * 20; + + if(custom_clip) { + swf->movieSize.xmin = clip_x1 * 20; + swf->movieSize.ymin = clip_y1 * 20; + swf->movieSize.xmax = clip_x2 * 20; + swf->movieSize.ymax = clip_y2 * 20; + } else { + swf->movieSize.xmin = 0; + swf->movieSize.ymin = 0; + swf->movieSize.xmax = swf->movieSize.xmin + dx * 20; + swf->movieSize.ymax = swf->movieSize.ymin + dy * 20; + } t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); @@ -75,6 +96,10 @@ TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) t = swf_InsertTag(t, ST_DEFINEVIDEOSTREAM); swf_SetU16(t, 0xf00d); swf_SetVideoStreamDefine(t, &stream, 65535, dx, dy); + } else if (global.asset_name) { + t = swf_InsertTag(t, ST_DEFINESPRITE); + swf_SetU16(t, 1); + swf_SetU16(t, global.next_id++); } return t; @@ -83,6 +108,25 @@ TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) int MovieFinish(SWF * swf, TAG * t, char *sname) { int handle, so = fileno(stdout); + + if (global.asset_name) { + SWFPLACEOBJECT obj; + + t = swf_InsertTag(t, ST_END); + t = swf_InsertTag(t, ST_EXPORTASSETS); + swf_SetU16(t, 1); + swf_SetU16(t, 1); + swf_SetString(t, global.asset_name); + + t = swf_InsertTag(t, ST_PLACEOBJECT2); + swf_GetPlaceObject(0, &obj); + obj.depth = 1; + obj.id = 1; + swf_SetPlaceObject(t, &obj); + + t = swf_InsertTag(t, ST_SHOWFRAME); + } + t = swf_InsertTag(t, ST_END); if ((!isatty(so)) && (!sname)) @@ -92,8 +136,12 @@ int MovieFinish(SWF * swf, TAG * t, char *sname) sname = "output.swf"; handle = open(sname, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); } + if(handle<0 && sname) { + perror(sname); + } if (swf_WriteSWF(handle, swf)<0) - fprintf(stderr, "Unable to write output file: %s\n", sname); + fprintf(stderr, "Unable to write output file: %s\n", sname); + if (handle != so) close(handle); @@ -182,13 +230,14 @@ int getJPEG(char*filename, int* width, int* height, RGBA**pic2) int frame = 0; TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int quality, - int id, int width, int height) + int width, int height) { SHAPE *s; SRECT r; MATRIX m; int fs; - + int movie_width = swf->movieSize.xmax - swf->movieSize.xmin; + int movie_height = swf->movieSize.ymax - swf->movieSize.ymin; if(global.mx) { int sizex, sizey; @@ -204,7 +253,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int quality, t = swf_InsertTag(t, ST_VIDEOFRAME); swf_SetU16(t, 0xf00d); quant = 1+(30-(30*quality)/100); - if(!(frame&127)) { + if(!(frame%20)) { swf_SetVideoStreamIFrame(t, &stream, pic2, quant); } else { swf_SetVideoStreamPFrame(t, &stream, pic2, quant); @@ -225,37 +274,58 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int quality, t = swf_InsertTag(t, ST_SHOWFRAME); } else { t = swf_InsertTag(t, ST_DEFINEBITSJPEG2); - swf_SetU16(t, id); // id + swf_SetU16(t, global.next_id); // id swf_SetJPEGBits(t,sname,quality); t = swf_InsertTag(t, ST_DEFINESHAPE); swf_ShapeNew(&s); swf_GetMatrix(NULL, &m); - m.sx = 20 * 0x10000; - m.sy = 20 * 0x10000; - fs = swf_ShapeAddBitmapFillStyle(s, &m, id, 0); - swf_SetU16(t, id + 1); // id - r.xmin = r.ymin = 0; - r.xmax = width * 20; - r.ymax = height * 20; + if (global.fit_to_movie) { + m.sx = 0x10000 * movie_width / width; + m.sy = 0x10000 * movie_height / height; + width = movie_width / 20; + height = movie_height / 20; + } else { + m.sx = 20 * 0x10000; + m.sy = 20 * 0x10000; + } + m.tx = 0; + m.ty = 0; + fs = swf_ShapeAddBitmapFillStyle(s, &m, global.next_id, 1); + global.next_id++; + swf_SetU16(t, global.next_id); // id + r.xmin = 0; + r.ymin = 0; + r.xmax = r.xmin + width * 20; + r.ymax = r.ymin + height * 20; swf_SetRect(t, &r); swf_SetShapeHeader(t, s); - swf_ShapeSetAll(t, s, 0, 0, 0, fs, 0); - swf_ShapeSetLine(t, s, r.xmax, 0); - swf_ShapeSetLine(t, s, 0, r.ymax); - swf_ShapeSetLine(t, s, -r.xmax, 0); - swf_ShapeSetLine(t, s, 0, -r.ymax); + swf_ShapeSetAll(t, s, r.xmin, r.ymin, 0, fs, 0); + swf_ShapeSetLine(t, s, r.xmax - r.xmin, 0); + swf_ShapeSetLine(t, s, 0, r.ymax - r.ymin); + swf_ShapeSetLine(t, s, -r.xmax + r.xmin, 0); + swf_ShapeSetLine(t, s, 0, -r.ymax + r.ymin); swf_ShapeSetEnd(t); - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, 1); // depth + if(frame) { + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, 1); // depth + } t = swf_InsertTag(t, ST_PLACEOBJECT2); swf_GetMatrix(NULL, &m); - m.tx = (swf->movieSize.xmax - (int) width * 20) / 2; - m.ty = (swf->movieSize.ymax - (int) height * 20) / 2; - swf_ObjectPlace(t, id + 1, 1, &m, NULL, NULL); + m.sx = (int)(0x10000 * global.scale); + m.sy = (int)(0x10000 * global.scale); + if(custom_move) { + m.tx = move_x*20; + m.ty = move_y*20; + } else { + m.tx = (movie_width - (width * global.scale * 20)) / 2; + m.ty = (movie_height - (height * global.scale * 20)) / 2; + } + swf_ObjectPlace(t, global.next_id, 1, &m, NULL, NULL); + global.next_id++; t = swf_InsertTag(t, ST_SHOWFRAME); } frame++; @@ -355,19 +425,25 @@ int args_callback_option(char *arg, char *val) break; case 'v': - if (val) - global.verbose = atoi(val); - res = 1; + global.verbose++; + res = 0; break; +/* case 'q': + global.verbose--; + if(global.verbose<0) + global.verbose = 0; + res = 0; + break;*/ + case 'X': if (val) global.force_width = atoi(val); res = 1; break; - case 'm': - global.mx = 1; + case 'z': + global.version = 6; return 0; case 'Y': @@ -380,6 +456,72 @@ int args_callback_option(char *arg, char *val) printf("jpeg2swf - part of %s %s\n", PACKAGE, VERSION); exit(0); + case 'e': + if (val) + global.asset_name = val; + res = 1; + break; + + case 'T': + global.version = atoi(val); + res = 1; + break; + + case 'f': + global.fit_to_movie = 1; + res = 0; + break; + + case 'c': { + char*s = strdup(val); + char*x1 = strtok(s, ":"); + char*y1 = strtok(0, ":"); + char*x2 = strtok(0, ":"); + char*y2 = strtok(0, ":"); + if(!(x1 && y1 && x2 && y2)) { + fprintf(stderr, "-m option requires four arguments, :::\n"); + exit(1); + } + custom_clip = 1; + clip_x1 = atoi(x1); + clip_y1 = atoi(y1); + clip_x2 = atoi(x2); + clip_y2 = atoi(y2); + free(s); + + res = 1; + break; + } + + case 'M': { + global.mx = 1; + res = 1; + break; + } + + case 'm': { + char*s = strdup(val); + char*c = strchr(s, ':'); + if(!c) { + fprintf(stderr, "-m option requires two arguments, :\n"); + exit(1); + } + *c = 0; + custom_move = 1; + move_x = atoi(val); + move_y = atoi(c+1); + free(s); + + res = 1; + break; + } + + case 's': { + global.scale = atof(val)/100; + res = 1; + break; + } + default: res = -1; break; @@ -394,15 +536,22 @@ int args_callback_option(char *arg, char *val) return res; } -struct options_t options[] = { {"q", "quality"}, +static struct options_t options[] = { {"o", "output"}, -{"m", "mx"}, +{"q", "quality"}, {"r", "rate"}, -{"v", "verbose"}, +{"z", "zlib"}, +{"M", "mx"}, +{"x", "xoffset"}, +{"y", "yoffset"}, {"X", "width"}, {"Y", "height"}, +{"T", "flashversion"}, +{"v", "verbose"}, {"V", "version"}, -{0, 0}, +{"f", "fit-to-movie"}, +{"e", "export"}, +{0,0} }; int args_callback_longoption(char *name, char *val) @@ -433,29 +582,24 @@ int args_callback_command(char *arg, char *next) // actually used as filename void args_callback_usage(char *name) { - printf - ("Usage: %s [-options [value]] imagefiles[.jpg]|[.jpeg] [...]\n", - name); - printf - ("-o outputfile --output explicitly specify output file. (otherwise, output.swf will be used)\n"); - printf - ("-m --mx Use Flash MX H.263 compression (use for correlated images)\n"); - printf - ("-q quality --quality Set compression quality (1-100, 1=worst, 100=best)\n"); - printf - ("-r framerate --rate Set movie framerate (frames per second)\n"); - printf - ("-o outputfile --output Set name for SWF output file\n"); - printf - ("-X pixel --width Force movie width to pixel (default: autodetect)\n"); - printf - ("-Y pixel --height Force movie height to pixel (default: autodetect)\n"); - printf - ("-v level --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n"); - printf - ("-V --version Print version information and exit\n"); - printf - ("The following options can be set independently for each image: -q\n"); + printf("\n"); + printf("Usage: %s [-options [value]] imagefiles[.jpg]|[.jpeg] [...]\n", name); + printf("\n"); + printf("-o , --output Explicitly specify output file. (otherwise, output.swf will be used)\n"); + printf("-q , --quality Set compression quality (1-100, 1=worst, 100=best)\n"); + printf("-r , --rate Set movie framerate (frames per second)\n"); + printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("-M , --mx Use Flash MX H.263 compression (use for correlated images)\n"); + printf("-x , --xoffset horizontally offset images by \n"); + printf("-y , --yoffset vertically offset images by \n"); + printf("-X , --width Force movie width to (default: autodetect)\n"); + printf("-Y , --height Force movie height to (default: autodetect)\n"); + printf("-T , --flashversion Set flash file version to \n"); + printf("-v , --verbose Set verbose level to (0=quiet, 1=default, 2=debug)\n"); + printf("-V , --version Print version information and exit\n"); + printf("-f , --fit-to-movie Fit images to movie size\n"); + printf("-e , --export Make importable as asset with \n"); + printf("\n"); } @@ -469,26 +613,28 @@ int main(int argc, char **argv) global.quality = 60; global.framerate = 1.0; global.verbose = 1; - + global.version = 4; + global.asset_name = NULL; + global.next_id = 1; + global.fit_to_movie = 0; + global.scale = 1.0; + processargs(argc, argv); if (VERBOSE(2)) fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); t = MovieStart(&swf, global.framerate, - global.force_width ? global.force_width : global. - max_image_width, - global.force_height ? global.force_height : global. - max_image_height); + global.force_width ? global.force_width : (int)(global.max_image_width*global.scale), + global.force_height ? global.force_height : (int)(global.max_image_height*global.scale)); { int i; for (i = 0; i < global.nfiles; i++) { if (VERBOSE(3)) - fprintf(stderr, "[%03i] %s (%i%%, 1/%i)\n", i, + fprintf(stderr, "[%03i] %s (%i%%)\n", i, image[i].filename, image[i].quality); t = MovieAddFrame(&swf, t, image[i].filename, image[i].quality, - (i * 2) + 1, image[i].width, image[i].height); free(image[i].filename); }