Commit f7599d5f authored by Alex Beregszaszi's avatar Alex Beregszaszi

cws2fws, utility to convert compressed flash files to uncompressed ones, which...

cws2fws, utility to convert compressed flash files to uncompressed ones, which can be than played back with ffplay. note: this doesn't gets compiled automatically

Originally committed as revision 3598 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent b2a2197e
...@@ -112,6 +112,9 @@ output_example$(EXESUF): output_example.o .libs ...@@ -112,6 +112,9 @@ output_example$(EXESUF): output_example.o .libs
qt-faststart$(EXESUF): qt-faststart.c qt-faststart$(EXESUF): qt-faststart.c
$(CC) $(SRC_PATH)/qt-faststart.c -o qt-faststart$(EXESUF) $(CC) $(SRC_PATH)/qt-faststart.c -o qt-faststart$(EXESUF)
cws2fws$(EXESUF): cws2fws.c
$(CC) $(SRC_PATH)/cws2fws.c -o cws2fws$(EXESUF) -lz
ffplay.o: ffplay.c ffplay.o: ffplay.c
$(CC) $(CFLAGS) $(SDL_CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) $(SDL_CFLAGS) -c -o $@ $<
......
/*
* cws2fws by Alex Beregszaszi <alex@fsn.hu>
*
* This utility converts compressed Macromedia Flash files to uncompressed ones.
*
*/
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <zlib.h>
#ifdef DEBUG
#define dbgprintf printf
#else
#define dbgprintf
#endif
main(int argc, char *argv[])
{
int fd_in, fd_out, comp_len, uncomp_len, tag, i, last_out;
char buf_in[1024], buf_out[1024];
z_stream zstream;
struct stat statbuf;
if (argc < 3)
{
printf("Usage: %s <infile.swf> <outfile.swf>\n", argv[0]);
exit(1);
}
fd_in = open(argv[1], O_RDONLY);
if (fd_in < 0)
{
perror("Error while opening: ");
exit(1);
}
fd_out = open(argv[2], O_WRONLY|O_CREAT, 00644);
if (fd_out < 0)
{
perror("Error while opening: ");
close(fd_in);
exit(1);
}
if (read(fd_in, &buf_in, 8) != 8)
{
printf("Header error\n");
close(fd_in);
close(fd_out);
exit(1);
}
if (buf_in[0] != 'C' || buf_in[1] != 'W' || buf_in[2] != 'S')
{
printf("Not a compressed flash file\n");
exit(1);
}
fstat(fd_in, &statbuf);
comp_len = statbuf.st_size;
uncomp_len = buf_in[4] | (buf_in[5] << 8) | (buf_in[6] << 16) | (buf_in[7] << 24);
printf("Compressed size: %d Uncompressed size: %d\n", comp_len-4, uncomp_len-4);
// write out modified header
buf_in[0] = 'F';
write(fd_out, &buf_in, 8);
zstream.zalloc = NULL;
zstream.zfree = NULL;
zstream.opaque = NULL;
inflateInit(&zstream);
for (i = 0; i < comp_len-4;)
{
int ret, len = read(fd_in, &buf_in, 1024);
dbgprintf("read %d bytes\n", len);
last_out = zstream.total_out;
zstream.next_in = &buf_in[0];
zstream.avail_in = len;
zstream.next_out = &buf_out[0];
zstream.avail_out = 1024;
ret = inflate(&zstream, Z_SYNC_FLUSH);
if (ret == Z_STREAM_END || ret == Z_BUF_ERROR)
break;
if (ret != Z_OK)
{
printf("Error while decompressing: %d\n", ret);
inflateEnd(&zstream);
exit(1);
}
dbgprintf("a_in: %d t_in: %d a_out: %d t_out: %d -- %d out\n",
zstream.avail_in, zstream.total_in, zstream.avail_out, zstream.total_out,
zstream.total_out-last_out);
write(fd_out, &buf_out, zstream.total_out-last_out);
i += len;
}
if (zstream.total_out != uncomp_len-8)
{
printf("Size mismatch (%d != %d), updating header...\n",
zstream.total_out, uncomp_len-8);
buf_in[0] = (zstream.total_out+8) & 0xff;
buf_in[1] = (zstream.total_out+8 >> 8) & 0xff;
buf_in[2] = (zstream.total_out+8 >> 16) & 0xff;
buf_in[3] = (zstream.total_out+8 >> 24) & 0xff;
lseek(fd_out, 4, SEEK_SET);
write(fd_out, &buf_in, 4);
}
inflateEnd(&zstream);
close(fd_in);
close(fd_out);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment