vo_dxr3.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,483 行 · 第 1/3 页

C
1,483
字号
		overlay_set_keycolor(ov, KEY_COLOR);		overlay_set_mode(ov, EM8300_OVERLAY_MODE_OVERLAY);		overlay_set_mode(ov, EM8300_OVERLAY_MODE_RECTANGLE);		overlay_release(ov);		XCloseDisplay(dpy);		/* End of fucked up hack */				/* Initialize overlay and X11 */		overlay_data = overlay_init(fd_control);#ifdef HAVE_NEW_GUI		if (!use_gui) {#endif			if (!vo_init()) {				mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_DXR3_UnableToInitX11);				return -1;			}#ifdef HAVE_NEW_GUI		}#endif	}#endif	if (dxr3_newsync) {		ioctl(fd_control, EM8300_IOCTL_SCR_GET, &ioval);		pts_offset = vo_pts - (ioval << 1);		if (pts_offset < 0) {			pts_offset = 0;		}	}	return 0;}/* Begin overlay.c */static int update_parameters(overlay_t *o){    overlay_set_attribute(o, EM9010_ATTRIBUTE_XOFFSET, o->xoffset);    overlay_set_attribute(o, EM9010_ATTRIBUTE_YOFFSET, o->yoffset);    overlay_set_attribute(o, EM9010_ATTRIBUTE_XCORR, o->xcorr);    overlay_set_attribute(o, EM9010_ATTRIBUTE_STABILITY, o->stability);    overlay_set_attribute(o, EM9010_ATTRIBUTE_JITTER, o->jitter);    return 0;}static int overlay_set_attribute(overlay_t *o, int attribute, int value){    em8300_attribute_t attr;        attr.attribute = attribute;    attr.value = value;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_SET_ATTRIBUTE, &attr)==-1)        {	     mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedSettingOverlayAttribute);	     return -1;        }    return 0;}static overlay_t *overlay_init(int dev){    overlay_t *o;    o = (overlay_t *) malloc(sizeof(overlay_t));    if(!o)	return NULL;    memset(o,0,sizeof(overlay_t));    o->dev = dev;    o->xres = 1280; o->yres=1024; o->xcorr=1000;    o->color_interval=10;    return o;}static int overlay_release(overlay_t *o){    if(o)	free(o);    return 0;}#define TYPE_INT 1#define TYPE_XINT 2#define TYPE_COEFF 3#define TYPE_FLOAT 4struct lut_entry {    char *name;    int type;    void *ptr;};static struct lut_entry *new_lookuptable(overlay_t *o){    struct lut_entry m[] = {	{"xoffset", TYPE_INT, &o->xoffset},	{"yoffset", TYPE_INT, &o->yoffset},	{"xcorr", TYPE_INT, &o->xcorr},	{"jitter", TYPE_INT, &o->jitter},	{"stability", TYPE_INT, &o->stability},	{"keycolor", TYPE_XINT, &o->keycolor},	{"colcal_upper", TYPE_COEFF, &o->colcal_upper[0]},	{"colcal_lower", TYPE_COEFF, &o->colcal_lower[0]},	{"color_interval", TYPE_FLOAT, &o->color_interval},	{0,0,0}    },*p;    p = malloc(sizeof(m));    memcpy(p,m,sizeof(m));    return p;}static int lookup_parameter(overlay_t *o, struct lut_entry *lut, char *name, void **ptr, int *type) {    int i;    for(i=0; lut[i].name; i++) {	if(!strcmp(name,lut[i].name)) {	    *ptr = lut[i].ptr;	    *type = lut[i].type;	    return 1;	}    }    return 0;}static int overlay_read_state(overlay_t *o, char *p){    char *a,*tok;    char path[128],fname[128],tmp[128],line[256];    FILE *fp;    struct lut_entry *lut;    void *ptr;    int type;    int j;	    if(!p) {	av_strlcpy(fname, getenv("HOME"), sizeof( fname ));	av_strlcat(fname,"/.overlay", sizeof( fname ));	        } else	av_strlcpy(fname, p, sizeof( fname ));        sprintf(tmp,"/res_%dx%dx%d",o->xres,o->yres,o->depth);    av_strlcat(fname, tmp, sizeof( fname ));    if(!(fp=fopen(fname,"r")))	return -1;    lut = new_lookuptable(o);        while(!feof(fp)) {	if(!fgets(line,256,fp))	    break;	tok=strtok(line," ");	if(lookup_parameter(o,lut,tok,&ptr,&type)) {	    tok=strtok(NULL," ");	    switch(type) {	    case TYPE_INT:		sscanf(tok,"%d",(int *)ptr);		break;	    case TYPE_XINT:		sscanf(tok,"%x",(int *)ptr);		break;	    case TYPE_FLOAT:		sscanf(tok,"%f",(float *)ptr);		break;	    case TYPE_COEFF:		for(j=0;j<3;j++) {		    sscanf(tok,"%f",&((struct coeff *)ptr)[j].k);		    tok=strtok(NULL," ");		    sscanf(tok,"%f",&((struct coeff *)ptr)[j].m);		    tok=strtok(NULL," ");		}		break;	    	    }	    	}	    }    update_parameters(o);        free(lut);    fclose(fp);    return 0;}static void overlay_update_params(overlay_t *o) {    update_parameters(o);}static int overlay_write_state(overlay_t *o, char *p)	{    char *a;    char path[128],fname[128],tmp[128];    FILE *fp;    char line[256],*tok;    struct lut_entry *lut;    int i,j;	    if(!p) {	av_strlcpy(fname, getenv("HOME"), sizeof( fname ));	av_strlcat(fname,"/.overlay", sizeof( fname ));	        } else	av_strlcpy(fname, p, sizeof( fname ));    if(access(fname, W_OK|X_OK|R_OK)) {	if(mkdir(fname,0766))	    return -1;    }	        sprintf(tmp,"/res_%dx%dx%d",o->xres,o->yres,o->depth);    av_strlcat(fname, tmp, sizeof( fname ));        if(!(fp=fopen(fname,"w")))	return -1;        lut = new_lookuptable(o);    for(i=0; lut[i].name; i++) {		fprintf(fp,"%s ",lut[i].name);	switch(lut[i].type) {	case TYPE_INT:	    fprintf(fp,"%d\n",*(int *)lut[i].ptr);	    break;	case TYPE_XINT:	    fprintf(fp,"%06x\n",*(int *)lut[i].ptr);	    break;	case TYPE_FLOAT:	    fprintf(fp,"%f\n",*(float *)lut[i].ptr);	    break;	case TYPE_COEFF:	    for(j=0;j<3;j++) 		fprintf(fp,"%f %f ",((struct coeff *)lut[i].ptr)[j].k,			((struct coeff *)lut[i].ptr)[j].m);	    fprintf(fp,"\n");	    break;	    	}    }    fclose(fp);    return 0;}static int overlay_set_screen(overlay_t *o, int xres, int yres, int depth){   em8300_overlay_screen_t scr;   o->xres = xres;   o->yres = yres;   o->depth = depth;   scr.xsize = xres;   scr.ysize = yres;      if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_SETSCREEN, &scr)==-1)        {            mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedSettingOverlayScreen);            return -1;	}   return 0;}static int overlay_set_mode(overlay_t *o, int mode){    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_SETMODE, &mode)==-1) {	mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedEnablingOverlay);	return -1;    }    return 0;}static int overlay_set_window(overlay_t *o, int xpos,int ypos,int width,int height){    em8300_overlay_window_t win;    win.xpos = xpos;    win.ypos = ypos;    win.width = width;    win.height = height;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_SETWINDOW, &win)==-1)        {            mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedResizingOverlayWindow);            return -1;        }    return 0;}static int overlay_set_bcs(overlay_t *o, int brightness, int contrast, int saturation){    em8300_bcs_t bcs;    bcs.brightness = brightness;    bcs.contrast = contrast;    bcs.saturation = saturation;    if (ioctl(o->dev, EM8300_IOCTL_GETBCS, &bcs)==-1)        {            mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedSettingOverlayBcs);            return -1;        }    return 0;}static int col_interp(float x, struct coeff c){    float y;    y = x*c.k + c.m;    if(y > 255)	y = 255;    if(y < 0)	y = 0;    return rint(y);}static int overlay_set_keycolor(overlay_t *o, int color) {    int r = (color & 0xff0000) >> 16;    int g = (color & 0x00ff00) >> 8;    int b = (color & 0x0000ff);    float ru,gu,bu;    float rl,gl,bl;    int upper,lower;    ru = r+o->color_interval;    gu = g+o->color_interval;    bu = b+o->color_interval;    rl = r-o->color_interval;    gl = g-o->color_interval;    bl = b-o->color_interval;        upper = (col_interp(ru, o->colcal_upper[0]) << 16) |	    (col_interp(gu, o->colcal_upper[1]) << 8) |	    (col_interp(bu, o->colcal_upper[2]));    lower = (col_interp(rl, o->colcal_lower[0]) << 16) |	    (col_interp(gl, o->colcal_lower[1]) << 8) |	    (col_interp(bl, o->colcal_lower[2]));    //printf("0x%06x 0x%06x\n",upper,lower);    overlay_set_attribute(o,EM9010_ATTRIBUTE_KEYCOLOR_UPPER,upper);    overlay_set_attribute(o,EM9010_ATTRIBUTE_KEYCOLOR_LOWER,lower);    return 0;}static void least_sq_fit(int *x, int *y, int n, float *k, float *m){    float sx=0,sy=0,sxx=0,sxy=0;    float delta,b;    int i;    for(i=0; i < n; i++) {	sx=sx+x[i];	sy=sy+y[i];	sxx=sxx+x[i]*x[i];	sxy=sxy+x[i]*y[i];    }    delta=sxx*n-sx*sx;    *m=(sxx*sy-sx*sxy)/delta;    *k=(sxy*n-sx*sy)/delta;}static int overlay_autocalibrate(overlay_t *o, pattern_drawer_cb pd, void *arg){    em8300_overlay_calibrate_t cal;    em8300_overlay_window_t win;    int x[256],r[256],g[256],b[256],n;    float k,m;    int i;    o->draw_pattern=pd;    o->dp_arg = arg;    overlay_set_mode(o, EM8300_OVERLAY_MODE_OVERLAY);    overlay_set_screen(o, o->xres, o->yres, o->depth);    /* Calibrate Y-offset */    o->draw_pattern(0x0000ff, 0, 0, 0, 355, 1, o->dp_arg);    cal.cal_mode = EM8300_OVERLAY_CALMODE_YOFFSET;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_CALIBRATE, &cal))        {	    mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedGettingOverlayYOffsetValues);	    return -1;        }    o->yoffset = cal.result;    mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_DXR3_YOffset,cal.result);    /* Calibrate X-offset */    o->draw_pattern(0x0000ff, 0, 0, 0, 2, 288, o->dp_arg);    cal.cal_mode = EM8300_OVERLAY_CALMODE_XOFFSET;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_CALIBRATE, &cal))	{ 	    mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedGettingOverlayXOffsetValues); 	    return -1;	}    o->xoffset = cal.result;    mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_DXR3_XOffset,cal.result);    /* Calibrate X scale correction */    o->draw_pattern(0x0000ff, 0, 355, 0, 2, 288, o->dp_arg);    cal.cal_mode = EM8300_OVERLAY_CALMODE_XCORRECTION;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_CALIBRATE, &cal))	{ 	    mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedGettingOverlayXScaleCorrection); 	    return -1;	}    mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_DXR3_XCorrection,cal.result);    o->xcorr = cal.result;    win.xpos = 10;    win.ypos = 10;    win.width = o->xres-20;    win.height = o->yres-20;    if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_SETWINDOW, &win)==-1) {	mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_DXR3_FailedResizingOverlayWindow);	exit(1);    }    /* Calibrate key color upper limit */    for(i=128,n=0; i <= 0xff; i+=4) {	o->draw_pattern(i | (i << 8) | (i << 16), 0,			(o->xres-200)/2,0,200,o->yres,o->dp_arg);	cal.arg = i;	cal.arg2 = 1;	cal.cal_mode = EM8300_OVERLAY_CALMODE_COLOR;	if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_CALIBRATE, &cal))	    {		return -1 ;	    }	x[n] = i;	r[n] = (cal.result>>16)&0xff;	g[n] = (cal.result>>8)&0xff;	b[n] = (cal.result)&0xff;	n++;    }    least_sq_fit(x,r,n,&o->colcal_upper[0].k,&o->colcal_upper[0].m);    least_sq_fit(x,g,n,&o->colcal_upper[1].k,&o->colcal_upper[1].m);    least_sq_fit(x,b,n,&o->colcal_upper[2].k,&o->colcal_upper[2].m);    /* Calibrate key color lower limit */    for(i=128,n=0; i <= 0xff; i+=4) {	o->draw_pattern(i | (i << 8) | (i << 16), 0xffffff,			(o->xres-200)/2,0,200,o->yres, o->dp_arg);	cal.arg = i;	cal.arg2 = 2;	cal.cal_mode = EM8300_OVERLAY_CALMODE_COLOR;	if (ioctl(o->dev, EM8300_IOCTL_OVERLAY_CALIBRATE, &cal))	    {		return -1 ;	    }	x[n] = i;	r[n] = (cal.result>>16)&0xff;	g[n] = (cal.result>>8)&0xff;	b[n] = (cal.result)&0xff;	n++;    }    least_sq_fit(x,r,n,&o->colcal_lower[0].k,&o->colcal_lower[0].m);    least_sq_fit(x,g,n,&o->colcal_lower[1].k,&o->colcal_lower[1].m);    least_sq_fit(x,b,n,&o->colcal_lower[2].k,&o->colcal_lower[2].m);    overlay_set_mode(o, EM8300_OVERLAY_MODE_OFF);    return 0;}static int overlay_signalmode(overlay_t *o, int mode) {	if(ioctl(o->dev, EM8300_IOCTL_OVERLAY_SIGNALMODE, &mode) ==-1) {	    mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_DXR3_FailedSetSignalMix);	    return -1;	}	return 0;}/* End overlay.c */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?