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 + -
显示快捷键?