vo_directfb2.c

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

C
1,516
字号
	mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: With requested format: %s\n",vo_format_name(format));	// initial clean-up	if (frame) {	    frame->Release(frame);	    frame=NULL;	}	if (primary) {	    primary->Release(primary);	    primary=NULL;	}	if (layer) {	    layer->Release(layer);	    layer=NULL;	}// vm things	if (vm) {	    videomode_t params;	    params.out_width=d_width;	    params.out_height=d_height;	    params.width=0;	    params.height=0;	    switch (format) {		    case IMGFMT_RGB32:    		    case IMGFMT_BGR32:					params.bpp=32;					break;        	    case IMGFMT_RGB24:		    case IMGFMT_BGR24:					params.bpp=24;					break;		    case IMGFMT_RGB16:    		    case IMGFMT_BGR16:            	    case IMGFMT_RGB15:	    	    case IMGFMT_BGR15:					params.bpp=16;					break;		    default:		params.bpp=0;	    }	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - trying to change videomode\n");            DFBCHECK (dfb->EnumVideoModes(dfb,video_modes_callback,&params));	    ret=dfb->SetVideoMode(dfb,params.width,params.height,params.bpp);	    if (ret) {		ret=dfb->SetVideoMode(dfb,params.width,params.height,24);		    if (ret) {			ret=dfb->SetVideoMode(dfb,params.width,params.height,32);			    if (ret) {				ret=dfb->SetVideoMode(dfb,params.width,params.height,16);				    if (ret) {					ret=dfb->SetVideoMode(dfb,params.width,params.height,8);				    }			    }		    }	    }	} // vm end// just for sure clear primary layer#if DIRECTFBVERSION > DFB_VERSION(0,9,13)        ret = dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer);	if (ret==DFB_OK) {	    ret = layer->GetSurface(layer,&primary);	    if (ret==DFB_OK) {		primary->Clear(primary,0,0,0,0xff);		ret = primary->Flip(primary,NULL,0);		if (ret==DFB_OK) { 		    primary->Clear(primary,0,0,0,0xff);		}    	    primary->Release(primary);	    }	primary=NULL;        layer->Release(layer);	}	layer=NULL;#endif// find best layer        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - looking for suitable layer\n");	params.format=format;	params.scale=0;	params.result=0;	params.width=s_width;	params.height=s_height;	params.setsize=1;        DFBCHECK (dfb->EnumDisplayLayers(dfb,test_format_callback,&params));	if (!params.result) {	    mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - no suitable layer found\n");	    params.id = DLID_PRIMARY;	}	mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - layer %i\n",params.id);	// setup layer        DFBCHECK (dfb->GetDisplayLayer( dfb, params.id, &layer));	#if DIRECTFBVERSION > DFB_VERSION(0,9,16)        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - switching layer to exclusive mode\n");	ret = layer->SetCooperativeLevel (layer, DLSCL_EXCLUSIVE);        if (DFB_OK != ret) {	    mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - cannot swith layer to exclusive mode. This could cause\nproblems. You may need to select correct pixel format manually!\n");	    DirectFBError("MPlayer - Switch layer to exlusive mode.",ret);	};#endif	if (params.scale) {            mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - changing layer configuration (size)\n");            dlc.flags       = DLCONF_WIDTH | DLCONF_HEIGHT;	    dlc.width       = s_width;    	    dlc.height      = s_height;	    ret = layer->SetConfiguration(layer,&dlc);	    if (ret) {		mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (size)\n");		DirectFBError("MPlayer - Layer size change.",ret);	    };	}        // look if we need to change pixel fromat of layer	// and just for sure fetch also all layer propreties	dlc.flags       = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_OPTIONS | DLCONF_BUFFERMODE;	ret = layer->GetConfiguration(layer,&dlc);	dlc.flags       = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT;	if (ret) {	    mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - could not get layer properties!\n");	} else {	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Layer reports format:%x\n",dlc.pixelformat);	}	if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) {    	    dlc.flags       = DLCONF_PIXELFORMAT;	    dlc.pixelformat = convformat(params.format);	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Desired pixelformat: %x\n",dlc.pixelformat);    	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - changing layer configuration (format)\n");	    ret = layer->SetConfiguration(layer,&dlc);	    if (ret) {		unsigned int bpp;		mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (format, flags=%x)\n",dlc.flags);		DirectFBError("MPlayer - layer pixelformat change",ret);		// ugly fbdev workabout - try to switch pixelformat via videomode change		switch (dlc.pixelformat) {		    case DSPF_ARGB: 		    case DSPF_RGB32: bpp=32;break;    		    case DSPF_RGB24: bpp=24;break;	            case DSPF_RGB16: bpp=16;break;#if DIRECTFBVERSION > DFB_VERSION(0,9,15)    		    case DSPF_ARGB1555: bpp=15;break;#else        	    case DSPF_RGB15: bpp=15;break;#endif		    case DSPF_RGB332 : bpp=8;break;		}				switch (dlc.pixelformat) {		    case DSPF_ARGB:		    case DSPF_RGB32:    		    case DSPF_RGB24:	            case DSPF_RGB16:#if DIRECTFBVERSION > DFB_VERSION(0,9,15)    		    case DSPF_ARGB1555:#else        	    case DSPF_RGB15:#endif		    case DSPF_RGB332:				    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Trying to recover via videomode change (VM).\n");				    // get size		        	    dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT;				    if (DFB_OK==layer->GetConfiguration(layer,&dlc)) {					// try to set videomode				        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Videomode  %ix%i BPP %i\n",dlc.width,dlc.height,bpp);				    	ret = dfb->SetVideoMode(dfb,dlc.width,dlc.height,bpp);					if (ret) DirectFBError("MPlayer - VM - pixelformat change",ret);				    };				    //get current pixel format				    dlc.flags       = DLCONF_PIXELFORMAT;	    			    ret = layer->GetConfiguration(layer,&dlc);				    if (ret) {					DirectFBError("MPlayer - VM - Layer->GetConfiguration",ret);					} else {				        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Layer has now pixelformat [%x]\n",dlc.pixelformat);					};				    // check if we were succesfull				    if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) {				        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Recovery failed!.\n");					return CONFIG_ERROR;					}				    break;				    		    default: return CONFIG_ERROR;						};	    };	};// flipping of layer// try triple, \double... buffering	dlc.flags = DLCONF_BUFFERMODE;#ifdef TRIPLE	if (buffer_mode > 2) {	    dlc.buffermode = DLBM_TRIPLE;	    ret = layer->SetConfiguration( layer, &dlc );	} else { 	    ret=!DFB_OK;	}		if (ret!=DFB_OK) {#endif	    if (buffer_mode > 1) {		    dlc.buffermode = DLBM_BACKVIDEO;    		    ret = layer->SetConfiguration( layer, &dlc );    		if (ret!=DFB_OK) {    		    dlc.buffermode = DLBM_BACKSYSTEM;		    ret = layer->SetConfiguration( layer, &dlc );		}	    }	    if (ret == DFB_OK) {		mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Double buffering is active\n");	    }#ifdef TRIPLE	} else { 	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Triple buffering is active\n");	}#endif#if DIRECTFBVERSION > DFB_VERSION(0,9,16)        if (field_parity != -1) {	    dlc.flags = DLCONF_OPTIONS;	    ret = layer->GetConfiguration( layer, &dlc );	    if (ret==DFB_OK) {               dlc.options |= DLOP_FIELD_PARITY;	       ret = layer->SetConfiguration( layer, &dlc );		if (ret==DFB_OK) {            	    layer->SetFieldParity( layer, field_parity );		}	    }        }	mp_msg( MSGT_VO, MSGL_INFO, "DirectFB: Requested field parity: ");          switch (field_parity) {            case -1:                mp_msg( MSGT_VO, MSGL_INFO, "Don't care\n");                break;            case 0:                mp_msg( MSGT_VO, MSGL_INFO, "Top field first\n");                break;            case 1:                mp_msg( MSGT_VO, MSGL_INFO, "Bottom field first\n");                break;          }	#endif// get layer surface		ret = layer->GetSurface(layer,&primary);		if (ret) {	    mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - could not get surface\n");	    return CONFIG_ERROR; // what shall we report on fail?	}// test surface for flipping		DFBCHECK(primary->GetCapabilities(primary,&caps));#if DIRECTFBVERSION > DFB_VERSION(0,9,13)	primary->Clear(primary,0,0,0,0xff);#endif	        flipping = 0;	if (caps & (DSCAPS_FLIPPING#ifdef TRIPLE	| DSCAPS_TRIPLE#endif	)) {	    ret = primary->Flip(primary,NULL,0);	    if (ret==DFB_OK) { 		flipping = 1; #if DIRECTFBVERSION > DFB_VERSION(0,9,13)		primary->Clear(primary,0,0,0,0xff);#ifdef TRIPLE// if we have 3 buffers clean once more	if (caps & DSCAPS_TRIPLE) {		primary->Flip(primary,NULL,0);		primary->Clear(primary,0,0,0,0xff);		flipping = 2; 	}#endif#endif		    } 	};        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - flipping = %i\n",flipping);// is scale needed ? Aspect ratio and layer pos/size		// get surface size	DFBCHECK(primary->GetSize(primary,&width,&height));        mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config - surface size = %ix%i\n",width,height);	aspect_save_orig(s_width,s_height);	aspect_save_prescale(d_width,d_height);	if (params.scale) {		aspect_save_screenres(10000,10000);		aspect(&out_width,&out_height,A_ZOOM);                ret = layer->SetScreenLocation(layer,(1-(float)out_width/10000)/2,(1-(float)out_height/10000)/2,((float)out_width/10000),((float)out_height/10000));		if (ret) mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (position)\n");		xoffset = 0;		yoffset = 0;	} else {		aspect_save_screenres(width,height);			if(fs) /* -fs */			aspect(&out_width,&out_height,A_ZOOM);		else			aspect(&out_width,&out_height,A_NOZOOM);    		xoffset = (width - out_width) / 2;	        yoffset = (height - out_height) / 2;	}	if (((s_width==out_width)&&(s_height==out_height)) || (params.scale)) {	    stretch = 0;	} else {	    stretch = 1;	}	// temporary buffer in case of not flipping or scaling	if ((!flipping) || stretch) {	    DFBCHECK (primary->GetPixelFormat (primary, &dsc.pixelformat));	    dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH;	    dsc.width = s_width;	    dsc.height = s_height;	    	    DFBCHECK (dfb->CreateSurface( dfb, &dsc, &frame));	    DFBCHECK(frame->GetSize(frame,&width,&height));	    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Frame is active.\n");	} // get format for draw_alpha - should be removed soon - osd will be rendered outside vo driver	if (frame) {		DFBCHECK (frame->GetPixelFormat(frame,&pixel_format));        } else {		DFBCHECK (primary->GetPixelFormat(primary,&pixel_format));        }; // finally turn on layer layer->SetOpacity(layer,255); mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config finished [%ix%i] - [%ix%i]\n",out_width,out_height,width,height);return 0;}#include "osdep/keycodes.h"static void check_events(void){if (buffer) {      DFBInputEvent event;//if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events entered\n");     if (buffer->GetEvent(buffer, DFB_EVENT (&event)) == DFB_OK) {     if (event.type == DIET_KEYPRESS) {     		switch (event.key_symbol) {                                case DIKS_ESCAPE:					mplayer_put_key(KEY_ESC);				break;				case DIKS_PAGE_UP: mplayer_put_key(KEY_PAGE_UP);break;				case DIKS_PAGE_DOWN: mplayer_put_key(KEY_PAGE_DOWN);break;                                case DIKS_CURSOR_UP: mplayer_put_key(KEY_UP);break;                                case DIKS_CURSOR_DOWN: mplayer_put_key(KEY_DOWN);break;                                case DIKS_CURSOR_LEFT: mplayer_put_key(KEY_LEFT);break;                                case DIKS_CURSOR_RIGHT: mplayer_put_key(KEY_RIGHT);break;				case DIKS_INSERT: mplayer_put_key(KEY_INSERT);break;				case DIKS_DELETE: mplayer_put_key(KEY_DELETE);break;				case DIKS_HOME: mplayer_put_key(KEY_HOME);break;				case DIKS_END: mplayer_put_key(KEY_END);break;                default:mplayer_put_key(event.key_symbol);                };	};    };// empty buffer, because of repeating (keyboard repeat is faster than key handling// and this causes problems during seek)// temporary workabout should be solved in the future    buffer->Reset(buffer);}//if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events finished\n");}static void flip_page(void){	DFBSurfaceBlittingFlags flags=DSBLIT_NOFX;	unlock(); // unlock frame & primary//	if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Flip page entered");		DFBCHECK (primary->SetBlittingFlags(primary,flags));	if (frame) {	    if (stretch) {        	DFBRectangle rect;        	rect.x=xoffset;	        rect.y=yoffset;	        rect.w=out_width;	        rect.h=out_height;                DFBCHECK (primary->StretchBlit(primary,frame,NULL,&rect));	    	    } else {		DFBCHECK (primary->Blit(primary,frame,NULL,xoffset,yoffset));	    	    };	};#ifdef TRIPLE    switch (flipping) { 	    case 1: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAIT));		    break;	    case 2: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_ONSYNC));		    break;	    default:; // should never reach here	}#else    if (flipping) { 	    DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC));	}#endif}static void uninit(void){  mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit entered\n");  unlock();    /*   * (Release)   *//*  mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing buffer\n");  if (buffer) buffer->Release (buffer);  mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing keyboard\n");  if (keyboard) keyboard->Release (keyboard);*/  if (frame) {    mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing frame\n");    frame->Release (frame);    frame = NULL;  };//  switch off BES//  if (layer) layer->SetOpacity(layer,0);  if (layer) {   mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing layer\n");   layer->Release(layer);   layer = NULL;  }  if (primary) {   mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing primary\n");   primary->Release (primary);

⌨️ 快捷键说明

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