1 /* $Id: mve_main.c,v 1.2 2003/02/19 00:42:40 btb Exp $ */
2 
3 #ifdef HAVE_CONFIG_H
4 #include <conf.h>
5 #endif
6 
7 #include <string.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <unistd.h>
12 
13 #include <SDL.h>
14 
15 #include "mvelib.h"
16 
17 #define SWAPINT(x)   (((x)<<24) | (((unsigned int)(x)) >> 24) | (((x) &0x0000ff00) << 8) | (((x) & 0x00ff0000) >> 8))
18 
19 #define MAX_FILES 256
20 
21 extern int g_spdFactorNum;
22 extern int g_sdlVidFlags;
23 extern int g_loop;
24 
25 void initializeMovie(MVESTREAM *mve);
26 void playMovie(MVESTREAM *mve);
27 void shutdownMovie(MVESTREAM *mve);
28 
usage(void)29 static void usage(void)
30 {
31     fprintf(stderr, "usage: mveplay [-f] [-l] [-s <n>] [<mvlfile>] <filename>\n"
32 			"-f\tFullscreen mode\n"
33 			"-s\tSpeed Factor <n>\n"
34 			);
35     exit(1);
36 }
37 
doPlay(int filehandle)38 static int doPlay(int filehandle)
39 {
40     MVESTREAM *mve = mve_open_filehandle(filehandle);
41     if (mve == NULL) {
42         fprintf(stderr, "can't open MVE file\n");
43 		exit(1);
44 	}
45 
46     initializeMovie(mve);
47     playMovie(mve);
48     shutdownMovie(mve);
49 
50     mve_close_filehandle(mve);
51 
52     return 1;
53 }
54 
main(int argc,char * argv[])55 int main(int argc, char *argv[])
56 {
57 	int i, filehandle;
58 	char *mvlfile = NULL, *mvefile = NULL;
59 
60 	for (i = 1; i < argc; i++) {
61 		if (!strcmp(argv[i], "-h"))
62 			usage();
63 
64 		if (!strcmp(argv[i], "-f"))
65 			g_sdlVidFlags |= SDL_FULLSCREEN;
66 
67 		if (!strcmp(argv[i], "-l"))
68 			g_loop = 1;
69 
70 		if (!strcmp(argv[i], "-s")) {
71 			if (argc < i + 2)
72 				usage();
73 			g_spdFactorNum = atoi(argv[i + 1]);
74 			i++;
75 		}
76 
77 		if (strchr(argv[i], '.') && !strcasecmp(strchr(argv[i], '.'), ".mvl"))
78 			mvlfile = argv[i];
79 
80 		if (strchr(argv[i], '.') && !strcasecmp(strchr(argv[i], '.'), ".mve"))
81 			mvefile = argv[i];
82 	}
83 
84 	if (mvlfile) {
85 		int nfiles;
86 		char filename[MAX_FILES][13];
87 		int filesize[MAX_FILES];
88 		char sig[4];
89 
90 #ifdef O_BINARY
91 		filehandle = open(mvlfile, O_RDONLY | O_BINARY);
92 #else
93 		filehandle = open(mvlfile, O_RDONLY);
94 #endif
95 		if (filehandle == -1) {
96 			fprintf(stderr, "Error opening %s\n", mvlfile);
97 			exit(1);
98 		}
99 		if ((read(filehandle, sig, 4) < 4) ||
100 			(strncmp(sig, "DMVL", 4)) ||
101 			(read(filehandle, &nfiles, 4) < 4)) {
102 			fprintf(stderr, "Error reading %s\n", mvlfile);
103 			exit(1);
104 		}
105 #ifdef WORDS_BIGENDIAN
106 		nfiles = SWAPINT(nfiles);
107 #endif
108 		if (nfiles > MAX_FILES) {
109 			fprintf(stderr, "Error reading %s: nfiles = %d, MAX_FILES = %d\n",
110 					mvlfile, nfiles, MAX_FILES);
111 		}
112 		for (i = 0; i < nfiles; i++) {
113 			if ((read(filehandle, filename[i], 13) < 13) ||
114 				(read(filehandle, &filesize[i], 4) < 4) ||
115 				(strlen(filename[i]) > 12))	{
116 				fprintf(stderr, "Error reading %s\n", mvlfile);
117 				exit(1);
118 			}
119 #ifdef WORDS_BIGENDIAN
120 			filesize[i] = SWAPINT(filesize[i]);
121 #endif
122 		}
123 
124 		for (i = 0; i < nfiles; i++) {
125 			if (mvefile) {
126 				if (!strcasecmp(filename[i], mvefile))
127 					break;
128 				else
129 					lseek(filehandle, filesize[i], SEEK_CUR);
130 			} else
131 				printf("%13s\t%d\n", filename[i], filesize[i]);
132 		}
133 		if (!mvefile)
134 			exit(0);
135 
136 	} else if (mvefile) {
137 #ifdef O_BINARY
138 		filehandle = open(mvefile, O_RDONLY | O_BINARY);
139 #else
140 		filehandle = open(mvefile, O_RDONLY);
141 #endif
142 	} else
143 		usage();
144 
145     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
146     {
147         fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
148         exit(1);
149     }
150     atexit(SDL_Quit);
151 
152 	doPlay(filehandle);
153 
154 	return 0;
155 }
156