vo_vesa.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,140 行 · 第 1/3 页
C
1,140 行
{ if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_vesa: flip_page was called\n"); if(flip_trigger) { if(!HAS_DGA()) __vbeCopyData(dga_buffer); flip_trigger = 0; } if(vo_doublebuffering && multi_size > 1) { int err; if((err=vbeSetDisplayStart(multi_buff[multi_idx],vo_vsync)) != VBE_OK) { vesa_term(); PRINT_VBE_ERR("vbeSetDisplayStart",err); mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_FatalErrorOccurred); abort(); } multi_idx = multi_idx ? 0 : 1; win.ptr = dga_buffer = video_base + multi_buff[multi_idx]; }/* else if(tripple_buffering) { vbeSetScheduledDisplayStart(multi_buff[multi_idx],vo_vsync); multi_idx++; if(multi_idx > 2) multi_idx = 0; win.ptr = dga_buffer = video_base + multi_buff[multi_idx]; }*/}/* is called for rgb only */static int draw_frame(uint8_t *src[]){ if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_vesa: draw_frame was called\n"); if(sws) { int dstride=HAS_DGA()?video_mode_info.XResolution:dstW; int srcStride[1]; uint8_t *dst[3]= {dga_buffer, NULL, NULL}; int dstStride[3]; dstStride[0]=dstride*((dstBpp+7)/8); dstStride[1]= dstStride[2]=dstStride[0]>>1; if(srcFourcc == IMGFMT_RGB32 || srcFourcc == IMGFMT_BGR32) srcStride[0] = srcW*4; else if(srcFourcc == IMGFMT_RGB24 || srcFourcc == IMGFMT_BGR24) srcStride[0] = srcW*3; else srcStride[0] = srcW*2; if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE(); sws_scale_ordered(sws,src,srcStride,0,srcH,dst,dstStride); flip_trigger=1; } return 0;}#define SUBDEV_NODGA 0x00000001UL#define SUBDEV_FORCEDGA 0x00000002ULstatic uint32_t subdev_flags = 0xFFFFFFFEUL;static uint32_t parseSubDevice(const char *sd){ uint32_t flags; flags = 0; if(strcmp(sd,"nodga") == 0) { flags |= SUBDEV_NODGA; flags &= ~(SUBDEV_FORCEDGA); } else if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; } else if(strcmp(sd,"neotv_pal") == 0) { neomagic_tvout = 1; neomagic_tvnorm = NEO_PAL; } else if(strcmp(sd,"neotv_ntsc") == 0) { neomagic_tvout = 1; neomagic_tvnorm = NEO_NTSC; } else if(memcmp(sd,"lvo:",4) == 0) lvo_name = &sd[4]; /* lvo_name will be valid within init() */#ifdef CONFIG_VIDIX else if(memcmp(sd,"vidix",5) == 0) vidix_name = &sd[5]; /* vidix_name will be valid within init() */#endif else { mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_UnknownSubdevice, sd); return 0xFFFFFFFFUL; } return flags;}static int query_format(uint32_t format){ if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_vesa: query_format was called: %x (%s)\n",format,vo_format_name(format));#ifdef CONFIG_VIDIX if(vidix_name)return(vidix_query_fourcc(format));#endif if (format == IMGFMT_MPEGPES) return 0; // FIXME: this is just broken... return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; /* due new SwScale code */}static void paintBkGnd( void ){ int x_res = video_mode_info.XResolution; int y_res = video_mode_info.YResolution; int x, y; for (y = 0; y < y_res; ++y) { for (x = 0; x < x_res; ++x) { int r, g, b; if ((x & 16) ^ (y & 16)) { r = x * 255 / x_res; g = y * 255 / y_res; b = 255 - x * 255 / x_res; } else { r = 255 - x * 255 / x_res; g = y * 255 / y_res; b = 255 - y * 255 / y_res; } __vbeSetPixel(x, y, r, g, b); } }}static void clear_screen( void ){ int x_res = video_mode_info.XResolution; int y_res = video_mode_info.YResolution; int x, y; for (y = 0; y < y_res; ++y) for (x = 0; x < x_res; ++x) __vbeSetPixel(x, y, 0, 0, 0);}static char *model2str(unsigned char type){ char *retval; switch(type) { case memText: retval = "Text"; break; case memCGA: retval="CGA"; break; case memHercules: retval="Hercules"; break; case memPL: retval="Planar"; break; case memPK: retval="Packed pixel"; break; case mem256: retval="256"; break; case memRGB: retval="Direct color RGB"; break; case memYUV: retval="Direct color YUV"; break; default: retval="Unknown"; break; } return retval;}unsigned fillMultiBuffer( unsigned long vsize, unsigned nbuffs ){ unsigned long screen_size, offset; unsigned total,i; screen_size = video_mode_info.XResolution*video_mode_info.YResolution*((dstBpp+7)/8); if(screen_size%64) screen_size=((screen_size/64)*64)+64; total = vsize / screen_size; if( mp_msg_test(MSGT_VO,MSGL_V) ) mp_msg(MSGT_VO,MSGL_V, "vo_vesa: Can use up to %u video buffers\n",total); i = 0; offset = 0; total = min(total,nbuffs); while(i < total) { multi_buff[i++] = offset; offset += screen_size; } if(!i) mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_YouHaveTooLittleVideoMemory, screen_size, vsize); return i;}static int set_refresh(unsigned x, unsigned y, unsigned mode,struct VesaCRTCInfoBlock *crtc_pass){ unsigned pixclk; float H_freq; range_t *monitor_hfreq = NULL; range_t *monitor_vfreq = NULL; range_t *monitor_dotclock = NULL; monitor_hfreq = str2range(monitor_hfreq_str); monitor_vfreq = str2range(monitor_vfreq_str); monitor_dotclock = str2range(monitor_dotclock_str); if (!monitor_hfreq || !monitor_vfreq || !monitor_dotclock) { mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_YouHaveToSpecifyTheCapabilitiesOfTheMonitor); return 0; } H_freq = range_max(monitor_hfreq)/1000; // printf("H_freq MAX %f\n",H_freq); do { H_freq -= 0.01; GTF_calcTimings(x,y,H_freq,GTF_HF,0, 0,crtc_pass); // printf("PixelCLK %d\n",(unsigned)crtc_pass->PixelClock); } while ( (!in_range(monitor_vfreq,crtc_pass->RefreshRate/100)|| !in_range(monitor_hfreq,H_freq*1000))&&(H_freq>0)); pixclk = crtc_pass->PixelClock;// printf("PIXclk before %d\n",pixclk); vbeGetPixelClock(&mode,&pixclk); // printf("PIXclk after %d\n",pixclk); GTF_calcTimings(x,y,pixclk/1000000,GTF_PF,0,0,crtc_pass);// printf("Flags: %x\n",(unsigned) crtc_pass->Flags);/* printf("hTotal %d\n",crtc_pass->hTotal); printf("hSyncStart %d\n",crtc_pass->hSyncStart); printf("hSyncEnd %d\n",crtc_pass->hSyncEnd); printf("vTotal %d\n",crtc_pass->vTotal); printf("vSyncStart %d\n",crtc_pass->vSyncStart); printf("vSyncEnd %d\n",crtc_pass->vSyncEnd); printf("RR %d\n",crtc_pass->RefreshRate); printf("PixelCLK %d\n",(unsigned)crtc_pass->PixelClock);*/ if (!in_range(monitor_vfreq,crtc_pass->RefreshRate/100)|| !in_range(monitor_hfreq,H_freq*1000)) { mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_UnableToFitTheMode); return 0; } return 1;}/* fullscreen: * bit 0 (0x01) means fullscreen (-fs) * bit 1 (0x02) means mode switching (-vm) * bit 2 (0x04) enables software scaling (-zoom) * bit 3 (0x08) enables flipping (-flip) (NK: and for what?) */static intconfig(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format){ static struct VbeInfoBlock vib; static int vib_set; struct VesaModeInfoBlock vmib; struct VesaCRTCInfoBlock crtc_pass; size_t i,num_modes; uint32_t w,h; unsigned short *mode_ptr,win_seg; unsigned bpp,best_x = UINT_MAX,best_y=UINT_MAX,best_mode_idx = UINT_MAX; int err,fs_mode,use_scaler=0; srcW = dstW = width; srcH = dstH = height; fs_mode = 0; if(subdev_flags == 0xFFFFFFFEUL) { mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_VESA_DetectedInternalFatalError); return -1; } if(subdev_flags == 0xFFFFFFFFUL) return -1; if(flags & VOFLAG_FLIPPING) { mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_VESA_SwitchFlipIsNotSupported); } if(flags & VOFLAG_SWSCALE) use_scaler = 1; if(flags & VOFLAG_FULLSCREEN) { if(use_scaler) use_scaler = 2; else fs_mode = 1; } if((err=vbeInit()) != VBE_OK) { PRINT_VBE_ERR("vbeInit",err); return -1; } memcpy(vib.VESASignature,"VBE2",4); if(!vib_set && (err=vbeGetControllerInfo(&vib)) != VBE_OK) { PRINT_VBE_ERR("vbeGetControllerInfo",err); mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_VESA_PossibleReasonNoVbe2BiosFound); return -1; } vib_set = 1; /* Print general info here */ mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_FoundVesaVbeBiosVersion, (int)(vib.VESAVersion >> 8) & 0xff, (int)(vib.VESAVersion & 0xff), (int)(vib.OemSoftwareRev & 0xffff)); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_VideoMemory,vib.TotalMemory*64); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_Capabilites ,vib.Capabilities & VBE_DAC_8BIT ? "8-bit DAC," : "6-bit DAC," ,vib.Capabilities & VBE_NONVGA_CRTC ? "non-VGA CRTC,":"VGA CRTC," ,vib.Capabilities & VBE_SNOWED_RAMDAC ? "snowed RAMDAC,":"normal RAMDAC," ,vib.Capabilities & VBE_STEREOSCOPIC ? "stereoscopic,":"no stereoscopic," ,vib.Capabilities & VBE_STEREO_EVC ? "Stereo EVC":"no stereo"); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_BelowWillBePrintedOemInfo); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_YouShouldSee5OemRelatedLines); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_OemInfo,vib.OemStringPtr); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_OemRevision,vib.OemSoftwareRev); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_OemVendor,vib.OemVendorNamePtr); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_OemProductName,vib.OemProductNamePtr); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_OemProductRev,vib.OemProductRevPtr); mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_VESA_Hint); /* Find best mode here */ num_modes = 0; mode_ptr = vib.VideoModePtr; while(*mode_ptr++ != 0xffff) num_modes++; switch(format) { case IMGFMT_BGR8: case IMGFMT_RGB8: bpp = 8; break; case IMGFMT_BGR15: case IMGFMT_RGB15: bpp = 15; break; case IMGFMT_BGR16: case IMGFMT_RGB16: bpp = 16; break; case IMGFMT_BGR24: case IMGFMT_RGB24: bpp = 24; break; case IMGFMT_BGR32: case IMGFMT_RGB32: bpp = 32; break; default: bpp = 16; break; } srcBpp = bpp; srcFourcc = format; if(vo_dbpp) bpp = vo_dbpp; switch(bpp) { case 15: draw_alpha_fnc = draw_alpha_15; dstFourcc = IMGFMT_BGR15; break; case 16: draw_alpha_fnc = draw_alpha_16; dstFourcc = IMGFMT_BGR16; break; case 24: draw_alpha_fnc = draw_alpha_24; dstFourcc = IMGFMT_BGR24; break; case 32: draw_alpha_fnc = draw_alpha_32; dstFourcc = IMGFMT_BGR32; break; default: draw_alpha_fnc = draw_alpha_null; dstFourcc = IMGFMT_BGR16; break; } if( mp_msg_test(MSGT_VO,MSGL_V) ) { mp_msg(MSGT_VO,MSGL_V, "vo_vesa: Requested mode: %ux%u@%u (%s)\n",width,height,bpp,vo_format_name(format)); mp_msg(MSGT_VO,MSGL_V, "vo_vesa: Total modes found: %u\n",num_modes); mode_ptr = vib.VideoModePtr; mp_msg(MSGT_VO,MSGL_V, "vo_vesa: Mode list:"); for(i = 0;i < num_modes;i++) { mp_msg(MSGT_VO,MSGL_V, " %04X",mode_ptr[i]); } mp_msg(MSGT_VO,MSGL_V, "\nvo_vesa: Modes in detail:\n"); } mode_ptr = vib.VideoModePtr; if(use_scaler) { dstW = d_width; dstH = d_height; } if(vo_screenwidth) w = vo_screenwidth; else w = max(dstW,width); if(vo_screenheight) h = vo_screenheight; else h = max(dstH,height); for(i=0;i < num_modes;i++) { if((err=vbeGetModeInfo(mode_ptr[i],&vmib)) != VBE_OK) { PRINT_VBE_ERR("vbeGetModeInfo",err); continue; } if(vmib.XResolution >= w && vmib.YResolution >= h && (vmib.ModeAttributes & MOVIE_MODE) == MOVIE_MODE && vmib.BitsPerPixel == bpp && vmib.MemoryModel == memRGB) { if(vmib.XResolution <= best_x && vmib.YResolution <= best_y) { best_x = vmib.XResolution; best_y = vmib.YResolution; best_mode_idx = i; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?