source: titan/titan/fb.h @ 15297

Last change on this file since 15297 was 15296, checked in by nit, 12 years ago

update

File size: 10.2 KB
Line 
1#ifndef FB_H
2#define FB_H
3
4struct fb* getfb(char *name)
5{
6        debug(1000, "in");
7        struct fb *node = fb;
8
9        while(node != NULL)
10        {
11                if(strstr(node->name, name) != NULL)
12                {
13                        debug(1000, "out");
14                        return node;
15                }
16
17                node = node->next;
18        }
19        debug(100, "framebuffer not found (%s)", name);
20        return NULL;
21}
22
23long getfbsize(int dev)
24{
25        debug(1000, "in");
26        struct fb* node = fb;
27        unsigned long fbmemcount = 0;
28        struct fb_fix_screeninfo fix_screeninfo;
29
30        if(fb == NULL)
31        {
32                debug(1000, "out -> NULL dedect");
33                return 0;
34        }
35
36#ifndef NOFB
37        if(ioctl(fb->fd, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
38        {
39                perr("ioctl FBIOGET_FSCREENINFO failed");
40                return 0;
41        }
42#else
43        fix_screeninfo.smem_len = 16*1024*1024;
44#endif
45
46        while(node != NULL)
47        {
48                if(node->dev == dev)
49                        fbmemcount = fbmemcount + node->varfbsize;
50                node = node->next;
51        }
52
53        debug(1000, "out");
54        return fix_screeninfo.smem_len - fbmemcount;
55}
56
57struct fb* addfb(char *fbname, int dev, int width, int height, int colbytes, int fd, unsigned char* mmapfb, unsigned long fixfbsize)
58{
59        debug(1000, "in");
60        struct fb *newnode = NULL, *node = fb;
61        char *name = NULL;
62        long ret = 0;
63
64        name = ostrcat(fbname, "", 0, 0);
65        if(name == NULL)
66        {
67                err("no memory");
68                return NULL;
69        }
70
71        newnode = (struct fb*)malloc(sizeof(struct fb));       
72        if(newnode == NULL)
73        {
74                err("no memory");
75                free(name);
76                return NULL;
77        }
78
79        memset(newnode, 0, sizeof(struct fb));
80        newnode->name = name;
81        newnode->dev = dev;
82        newnode->width = width;
83        newnode->height = height;
84        newnode->colbytes = colbytes;
85        newnode->pitch = newnode->width * newnode->colbytes;
86        newnode->fb = mmapfb;
87        newnode->fblong = (unsigned long*)newnode->fb;
88        newnode->fd = fd;
89        newnode->fixfbsize = fixfbsize;
90       
91        if(ostrcmp(name, FB) == 0)
92                setfbvarsize(newnode);
93        else if(ostrcmp(name, FB1) == 0)
94                newnode->varfbsize = 720 * 576 * newnode->colbytes;
95        else
96                newnode->varfbsize = width * height * newnode->colbytes;
97
98        /*eigener Buffer zB fuer LCD*/
99        if(dev == 999)
100                return newnode;
101       
102        if(node != NULL)
103        {
104                while(node->next != NULL)
105                        node = node->next;
106                node->next = newnode;
107        }
108        else
109                fb = newnode;
110
111        ret = getfbsize(dev);
112        if(ret < 0)
113        {
114                err("framebuffermem (%s) to small, needed = %ld", name, ret * -1);
115                free(newnode);
116                if(newnode == fb) fb = NULL;
117                return NULL;
118        }
119
120        debug(100, "fbname=%s, fbwidth=%d, fbheight=%d, fbcol=%d, fbsize=%ld", newnode->name, newnode->width, newnode->height, newnode->colbytes, newnode->varfbsize);
121        debug(1000, "out");
122        return newnode;
123}
124
125void fb2png_thread()
126{
127        while (writeFBfile.buf1 != NULL || writeFBfile.buf2 != NULL) {
128                if(writeFBfile.buf1 != NULL) {
129                        writeFBfile.ActBuf = writeFBfile.buf1;
130                        fb2png(writeFBfile.buf1, 320, 240, "/tmp/titanlcd.png");
131                        free(writeFBfile.buf1); writeFBfile.buf1 = NULL;
132                        if(writeFBfile.buf2 != NULL)
133                                usleep(500000);
134                }
135                if(writeFBfile.buf2 != NULL) {
136                        writeFBfile.ActBuf = writeFBfile.buf2;
137                        fb2png(writeFBfile.buf2, 320, 240, "/tmp/titanlcd.png");
138                        free(writeFBfile.buf2); writeFBfile.buf2 = NULL;
139                        if(writeFBfile.buf1 != NULL)
140                                usleep(500000);
141                }
142        }
143        writeFBfile.ActBuf = NULL;
144}
145
146void delfb(char *name)
147{
148        debug(1000, "in");
149        struct fb *node = fb, *prev = fb;
150
151        while(node != NULL)
152        {
153                if(ostrcmp(node->name, name) == 0)
154                {
155                        if(node == fb)
156                                fb = node->next;
157                        else
158                                prev->next = node->next;
159
160                        free(node->name);
161                        node->name = NULL;
162
163                        free(node);
164                        node = NULL;
165                        break;
166                }
167
168                prev = node;
169                node = node->next;
170        }
171        debug(1000, "out");
172}
173
174void freefb()
175{
176        debug(1000, "in");
177        struct fb *node = fb, *prev = fb;
178
179        while(node != NULL)
180        {
181                prev = node;
182                node = node->next;
183                if(prev != NULL)
184                        delfb(prev->name);
185        }
186        debug(1000, "out");
187}
188
189struct fb* openfb(char *fbdev, int devnr)
190{
191        debug(1000, "in");
192        int fd = -1;
193        unsigned char *mmapfb = NULL;
194        struct fb_var_screeninfo var_screeninfo;
195        struct fb_fix_screeninfo fix_screeninfo;
196        struct fb* node = NULL;
197
198        if(fbdev == NULL)
199        {
200                err("failed to find fbdev in config file");
201                return NULL;
202        }
203
204#ifndef NOFB
205        fd = open(fbdev, O_RDWR);
206        if(fd == -1)
207        {
208                perr("failed to open %s", fbdev);
209                return NULL;
210        }
211        closeonexec(fd);
212
213        if(ioctl(fd, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
214        {
215                perr("ioctl FBIOGET_VSCREENINFO failed");
216                close(fd);
217                return NULL;
218        }
219
220        if(ioctl(fd, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
221        {
222                perr("ioctl FBIOGET_FSCREENINFO failed");
223                close(fd);
224                return NULL;
225        }
226
227        if(!(mmapfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)))
228        {
229                perr("mmap framebuffer");
230                close(fd);
231                return NULL;
232        }
233
234        if(devnr == 0)
235                node = addfb(FB, devnr, var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel / 8, fd, mmapfb, fix_screeninfo.smem_len);
236        if(devnr == 1)
237                node = addfb(FB1, devnr, var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel / 8, fd, mmapfb, fix_screeninfo.smem_len);
238
239#else
240
241        mmapfb = malloc(16 * 1024 * 1024);
242        if(devnr == 0)
243                node = addfb(FB, devnr, getconfigint("skinfbwidth", NULL), getconfigint("skinfbheight", NULL), 4, -1, mmapfb, 16*1024*1024);
244        if(devnr == 1)
245                node = addfb(FB1, devnr, getconfigint("skinfbwidth", NULL), getconfigint("skinfbheight", NULL), 4, -1, mmapfb, 16*1024*1024);
246
247#endif
248
249        debug(1000, "out");
250        return node;
251}
252
253void closefb()
254{
255        if(fb != NULL)
256        {
257                if(fb->fb != NULL)
258                        munmap(fb->fb, fb->fixfbsize);
259                if(fb->fd != -1)
260                        close(fb->fd);
261#ifdef NOFB
262        free(fb->fb);
263#endif
264        }
265}
266
267void clearfball()
268{
269        if(fb->fb != NULL)
270                memset(fb->fb, 0, fb->fixfbsize);
271}
272
273void clearfb(struct fb *node)
274{
275        if(node != NULL)
276                memset(node->fb, 0, node->varfbsize);
277}
278
279void blitfb(int flag)
280{
281        blitfb2(skinfb, flag);
282}
283
284void changefbresolution(char *value)
285{
286        if(ostrcmp("pal", value) == 0)
287        {
288                fb->width = 720;
289                fb->height = 576;
290                fb->pitch = fb->width * fb->colbytes;
291        }
292        else if(ostrncmp("576", value, 3) == 0)
293        {
294                fb->width = 720;
295                fb->height = 576;
296                fb->pitch = fb->width * fb->colbytes;
297        }
298        else if(ostrncmp("720", value, 3) == 0)
299        {
300                fb->width = 1280;
301                fb->height = 720;
302                fb->pitch = fb->width * fb->colbytes;
303        }
304        else if(ostrncmp("1080", value, 4) == 0)
305        {
306                fb->width = 1920;
307                fb->height = 1080;
308                fb->pitch = fb->width * fb->colbytes;
309        }
310        if(skinfb == fb)
311        {
312                skin->width = skinfb->width;
313                skin->height = skinfb->height;
314                skin->iwidth = skinfb->width;
315                skin->iheight = skinfb->height;
316                skin->rwidth = skinfb->width;
317                skin->rheight = skinfb->height;
318        }
319        clearfb(fb);
320        clearfb(skinfb);
321}
322
323static void write_PNG(unsigned char *outbuffer, char *filename,
324                                int width, int height, int interlace)
325{
326        int i;
327        int bit_depth=0, color_type;
328        png_bytep row_pointers[height];
329        png_structp png_ptr;
330        png_infop info_ptr;
331        FILE *outfile = fopen(filename, "wb");
332
333        for (i=0; i<height; i++)
334                row_pointers[i] = outbuffer + i * 4 * width;
335               
336        if (!outfile)
337        {
338                fprintf (stderr, "Error: Couldn't fopen %s.\n", filename);
339                exit(EXIT_FAILURE);
340        }
341   
342        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
343        (png_voidp) NULL, (png_error_ptr) NULL, (png_error_ptr) NULL);
344   
345        if (!png_ptr)
346                err("Error: Couldn't create PNG write struct.");
347   
348        info_ptr = png_create_info_struct(png_ptr);
349        if (!info_ptr)
350        {
351                png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
352                err("Error: Couldn't create PNG info struct.");
353        }
354   
355        png_init_io(png_ptr, outfile);
356   
357        png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
358   
359        bit_depth = 8;
360        color_type = PNG_COLOR_TYPE_RGB_ALPHA;
361        //color_type = PNG_COLOR_TYPE_RGB;
362        png_set_invert_alpha(png_ptr);
363        png_set_bgr(png_ptr);
364
365        png_set_IHDR(png_ptr, info_ptr, width, height,
366        bit_depth, color_type, interlace,
367        PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
368   
369        png_write_info(png_ptr, info_ptr);
370   
371        printf ("Now writing PNG file\n");
372   
373        png_write_image(png_ptr, row_pointers);
374   
375        png_write_end(png_ptr, info_ptr);
376        /* puh, done, now freeing memory... */
377        png_destroy_write_struct(&png_ptr, &info_ptr);
378   
379        if (outfile != NULL)
380                (void) fclose(outfile);
381}
382
383static void convert_and_write(unsigned char *inbuffer, char *filename,
384                                int width, int height, int bits, int interlace)
385{
386        size_t bufsize = (size_t) width * height * 4;
387
388        unsigned char *outbuffer = malloc(bufsize);
389
390        if (outbuffer == NULL)
391                err("Not enough memory");
392       
393        memset(outbuffer, 0, bufsize);
394        write_PNG(inbuffer, filename, width, height, interlace);
395        (void) free(outbuffer);
396}
397
398int fb2png(unsigned char *buf_p, int width, int height, char *outfile)
399{
400        int interlace = PNG_INTERLACE_ADAM7;
401        int bitdepth = 32;
402               
403        size_t help = 0;
404        while(help <= (width * height * 4))
405        {
406                buf_p[help+3] = 0x00;
407                help = help + 4;
408        }
409               
410        convert_and_write(buf_p, outfile, width, height, bitdepth, interlace);
411   
412
413    return 0;
414}
415
416void pngforlcd()
417{
418        fb2png(skinfb->fb, 320, 240, "/tmp/titanlcd.png");
419       
420/*      FILE *fd;
421        fd=fopen("/tmp/titanlcd.raw", "w");
422        int help = 0;
423        int i = 0;
424        while (i < 240) {
425                fwrite(skinfb->fb+help,320*4,1,fd);
426                help = help + (skinfb->width * 4);
427                i++;
428        }
429        fclose(fd);*/
430}
431
432void write_FB_to_JPEG_file(unsigned char *inbuffer, int image_width, int image_height, char * filename, int quality)
433{
434       
435               
436        size_t helpb = 0;
437        size_t help = 0;
438        unsigned char *helpbuffer = malloc(image_width*image_height*3);
439       
440        //delete alpha byte
441        while(help <= (image_width*image_height*4))
442        {
443                helpbuffer[helpb+0] = inbuffer[help+0];
444                helpbuffer[helpb+1] = inbuffer[help+1];
445                helpbuffer[helpb+2] = inbuffer[help+2];
446                help = help + 4;
447                helpb = helpb + 3;
448        }
449       
450        JSAMPLE *image_buffer = helpbuffer;
451        struct jpeg_compress_struct cinfo;
452        struct jpeg_error_mgr jerr;
453        FILE * outfile;
454       
455        JSAMPROW row_pointer[1];
456        int row_stride;
457       
458        cinfo.err = jpeg_std_error(&jerr);
459        jpeg_create_compress(&cinfo);
460        if ((outfile = fopen(filename, "wb")) == NULL) {
461                fprintf(stderr, "can't open %s\n", filename);
462                exit(1);
463        }
464        jpeg_stdio_dest(&cinfo, outfile);
465        cinfo.image_width = image_width;        /* image width and height, in pixels */
466        cinfo.image_height = image_height;
467        cinfo.input_components = 3;             /* # of color components per pixel */
468        cinfo.in_color_space = JCS_RGB;
469
470        jpeg_set_defaults(&cinfo);
471        jpeg_set_quality(&cinfo, quality, TRUE);
472
473        jpeg_start_compress(&cinfo, TRUE);
474        row_stride = image_width * 3;
475
476        while (cinfo.next_scanline < cinfo.image_height) {
477                row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
478                (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
479        }
480
481        jpeg_finish_compress(&cinfo);
482        fclose(outfile);
483        jpeg_destroy_compress(&cinfo);
484   
485        free(helpbuffer);
486}
487
488#endif
Note: See TracBrowser for help on using the repository browser.