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