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,¶ms)); 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,¶ms)); 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 + -
显示快捷键?