root/morphix/trunk/fbmngplay-0.5a/fbmngplay-0.5a/fbmngplay.c

Revision 2, 4.9 kB (checked in by nextime, 2 years ago)

Initial import, branching from morphix svn

Line 
1 /*
2  *      fbmngplay - fb console MNG player.
3  *      (c) 2001-2002 by Stefan Reinauer, <stepan@suse.de>
4  * 
5  *      This program is based on mngplay, written and (C) by
6  *      Ralph Giles <giles@ashlu.bc.ca>
7  *
8  *      This program my be redistributed under the terms of the
9  *      GNU General Public Licence, version 2, or at your preference,
10  *      any later version.
11  */
12
13 #include <unistd.h>
14 #include <fcntl.h>
15 #include <getopt.h>
16 #include <sys/mman.h>
17 #include <sys/ioctl.h>
18 #include <linux/fb.h>
19 #include <signal.h>
20
21 #include "fbmngplay.h"
22 #include "messages.h"
23 #include "console.h"
24 #include "mng.h"
25
26 volatile int run = 1;
27 int verbose = 0;
28 int buffered = 0;
29 int waitsignal = 0;
30 int delta = 16;
31 int sconly=0;
32
33 /*
34  * Signal handlers
35  */
36
37 void sigint_handler(int sig)
38 {
39         if (waitsignal)
40                 return;
41         run = 2;
42 }
43
44 void sigterm_handler(int sig)
45 {
46         if (waitsignal)
47                 return;
48         restore_area();
49         run = 0;
50 }
51
52 void sigusr1_handler(int sig)
53 {
54         signal(SIGUSR1, SIG_IGN);
55         run = 0;
56 }
57
58 /*
59  * Main loop
60  */
61
62 int main(int argc, char *argv[])
63 {
64         int fbdev,c,option_index;
65         unsigned int alpha;
66         struct fb_var_screeninfo var;
67         struct fb_fix_screeninfo fix;
68
69         /* Check which console we're running on */
70         init_consoles();
71                
72         /* allocate our stream data structure */
73         mng = (mngstuff *) calloc(1, sizeof(*mng));
74         if (mng == NULL) {
75                 fprintf(stderr, "could not allocate stream structure.\n");
76                 exit(0);
77         }
78
79         alpha = 100;
80         mng->alpha = 100;
81         mng->fbx = 15;
82         mng->fby = 15;
83         mng->background = NULL;
84
85         while (1) {
86                 static struct option long_options[] = {
87                         {"help", 0, 0, 'h'},
88                         {"verbose", 0, 0, 'v'},
89                         {"alpha", 1, 0, 'a'},
90                         {"buffered", 0, 0, 'b'},
91                         {"signal", 0, 0, 's'},
92                         {"delta", 0, 0, 'd'},
93                         {"version", 0, 0, 'V'},
94                         {"start-console",0,0,'S'},
95                         {"console",1,0,'c'},
96                         {0, 0, 0, 0}
97                 };
98
99                 c = getopt_long(argc, argv, "a:x:y:bh?vsd:VSc:",
100                                 long_options, &option_index);
101
102                 if (c == -1)
103                         break;
104
105                 switch (c) {
106                 case 'a':
107                         alpha = atoi(optarg);
108                         if (alpha > 100)
109                                 alpha = 100;
110                         mng->alpha = alpha;
111                         break;
112                 case 'x':
113                         mng->fbx = atoi(optarg);
114                         break;
115                 case 'y':
116                         mng->fby = atoi(optarg);
117                         break;
118                 case 'd':
119                         delta = atoi(optarg);
120                         break;
121                 case '?':
122                 case 'h':
123                         usage(argv[0]);
124                         exit(0);
125                 case 'v':
126                         verbose = 1;
127                         break;
128                 case 's':
129                         waitsignal = 1;
130                         break;
131                 case 'b':
132                         buffered = 1;
133                         break;
134                 case 'V':
135                         version();
136                         exit(0);
137                 case 'c':
138                         start_console=atoi(optarg)-1;
139                 case 'S':
140                         sconly=1;
141                         break;
142                 default:
143                         break;
144                 }
145         }
146 #if 0
147         if (!output && optind >= argc) {
148 #else
149         if (optind >= argc) {
150 #endif
151                 printf("Which files do you want to play?\n");
152                 exit(0);
153         }
154
155         /* Initialize framebuffer */
156         fbdev = open("/dev/fb0", O_RDWR);
157         if (fbdev < 0) {
158                 fprintf(stderr, "error while opening framebuffer.\n");
159                 exit(fbdev);
160         }
161
162         ioctl(fbdev, FBIOGET_VSCREENINFO, &var);
163         mng->fbwidth  = var.xres;
164         mng->fbheight = var.yres;
165         mng->fbbpp    = var.bits_per_pixel;
166
167         mng->fbredo   = var.red.offset;
168         mng->fbgreeno = var.green.offset;
169         mng->fbblueo  = var.blue.offset;
170         mng->fbredl   = var.red.length;
171         mng->fbgreenl = var.green.length;
172         mng->fbbluel  = var.blue.length;
173
174         /* Display might have a line length unequal
175          * the visible line.
176          */
177         ioctl(fbdev, FBIOGET_FSCREENINFO, &fix);
178         mng->fbrow = fix.line_length;
179
180         mng->display =
181             mmap(NULL, mng->fbrow * mng->fbheight ,
182                  PROT_WRITE | PROT_READ, MAP_SHARED, fbdev, 0);
183 #if 0
184         if (output)
185                 prepare_output();
186 #endif
187         /* arrange to call the shutdown routine before we exit */
188         atexit(&cleanup);
189
190         while (optind < argc) {
191                 /* leftover arguements are filenames. */
192                 mng->filename = argv[optind++];
193
194                 /* set up the mng decoder for our stream */
195                 mng->mng = mng_initialize(mng, mngalloc, mngfree, MNG_NULL);
196                 if (mng->mng == MNG_NULL) {
197                         fprintf(stderr, "could not initialize libmng.\n");
198                         exit(1);
199                 }
200
201                 /* set the callbacks */
202                 mng_setcb_errorproc(mng->mng, mngerror);
203                 mng_setcb_openstream(mng->mng, mngopenstream);
204                 mng_setcb_closestream(mng->mng, mngclosestream);
205                 mng_setcb_readdata(mng->mng, mngreadstream);
206                 mng_setcb_gettickcount(mng->mng, mnggetticks);
207                 mng_setcb_settimer(mng->mng, mngsettimer);
208                 mng_setcb_processheader(mng->mng, mngprocessheader);
209                 mng_setcb_getcanvasline(mng->mng, mnggetcanvasline);
210                 mng_setcb_refresh(mng->mng, mngrefresh);
211
212                 signal(SIGINT, sigint_handler);
213                 signal(SIGTERM, sigterm_handler);
214
215                 mng_readdisplay(mng->mng);
216
217                 /* loop though the frames */
218                 while (mng->delay && run) {
219                         usleep(mng->delay * 1000);
220                         mng->delay = 0;
221                         mng_display_resume(mng->mng);
222                         if (run == 2) {
223                                 if (mng->alpha == 0)
224                                         run = 0;
225                                 mng->alpha -= delta;
226                                 if (mng->alpha < 0)
227                                         mng->alpha = 0;
228                         }
229                 }
230
231                 if (waitsignal && optind < argc) {
232                         signal(SIGUSR1, sigusr1_handler);
233                         run = 1;
234                         while (run) {
235                                 sleep(2);
236                         }
237                 }
238
239                 memset(mng->copybuffer, 0,
240                        4 * mng->width * mng->height);
241                 run = 1;
242                 mng->alpha = alpha;
243                 if (optind == argc) {   /* last file */
244                         restore_area();
245                 }
246         }
247
248         /* cleanup and quit */
249         return mngquit(mng->mng);
250 }
Note: See TracBrowser for help on using the browser.