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