vo_aa.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 759 行 · 第 1/2 页
C
759 行
static void flip_page(void) { /* do we have to put *our* (messages, progbar) osd to aa's txtbuf ? */ if (showosdmessage) { if (time(NULL)>=stoposd ) { showosdmessage=0; if(*osdmessagetext) { memset(c->textbuffer + osdy * aa_scrwidth(c) + osdx,' ',strlen(osdmessagetext)); memset(c->attrbuffer + osdy * aa_scrwidth(c) + osdx ,0,strlen(osdmessagetext)); osdmessagetext[0] = '\0'; } if(*posbar) { memset(c->textbuffer + (osdy+1) * aa_scrwidth(c),' ',strlen(posbar)); memset(c->attrbuffer + (osdy+1) * aa_scrwidth(c),0,strlen(posbar)); } } else { /* update osd */ aa_puts(c, osdx, osdy, AA_SPECIAL, osdmessagetext); /* posbar? */ if (posbar[0]!='\0') aa_puts(c, 0, osdy + 1, AA_SPECIAL, posbar); } } /* OSD time & playmode , subtitles */ printosdtext(); /* print out */ aa_flush(c);}static void check_events(void) { /* * any events? * called by show_image and mplayer */ int key; while ((key=aa_getevent(c,0))!=AA_NONE ){ if (key>255){ /* some conversations */ switch (key) { case AA_UP: mplayer_put_key(KEY_UP); break; case AA_DOWN: mplayer_put_key(KEY_DOWN); break; case AA_LEFT: mplayer_put_key(KEY_LEFT); break; case AA_RIGHT: mplayer_put_key(KEY_RIGHT); break; case AA_ESC: mplayer_put_key(KEY_ESC); break; case 65765: mplayer_put_key(KEY_PAGE_UP); break; case 65766: mplayer_put_key(KEY_PAGE_DOWN); break; default: continue; /* aa lib special key */ break; } } if (key=='a' || key=='A'){ aaconfigmode=!aaconfigmode; osdmessage(MESSAGE_DURATION, 1, "aa config mode is now %s", aaconfigmode==1 ? "on. use keys 5-7" : "off"); } if (aaconfigmode==1) { switch (key) { /* AA image controls */ case '5': fast=!fast; osdmessage(MESSAGE_DURATION, 1, "Fast mode is now %s", fast==1 ? "on" : "off"); break; case '6': if (p->dither==AA_FLOYD_S){ p->dither=AA_NONE; osdmessage(MESSAGE_DURATION, 1, "Dithering: Off"); }else if (p->dither==AA_NONE){ p->dither=AA_ERRORDISTRIB; osdmessage(MESSAGE_DURATION, 1, "Dithering: Error Distribution"); }else if (p->dither==AA_ERRORDISTRIB){ p->dither=AA_FLOYD_S; osdmessage(MESSAGE_DURATION, 1, "Dithering: Floyd Steinberg"); } break; case '7': p->inversion=!p->inversion; osdmessage(MESSAGE_DURATION, 1, "Invert mode is now %s", p->inversion==1 ? "on" : "off"); break; default : /* nothing if we're interested in? * the mplayer should handle it! */ mplayer_put_key(key); break; } }// aaconfigmode else mplayer_put_key(key); }}static void uninit(void) { /* * THE END */ if (strstr(c->driver->name,"Curses") || strstr(c->driver->name,"Linux")){ freopen("/dev/tty", "w", stderr); } if(vo_font_save) { free(vo_font->pic_a[0]->bmp); free(vo_font->pic_a[0]); free(vo_font->pic_b[0]->bmp); free(vo_font->pic_b[0]); free(vo_font); vo_font = vo_font_save; vo_font_save = NULL; } aa_close(c);}static void draw_alpha(int x,int y, int w,int h, unsigned char* src, unsigned char *srca, int stride){ int i,j; for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { if (src[i*stride+j] > 0) { c->textbuffer[x + j + (y+i)*aa_scrwidth(c)] = src[i*stride+j]; c->attrbuffer[x + j + (y+i)*aa_scrwidth(c)] = aaopt_subcolor; } } }}static void clear_alpha(int x0,int y0, int w,int h) { int l; for(l = 0 ; l < h ; l++) { memset(c->textbuffer + (y0 + l) * aa_scrwidth(c) + x0,' ',w); memset(c->attrbuffer + (y0 + l) * aa_scrwidth(c) + x0,0,w); }}static voiddraw_osd(void){ char * vo_osd_text_save; int vo_osd_progbar_type_save; printosdprogbar(); /* let vo_draw_text only write subtitle */ vo_osd_text_save=vo_osd_text; /* we have to save the osd_text */ vo_osd_text=NULL; vo_osd_progbar_type_save=vo_osd_progbar_type; vo_osd_progbar_type=-1; vo_remove_text(aa_scrwidth(c), aa_scrheight(c),clear_alpha); vo_draw_text(aa_scrwidth(c), aa_scrheight(c), draw_alpha); vo_osd_text=vo_osd_text_save; vo_osd_progbar_type=vo_osd_progbar_type_save;}static intgetcolor(char * s){ int i; char * rest; if (s==NULL) return -1; i=strtol(s, &rest, 10); if ((rest==NULL || strlen(rest)==0) && i>=0 && i<=5) return i; if (!strcasecmp(s, "normal")) return AA_NORMAL; else if (!strcasecmp(s, "dim")) return AA_DIM; else if (!strcasecmp(s, "bold")) return AA_BOLD; else if (!strcasecmp(s, "boldfont")) return AA_BOLDFONT; else if (!strcasecmp(s, "special")) return AA_SPECIAL; else return -1;}static int parse_suboptions(const char *arg) { char *pseudoargv[4], *osdcolor = NULL, *subcolor = NULL, **strings, *helpmsg = NULL; int pseudoargc, displayhelp = 0, *booleans; opt_t extra_opts[] = { {"osdcolor", OPT_ARG_MSTRZ, &osdcolor, NULL, 0}, {"subcolor", OPT_ARG_MSTRZ, &subcolor, NULL, 0}, {"help", OPT_ARG_BOOL, &displayhelp, NULL, 0} }; opt_t *subopts = NULL, *p; char *strings_list[] = {"-driver", "-kbddriver", "-mousedriver", "-font", "-width", "-height", "-minwidth", "-minheight", "-maxwidth", "-maxheight", "-recwidth", "-recheight", "-bright", "-contrast", "-gamma", "-dimmul", "-boldmul", "-random" }; char *booleans_list[] = {"-dim", "-bold", "-reverse", "-normal", "-boldfont", "-inverse", "-extended", "-eight", "-dither", "-floyd_steinberg", "-error_distribution"}; char *nobooleans_list[] = {"-nodim", "-nobold", "-noreverse", "-nonormal", "-noboldfont", "-noinverse", "-noextended", "-noeight", "-nodither", "-nofloyd_steinberg", "-noerror_distribution"}; const int nstrings = sizeof(strings_list) / sizeof(char*); const int nbooleans = sizeof(booleans_list) / sizeof(char*); const int nextra_opts = sizeof(extra_opts) / sizeof(opt_t); const int nsubopts = nstrings + nbooleans + nextra_opts; int i, retval = 0; subopts = calloc(nsubopts + 1, sizeof(opt_t)); strings = calloc(nstrings, sizeof(char*)); booleans = calloc(nbooleans, sizeof(int)); p = subopts; for (i=0; i<nstrings; i++, p++) { p->name = strings_list[i] + 1; // skip '-' p->type = OPT_ARG_MSTRZ; p->valp = &strings[i]; } for (i=0; i<nbooleans; i++, p++) { p->name = booleans_list[i] + 1; p->type = OPT_ARG_BOOL; p->valp = &booleans[i]; } memcpy(p, extra_opts, sizeof(extra_opts)); retval = subopt_parse(arg, subopts); if (retval == 0 && displayhelp) { helpmsg = strdup(aa_help); for (i=0; i<(signed)strlen(helpmsg); i++) if (helpmsg[i] == '-') helpmsg[i] = ' '; mp_msg(MSGT_VO, MSGL_INFO, MSGTR_VO_AA_HelpHeader); mp_msg(MSGT_VO, MSGL_INFO, "%s\n\n", helpmsg); mp_msg(MSGT_VO, MSGL_INFO, MSGTR_VO_AA_AdditionalOptions); retval = -1; } if (retval == 0) { pseudoargv[3] = NULL; for (i=0; i<nstrings; i++) { pseudoargc = 3; // inside loop because aalib changes it if (strings[i] != NULL) { pseudoargv[1] = strings_list[i]; pseudoargv[2] = strings[i]; aa_parseoptions(&aa_defparams, &aa_defrenderparams, &pseudoargc, pseudoargv); } } pseudoargv[2] = NULL; for (i=0; i<nbooleans; i++) { pseudoargc = 2; if (booleans[i]) pseudoargv[1] = booleans_list[i]; else pseudoargv[1] = nobooleans_list[i]; aa_parseoptions(&aa_defparams, &aa_defrenderparams, &pseudoargc, pseudoargv); } if (osdcolor) aaopt_osdcolor = getcolor(osdcolor); if (subcolor) aaopt_subcolor = getcolor(subcolor); } if (subopts) free(subopts); if (booleans) free(booleans); if (strings) { for (i=0; i<nstrings; i++) if (strings[i]) free(strings[i]); free(strings); } if (osdcolor) free(osdcolor); if (subcolor) free(subcolor); if (helpmsg) free(helpmsg); return retval;}static int preinit(const char *arg){ char * hidis = NULL; struct stat sbuf; int fd, vt, major, minor; FILE * fp; char fname[12]; if(arg) { if (parse_suboptions(arg) != 0) return ENOSYS; } /* initializing of aalib */ hidis=aa_getfirst(&aa_displayrecommended); if ( hidis==NULL ){ /* check /dev/vcsa<vt> */ /* check only, if no driver is explicit set */ fd = dup (fileno (stderr)); fstat (fd, &sbuf); major = sbuf.st_rdev >> 8; vt = minor = sbuf.st_rdev & 0xff; close (fd); sprintf (fname, "/dev/vcsa%2.2i", vt); fp = fopen (fname, "w+"); if (fp==NULL){ fprintf(stderr,"VO: [aa] cannot open %s for writing," "so we'll not use linux driver\n", fname); aa_recommendlowdisplay("linux"); aa_recommendhidisplay("curses"); aa_recommendhidisplay("X11"); }else fclose(fp); } else aa_recommendhidisplay(hidis); c = aa_autoinit(&aa_defparams); if (c == NULL) { mp_msg(MSGT_VO,MSGL_ERR,"Cannot initialize aalib\n"); return VO_ERROR; } if (!aa_autoinitkbd(c,0)) { mp_msg(MSGT_VO,MSGL_ERR,"Cannot initialize keyboard\n"); aa_close(c); return VO_ERROR; } aa_resizehandler(c, (void *)resize); aa_hidecursor(c); p = aa_getrenderparams(); if ((strstr(c->driver->name,"Curses")) || (strstr(c->driver->name,"Linux"))){ freopen("/dev/null", "w", stderr); /* disable console blanking */ printf("\033[9;0]"); } memset(image,0,3*sizeof(uint8_t)); osdmessagetext[0] = '\0'; osdx = osdy = 0; return 0;}static int control(uint32_t request, void *data, ...){ switch (request) { case VOCTRL_QUERY_FORMAT: return query_format(*((uint32_t*)data)); case VOCTRL_SET_EQUALIZER: { va_list ap; int val; va_start(ap, data); val = va_arg(ap, int); va_end(ap); if(strcmp((char*)data,"contrast") == 0) p->contrast = ( val + 100 ) * 64 / 100; else if(strcmp((char*)data,"brightness") == 0) p->bright = ( val + 100) * 128 / 100; return VO_TRUE; } case VOCTRL_GET_EQUALIZER: { va_list ap; int* val; va_start(ap, data); val = va_arg(ap, int*); va_end(ap); if(strcmp((char*)data,"contrast") == 0) *val = (p->contrast - 64) * 100 / 64; else if(strcmp((char*)data,"brightness") == 0) *val = (p->bright - 128) * 100 / 128; return VO_TRUE; } } return VO_NOTIMPL;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?