synced with r23928
[mplayer/glamo.git] / libvo / vo_aa.c
blob626a5c8646525fd7a095943c58da53bdcc3d0109
1 /*
2 * MPlayer
3 *
4 * Video driver for AAlib - 1.0
5 *
6 * by Folke Ashberg <folke@ashberg.de>
7 *
8 * Code started: Sun Aug 12 2001
9 * Version 1.0 : Thu Aug 16 2001
13 #include <stdio.h>
14 #include <stdlib.h>
16 #include <sys/stat.h>
17 #include <unistd.h>
19 #include <limits.h>
20 #include <math.h>
21 #include <stdarg.h>
22 #include <time.h>
23 #include <string.h>
24 #include <errno.h>
26 #include "config.h"
27 #include "video_out.h"
28 #include "video_out_internal.h"
29 #include "aspect.h"
30 #include "libswscale/swscale.h"
31 #include "libmpcodecs/vf_scale.h"
32 #include "font_load.h"
33 #include "sub.h"
35 #include "osdep/keycodes.h"
36 #include <aalib.h>
37 #include "subopt-helper.h"
38 #include "help_mp.h"
39 #include "mp_msg.h"
40 #include "mp_fifo.h"
43 #define MESSAGE_DURATION 3
44 #define MESSAGE_SIZE 512
45 #define MESSAGE_DEKO " +++ %s +++ "
47 static vo_info_t info = {
48 "AAlib",
49 "aa",
50 "Alban Bedel <albeu@free.fr> and Folke Ashberg <folke@ashberg.de>",
54 LIBVO_EXTERN(aa)
56 /* aa's main context we use */
57 aa_context *c;
58 aa_renderparams *p;
59 static int fast =0;
60 /* used for the sws */
61 static uint8_t * image[3];
62 static int image_stride[3];
64 /* image infos */
65 static int image_format;
66 static int image_width;
67 static int image_height;
68 static int image_x, image_y;
69 static int screen_x, screen_y;
70 static int screen_w, screen_h;
71 static int src_width;
72 static int src_height;
74 /* osd stuff */
75 time_t stoposd = 0;
76 static int showosdmessage = 0;
77 char osdmessagetext[MESSAGE_SIZE];
78 char posbar[MESSAGE_SIZE];
79 static int osdx, osdy;
80 static int osd_text_length = 0;
81 int aaconfigmode=1;
82 font_desc_t* vo_font_save = NULL;
83 static struct SwsContext *sws=NULL;
85 /* our version of the playmodes :) */
87 /* to disable stdout outputs when curses/linux mode */
88 extern int quiet;
90 /* configuration */
91 int aaopt_osdcolor = AA_SPECIAL;
92 int aaopt_subcolor = AA_SPECIAL;
94 extern struct aa_hardware_params aa_defparams;
95 extern struct aa_renderparams aa_defrenderparams;
97 void
98 resize(void){
99 /*
100 * this function is called by aa lib if windows resizes
101 * further during init, because here we have to calculate
102 * a little bit
105 aa_resize(c);
107 aspect_save_screenres(aa_imgwidth(c),aa_imgheight(c));
108 image_height = aa_imgheight(c); //src_height;
109 image_width = aa_imgwidth(c); //src_width;
111 aspect(&image_width,&image_height,A_ZOOM);
113 image_x = (aa_imgwidth(c) - image_width) / 2;
114 image_y = (aa_imgheight(c) - image_height) / 2;
115 screen_w = image_width * aa_scrwidth(c) / aa_imgwidth(c);
116 screen_h = image_height * aa_scrheight(c) / aa_imgheight(c);
117 screen_x = (aa_scrwidth(c) - screen_w) / 2;
118 screen_y = (aa_scrheight(c) - screen_h) / 2;
120 if(sws) sws_freeContext(sws);
121 sws = sws_getContextFromCmdLine(src_width,src_height,image_format,
122 image_width,image_height,IMGFMT_Y8);
124 image[0] = aa_image(c) + image_y * aa_imgwidth(c) + image_x;
125 image[1] = NULL;
126 image[2] = NULL;
128 image_stride[0] = aa_imgwidth(c);
129 image_stride[1] = 0;
130 image_stride[2] = 0;
132 showosdmessage=0;
136 static void
137 osdmessage(int duration, int deko, const char *fmt, ...)
140 * for outputting a centered string at the bottom
141 * of our window for a while
143 va_list ar;
144 char m[MESSAGE_SIZE];
145 unsigned int old_len = strlen(osdmessagetext);
147 va_start(ar, fmt);
148 vsprintf(m, fmt, ar);
149 va_end(ar);
150 if (deko==1) sprintf(osdmessagetext, MESSAGE_DEKO , m);
151 else strcpy(osdmessagetext, m);
153 if(old_len > strlen(osdmessagetext)) {
154 memset(c->textbuffer + osdy * aa_scrwidth(c) + osdx,' ',old_len);
155 memset(c->attrbuffer + osdy * aa_scrwidth(c) + osdx,0,old_len);
157 showosdmessage=1;
158 stoposd = time(NULL) + duration;
159 osdx=(aa_scrwidth(c) / 2) - (strlen(osdmessagetext) / 2 ) ;
160 posbar[0]='\0';
163 static void
164 osdpercent(int duration, int deko, int min, int max, int val, const char * desc, const char * unit)
167 * prints a bar for setting values
169 float step;
170 int where;
171 int i;
174 step=(float)aa_scrwidth(c) /(float)(max-min);
175 where=(val-min)*step;
176 osdmessage(duration,deko,"%s: %i%s",desc, val, unit);
177 posbar[0]='|';
178 posbar[aa_scrwidth(c)-1]='|';
179 for (i=0;i<aa_scrwidth(c);i++){
180 if (i==where) posbar[i]='#';
181 else posbar[i]='-';
183 if (where!=0) posbar[0]='|';
184 if (where!=(aa_scrwidth(c)-1) ) posbar[aa_scrwidth(c)-1]='|';
186 posbar[aa_scrwidth(c)]='\0';
190 static void
191 printosdtext(void)
193 if(osd_text_length > 0 && !vo_osd_text) {
194 memset(c->textbuffer,' ',osd_text_length);
195 memset(c->attrbuffer,0,osd_text_length);
196 osd_text_length = 0;
199 * places the mplayer status osd
201 if (vo_osd_text && vo_osd_text[0] != 0) {
202 int len;
203 if(vo_osd_text[0] < 32) {
204 len = strlen(__sub_osd_names_short[vo_osd_text[0]]) + strlen(vo_osd_text+1) + 2;
205 aa_printf(c, 0, 0 , aaopt_osdcolor, "%s %s ", __sub_osd_names_short[vo_osd_text[0]], vo_osd_text+1);
206 } else {
207 len = strlen(vo_osd_text) + 1;
208 aa_printf(c, 0, 0 , aaopt_osdcolor, "%s ",vo_osd_text);
211 if(len < osd_text_length) {
212 memset(c->textbuffer + len,' ',osd_text_length - len);
213 memset(c->attrbuffer + len,0,osd_text_length - len);
215 osd_text_length = len;
220 static void
221 printosdprogbar(void){
222 /* print mplayer osd-progbar */
223 if (vo_osd_progbar_type!=-1){
224 osdpercent(1,1,0,255,vo_osd_progbar_value, __sub_osd_names[vo_osd_progbar_type], "");
227 static int
228 config(uint32_t width, uint32_t height, uint32_t d_width,
229 uint32_t d_height, uint32_t flags, char *title,
230 uint32_t format) {
232 * main init
233 * called by mplayer
236 int i;
238 aspect_save_orig(width,height);
239 aspect_save_prescale(d_width,d_height);
241 src_height = height;
242 src_width = width;
243 image_format = format;
245 /* nothing will change its size, be we need some values initialized */
246 resize();
248 /* now init out own 'font' (to use vo_draw_text_sub without edit them) */
249 if(!vo_font_save) vo_font_save = vo_font;
250 if(vo_font == vo_font_save) {
251 vo_font=malloc(sizeof(font_desc_t));//if(!desc) return NULL;
252 memset(vo_font,0,sizeof(font_desc_t));
253 vo_font->pic_a[0]=malloc(sizeof(raw_file));
254 memset(vo_font->pic_a[0],0,sizeof(raw_file));
255 vo_font->pic_b[0]=malloc(sizeof(raw_file));
256 memset(vo_font->pic_b[0],0,sizeof(raw_file));
258 #ifdef HAVE_FREETYPE
259 vo_font->dynamic = 0;
260 #endif
262 vo_font->spacewidth=1;
263 vo_font->charspace=0;
264 vo_font->height=1;
265 vo_font->pic_a[0]->bmp=malloc(255);
266 vo_font->pic_a[0]->pal=NULL;
267 vo_font->pic_b[0]->bmp=malloc(255);
268 vo_font->pic_b[0]->pal=NULL;
269 vo_font->pic_a[0]->w=1;
270 vo_font->pic_a[0]->h=1;
271 for (i=0; i<255; i++){
272 vo_font->width[i]=1;
273 vo_font->font[i]=0;
274 vo_font->start[i]=i;
275 vo_font->pic_a[0]->bmp[i]=i;
276 vo_font->pic_b[0]->bmp[i]=i;
280 /* say hello */
281 osdmessage(5, 1, "Welcome to ASCII ART MPlayer");
283 mp_msg(MSGT_VO,MSGL_V,"VO: [aa] screendriver: %s\n", c->driver->name);
284 mp_msg(MSGT_VO,MSGL_V,"VO: [aa] keyboarddriver: %s\n", c->kbddriver->name);
286 mp_msg(MSGT_VO,MSGL_INFO,
287 "\n"
288 "Important suboptions\n"
289 "\textended use use all 256 characters\n"
290 "\teight use eight bit ascii\n"
291 "\tdriver set recommended aalib driver (X11,curses,linux)\n"
292 "\thelp to see all options provided by aalib\n"
293 "\n"
294 "AA-MPlayer Keys\n"
295 "\t1 : contrast -\n"
296 "\t2 : contrast +\n"
297 "\t3 : brightness -\n"
298 "\t4 : brightness +\n"
299 "\t5 : fast rendering\n"
300 "\t6 : dithering\n"
301 "\t7 : invert image\n"
302 "\ta : toggles between aa and mplayer control\n"
304 "\n"
305 "All other keys are MPlayer defaults.\n"
310 return 0;
313 static int
314 query_format(uint32_t format) {
316 * ...are we able to... ?
317 * called by mplayer
318 * All input format supported by the sws
320 switch(format){
321 case IMGFMT_YV12:
322 case IMGFMT_I420:
323 case IMGFMT_IYUV:
324 case IMGFMT_IYU2:
325 case IMGFMT_BGR32:
326 case IMGFMT_BGR24:
327 case IMGFMT_BGR16:
328 case IMGFMT_BGR15:
329 case IMGFMT_RGB32:
330 case IMGFMT_RGB24:
331 case IMGFMT_Y8:
332 case IMGFMT_Y800:
333 return VFCAP_CSP_SUPPORTED | VFCAP_SWSCALE | VFCAP_OSD;
335 return 0;
338 static int
339 draw_frame(uint8_t *src[]) {
340 int stride[3] = { 0 , 0 , 0 };
342 switch(image_format) {
343 case IMGFMT_BGR15:
344 case IMGFMT_BGR16:
345 stride[0] = src_width*2;
346 break;
347 case IMGFMT_IYU2:
348 case IMGFMT_BGR24:
349 stride[0] = src_width*3;
350 break;
351 case IMGFMT_BGR32:
352 stride[0] = src_width*4;
353 break;
356 sws_scale_ordered(sws,src,stride,0,src_height,image,image_stride);
358 /* Now 'ASCIInate' the image */
359 if (fast)
360 aa_fastrender(c, screen_x, screen_y, screen_w + screen_x, screen_h + screen_y );
361 else
362 aa_render(c, p,screen_x, screen_y, screen_w + screen_x, screen_h + screen_y );
364 return 0;
367 static int
368 draw_slice(uint8_t *src[], int stride[],
369 int w, int h, int x, int y) {
371 int dx1 = screen_x + (x * screen_w / src_width);
372 int dy1 = screen_y + (y * screen_h / src_height);
373 int dx2 = screen_x + ((x+w) * screen_w / src_width);
374 int dy2 = screen_y + ((y+h) * screen_h / src_height);
376 sws_scale_ordered(sws,src,stride,y,h,image,image_stride);
378 /* Now 'ASCIInate' the image */
379 if (fast)
380 aa_fastrender(c, dx1, dy1, dx2, dy2 );
381 else
382 aa_render(c, p,dx1, dy1, dx2, dy2 );
385 return 0;
388 static void
389 flip_page(void) {
391 /* do we have to put *our* (messages, progbar) osd to aa's txtbuf ? */
392 if (showosdmessage)
394 if (time(NULL)>=stoposd ) {
395 showosdmessage=0;
396 if(osdmessagetext) {
397 memset(c->textbuffer + osdy * aa_scrwidth(c) + osdx,' ',strlen(osdmessagetext));
398 memset(c->attrbuffer + osdy * aa_scrwidth(c) + osdx ,0,strlen(osdmessagetext));
399 osdmessagetext[0] = '\0';
401 if(posbar) {
402 memset(c->textbuffer + (osdy+1) * aa_scrwidth(c),' ',strlen(posbar));
403 memset(c->attrbuffer + (osdy+1) * aa_scrwidth(c),0,strlen(posbar));
405 } else {
406 /* update osd */
407 aa_puts(c, osdx, osdy, AA_SPECIAL, osdmessagetext);
408 /* posbar? */
409 if (posbar[0]!='\0')
410 aa_puts(c, 0, osdy + 1, AA_SPECIAL, posbar);
413 /* OSD time & playmode , subtitles */
414 printosdtext();
417 /* print out */
418 aa_flush(c);
421 static void
422 check_events(void) {
424 * any events?
425 * called by show_image and mplayer
427 int key;
428 while ((key=aa_getevent(c,0))!=AA_NONE ){
429 if (key>255){
430 /* some conversations */
431 switch (key) {
432 case AA_UP:
433 mplayer_put_key(KEY_UP);
434 break;
435 case AA_DOWN:
436 mplayer_put_key(KEY_DOWN);
437 break;
438 case AA_LEFT:
439 mplayer_put_key(KEY_LEFT);
440 break;
441 case AA_RIGHT:
442 mplayer_put_key(KEY_RIGHT);
443 break;
444 case AA_ESC:
445 mplayer_put_key(KEY_ESC);
446 break;
447 case 65765:
448 mplayer_put_key(KEY_PAGE_UP);
449 break;
450 case 65766:
451 mplayer_put_key(KEY_PAGE_DOWN);
452 break;
453 default:
454 continue; /* aa lib special key */
455 break;
458 if (key=='a' || key=='A'){
459 aaconfigmode=!aaconfigmode;
460 osdmessage(MESSAGE_DURATION, 1, "aa config mode is now %s",
461 aaconfigmode==1 ? "on. use keys 5-7" : "off");
463 if (aaconfigmode==1) {
464 switch (key) {
465 /* AA image controls */
466 case '5':
467 fast=!fast;
468 osdmessage(MESSAGE_DURATION, 1, "Fast mode is now %s", fast==1 ? "on" : "off");
469 break;
470 case '6':
471 if (p->dither==AA_FLOYD_S){
472 p->dither=AA_NONE;
473 osdmessage(MESSAGE_DURATION, 1, "Dithering: Off");
474 }else if (p->dither==AA_NONE){
475 p->dither=AA_ERRORDISTRIB;
476 osdmessage(MESSAGE_DURATION, 1, "Dithering: Error Distribution");
477 }else if (p->dither==AA_ERRORDISTRIB){
478 p->dither=AA_FLOYD_S;
479 osdmessage(MESSAGE_DURATION, 1, "Dithering: Floyd Steinberg");
481 break;
482 case '7':
483 p->inversion=!p->inversion;
484 osdmessage(MESSAGE_DURATION, 1, "Invert mode is now %s",
485 p->inversion==1 ? "on" : "off");
486 break;
488 default :
489 /* nothing if we're interested in?
490 * the mplayer should handle it!
492 mplayer_put_key(key);
493 break;
495 }// aaconfigmode
496 else mplayer_put_key(key);
500 static void
501 uninit(void) {
503 * THE END
506 if (strstr(c->driver->name,"Curses") || strstr(c->driver->name,"Linux")){
507 freopen("/dev/tty", "w", stderr);
509 if(vo_font_save) {
510 free(vo_font->pic_a[0]->bmp);
511 free(vo_font->pic_a[0]);
512 free(vo_font->pic_b[0]->bmp);
513 free(vo_font->pic_b[0]);
514 free(vo_font);
515 vo_font = vo_font_save;
516 vo_font_save = NULL;
518 aa_close(c);
521 static void draw_alpha(int x,int y, int w,int h, unsigned char* src, unsigned char *srca, int stride){
522 int i,j;
523 for (i = 0; i < h; i++) {
524 for (j = 0; j < w; j++) {
525 if (src[i*stride+j] > 0) {
526 c->textbuffer[x + j + (y+i)*aa_scrwidth(c)] = src[i*stride+j];
527 c->attrbuffer[x + j + (y+i)*aa_scrwidth(c)] = aaopt_subcolor;
533 static void clear_alpha(int x0,int y0, int w,int h) {
534 int l;
536 for(l = 0 ; l < h ; l++) {
537 memset(c->textbuffer + (y0 + l) * aa_scrwidth(c) + x0,' ',w);
538 memset(c->attrbuffer + (y0 + l) * aa_scrwidth(c) + x0,0,w);
543 static void
544 draw_osd(void){
545 char * vo_osd_text_save;
546 int vo_osd_progbar_type_save;
548 printosdprogbar();
549 /* let vo_draw_text only write subtitle */
550 vo_osd_text_save=vo_osd_text; /* we have to save the osd_text */
551 vo_osd_text=NULL;
552 vo_osd_progbar_type_save=vo_osd_progbar_type;
553 vo_osd_progbar_type=-1;
554 vo_remove_text(aa_scrwidth(c), aa_scrheight(c),clear_alpha);
555 vo_draw_text(aa_scrwidth(c), aa_scrheight(c), draw_alpha);
556 vo_osd_text=vo_osd_text_save;
557 vo_osd_progbar_type=vo_osd_progbar_type_save;
560 static int
561 getcolor(char * s){
562 int i;
563 char * rest;
564 if (s==NULL) return -1;
565 i=strtol(s, &rest, 10);
566 if ((rest==NULL || strlen(rest)==0) && i>=0 && i<=5) return i;
567 if (!strcasecmp(s, "normal")) return AA_NORMAL;
568 else if (!strcasecmp(s, "dim")) return AA_DIM;
569 else if (!strcasecmp(s, "bold")) return AA_BOLD;
570 else if (!strcasecmp(s, "boldfont")) return AA_BOLDFONT;
571 else if (!strcasecmp(s, "special")) return AA_SPECIAL;
572 else return -1;
575 static int parse_suboptions(const char *arg) {
576 char *pseudoargv[4], *osdcolor = NULL, *subcolor = NULL, **strings,
577 *helpmsg = NULL;
578 int pseudoargc, displayhelp = 0, *booleans;
579 opt_t extra_opts[] = {
580 {"osdcolor", OPT_ARG_MSTRZ, &osdcolor, NULL, 0},
581 {"subcolor", OPT_ARG_MSTRZ, &subcolor, NULL, 0},
582 {"help", OPT_ARG_BOOL, &displayhelp, NULL, 0} };
583 opt_t *subopts = NULL, *p;
584 char *strings_list[] = {"-driver", "-kbddriver", "-mousedriver", "-font",
585 "-width", "-height", "-minwidth", "-minheight", "-maxwidth",
586 "-maxheight", "-recwidth", "-recheight", "-bright", "-contrast",
587 "-gamma", "-dimmul", "-boldmul", "-random" };
588 char *booleans_list[] = {"-dim", "-bold", "-reverse", "-normal",
589 "-boldfont", "-inverse", "-extended", "-eight", "-dither",
590 "-floyd_steinberg", "-error_distribution"};
591 char *nobooleans_list[] = {"-nodim", "-nobold", "-noreverse", "-nonormal",
592 "-noboldfont", "-noinverse", "-noextended", "-noeight", "-nodither",
593 "-nofloyd_steinberg", "-noerror_distribution"};
594 const int nstrings = sizeof(strings_list) / sizeof(char*);
595 const int nbooleans = sizeof(booleans_list) / sizeof(int);
596 const int nextra_opts = sizeof(extra_opts) / sizeof(opt_t);
597 const int nsubopts = nstrings + nbooleans + nextra_opts;
598 int i, retval = 0;
600 subopts = calloc(nsubopts + 1, sizeof(opt_t));
601 strings = calloc(nstrings, sizeof(char*));
602 booleans = calloc(nbooleans, sizeof(int));
604 p = subopts;
605 for (i=0; i<nstrings; i++, p++) {
606 p->name = strings_list[i] + 1; // skip '-'
607 p->type = OPT_ARG_MSTRZ;
608 p->valp = &strings[i];
610 for (i=0; i<nbooleans; i++, p++) {
611 p->name = booleans_list[i] + 1;
612 p->type = OPT_ARG_BOOL;
613 p->valp = &booleans[i];
615 memcpy(p, extra_opts, sizeof(extra_opts));
617 retval = subopt_parse(arg, subopts);
619 if (retval == 0 && displayhelp) {
620 helpmsg = strdup(aa_help);
621 for (i=0; i<(signed)strlen(helpmsg); i++)
622 if (helpmsg[i] == '-') helpmsg[i] = ' ';
623 mp_msg(MSGT_VO, MSGL_INFO, MSGTR_VO_AA_HelpHeader);
624 mp_msg(MSGT_VO, MSGL_INFO, "%s\n\n", helpmsg);
625 mp_msg(MSGT_VO, MSGL_INFO, MSGTR_VO_AA_AdditionalOptions);
626 retval = -1;
628 if (retval == 0) {
629 pseudoargv[3] = NULL;
630 for (i=0; i<nstrings; i++) {
631 pseudoargc = 3; // inside loop because aalib changes it
632 if (strings[i] != NULL) {
633 pseudoargv[1] = strings_list[i];
634 pseudoargv[2] = strings[i];
635 aa_parseoptions(&aa_defparams, &aa_defrenderparams,
636 &pseudoargc, pseudoargv);
639 pseudoargv[2] = NULL;
640 for (i=0; i<nbooleans; i++) {
641 pseudoargc = 2;
642 if (booleans[i]) pseudoargv[1] = booleans_list[i];
643 else pseudoargv[1] = nobooleans_list[i];
644 aa_parseoptions(&aa_defparams, &aa_defrenderparams,
645 &pseudoargc, pseudoargv);
647 if (osdcolor) aaopt_osdcolor = getcolor(osdcolor);
648 if (subcolor) aaopt_subcolor = getcolor(subcolor);
651 if (subopts) free(subopts);
652 if (booleans) free(booleans);
653 if (strings) {
654 for (i=0; i<nstrings; i++)
655 if (strings[i])
656 free(strings[i]);
657 free(strings);
659 if (osdcolor) free(osdcolor);
660 if (subcolor) free(subcolor);
661 if (helpmsg) free(helpmsg);
662 return retval;
665 static int preinit(const char *arg)
667 char * hidis = NULL;
668 struct stat sbuf;
669 int fd, vt, major, minor;
670 FILE * fp;
671 char fname[12];
672 extern aa_linkedlist *aa_displayrecommended;
674 if(arg)
676 if (parse_suboptions(arg) != 0)
677 return ENOSYS;
680 /* initializing of aalib */
682 hidis=aa_getfirst(&aa_displayrecommended);
683 if ( hidis==NULL ){
684 /* check /dev/vcsa<vt> */
685 /* check only, if no driver is explicit set */
686 fd = dup (fileno (stderr));
687 fstat (fd, &sbuf);
688 major = sbuf.st_rdev >> 8;
689 vt = minor = sbuf.st_rdev & 0xff;
690 close (fd);
691 sprintf (fname, "/dev/vcsa%2.2i", vt);
692 fp = fopen (fname, "w+");
693 if (fp==NULL){
694 fprintf(stderr,"VO: [aa] cannot open %s for writing,"
695 "so we'll not use linux driver\n", fname);
696 aa_recommendlowdisplay("linux");
697 aa_recommendhidisplay("curses");
698 aa_recommendhidisplay("X11");
699 }else fclose(fp);
700 } else aa_recommendhidisplay(hidis);
701 c = aa_autoinit(&aa_defparams);
703 if (c == NULL) {
704 mp_msg(MSGT_VO,MSGL_ERR,"Cannot initialize aalib\n");
705 return VO_ERROR;
707 if (!aa_autoinitkbd(c,0)) {
708 mp_msg(MSGT_VO,MSGL_ERR,"Cannot initialize keyboard\n");
709 aa_close(c);
710 return VO_ERROR;
713 aa_resizehandler(c, (void *)resize);
714 aa_hidecursor(c);
715 p = aa_getrenderparams();
717 if ((strstr(c->driver->name,"Curses")) || (strstr(c->driver->name,"Linux"))){
718 freopen("/dev/null", "w", stderr);
719 /* disable console blanking */
720 printf("\033[9;0]");
723 memset(image,0,3*sizeof(uint8_t));
724 osdmessagetext[0] = '\0';
725 osdx = osdy = 0;
727 return 0;
730 static int control(uint32_t request, void *data, ...)
732 switch (request) {
733 case VOCTRL_QUERY_FORMAT:
734 return query_format(*((uint32_t*)data));
735 case VOCTRL_SET_EQUALIZER: {
736 va_list ap;
737 int val;
739 va_start(ap, data);
740 val = va_arg(ap, int);
741 va_end(ap);
743 if(strcmp((char*)data,"contrast") == 0)
744 p->contrast = ( val + 100 ) * 64 / 100;
745 else if(strcmp((char*)data,"brightness") == 0)
746 p->bright = ( val + 100) * 128 / 100;
747 return VO_TRUE;
749 case VOCTRL_GET_EQUALIZER: {
750 va_list ap;
751 int* val;
753 va_start(ap, data);
754 val = va_arg(ap, int*);
755 va_end(ap);
757 if(strcmp((char*)data,"contrast") == 0)
758 *val = (p->contrast - 64) * 100 / 64;
759 else if(strcmp((char*)data,"brightness") == 0)
760 *val = (p->bright - 128) * 100 / 128;
762 return VO_TRUE;
765 return VO_NOTIMPL;