vo_dfbmga.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,527 行 · 第 1/4 页
C
1,527 行
/* MPlayer video driver for DirectFB / Matrox G200/G400/G450/G550 Copyright (C) 2002-2005 Ville Syrjala <syrjala@sci.fi> Originally based on vo_directfb.c by Jiri Svoboda <Jiri.Svoboda@seznam.cz> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.*//* directfb includes */#include <directfb.h>#define DFB_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c))/* other things */#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include "config.h"#include "video_out.h"#include "video_out_internal.h"#include "fastmemcpy.h"#include "sub.h"#include "mp_msg.h"#include "aspect.h"#include "mp_fifo.h"static vo_info_t info = { "DirectFB / Matrox G200/G400/G450/G550", "dfbmga", "Ville Syrjala <syrjala@sci.fi>", ""};LIBVO_EXTERN(dfbmga)/******************************* directfb *******************************//* * (Globals) */static IDirectFB *dfb;static IDirectFBDisplayLayer *primary;static IDirectFBDisplayLayer *bes;static IDirectFBDisplayLayer *crtc2;static IDirectFBDisplayLayer *spic;static int num_bufs;static int current_buf;static int current_ip_buf;static IDirectFBSurface *bufs[3];static IDirectFBSurface *frame;static IDirectFBSurface *subframe;static IDirectFBSurface *besframe;static IDirectFBSurface *c2frame;static IDirectFBSurface *spicframe;static DFBSurfacePixelFormat frame_format;static DFBSurfacePixelFormat subframe_format;static DFBRectangle besrect;static DFBRectangle c2rect;static DFBRectangle *subrect;static IDirectFBInputDevice *keyboard;static IDirectFBInputDevice *remote;static IDirectFBEventBuffer *buffer;static int blit_done;static int stretch;static int use_bes;static int use_crtc2;static int use_spic;static int use_input;static int use_remote;static int field_parity;static int flipping;static DFBDisplayLayerBufferMode buffermode;static int tvnorm;static int osd_changed;static int osd_dirty;static int osd_current;static int osd_max;static int is_g200;/******************************* vo_dfbmga *******************************/#if DIRECTFBVERSION < DFB_VERSION(0,9,18) #define DSPF_ALUT44 DSPF_LUT8 #define DLBM_TRIPLE ~0 #define DSFLIP_ONSYNC 0#endif#if DIRECTFBVERSION < DFB_VERSION(0,9,16) #define DSPF_ARGB1555 DSPF_RGB15#endifstatic uint32_t in_width;static uint32_t in_height;static uint32_t buf_height;static uint32_t screen_width;static uint32_t screen_height;static uint32_t sub_width;static uint32_t sub_height;static char *pixelformat_name( DFBSurfacePixelFormat format ){ switch(format) { case DSPF_ARGB: return "ARGB"; case DSPF_RGB32: return "RGB32"; case DSPF_RGB24: return "RGB24"; case DSPF_RGB16: return "RGB16"; case DSPF_ARGB1555: return "ARGB1555"; case DSPF_YUY2: return "YUY2"; case DSPF_UYVY: return "UYVY"; case DSPF_YV12: return "YV12"; case DSPF_I420: return "I420"; case DSPF_ALUT44: return "ALUT44";#if DIRECTFBVERSION > DFB_VERSION(0,9,21) case DSPF_NV12: return "NV12"; case DSPF_NV21: return "NV21";#endif default: return "Unknown pixel format"; }}static DFBSurfacePixelFormatimgfmt_to_pixelformat( uint32_t format ){ switch (format) { case IMGFMT_BGR32: return DSPF_RGB32; case IMGFMT_BGR24: return DSPF_RGB24; case IMGFMT_BGR16: return DSPF_RGB16; case IMGFMT_BGR15: return DSPF_ARGB1555; case IMGFMT_YUY2: return DSPF_YUY2; case IMGFMT_UYVY: return DSPF_UYVY; case IMGFMT_YV12: return DSPF_YV12; case IMGFMT_I420: case IMGFMT_IYUV: return DSPF_I420;#if DIRECTFBVERSION > DFB_VERSION(0,9,21) case IMGFMT_NV12: return DSPF_NV12; case IMGFMT_NV21: return DSPF_NV21;#endif default: return DSPF_UNKNOWN; }}struct layer_enum{ const char *name; IDirectFBDisplayLayer **layer; DFBResult res;};static DFBEnumerationResultget_layer_by_name( DFBDisplayLayerID id, DFBDisplayLayerDescription desc, void *data ){ struct layer_enum *l = (struct layer_enum *) data;#if DIRECTFBVERSION > DFB_VERSION(0,9,15) /* We have desc.name so use it */ if (!strcmp( l->name, desc.name )) if ((l->res = dfb->GetDisplayLayer( dfb, id, l->layer )) == DFB_OK) return DFENUM_CANCEL;#else /* Fake it according to id */ if ((id == 0 && !strcmp( l->name, "FBDev Primary Layer" )) || (id == 1 && !strcmp( l->name, "Matrox Backend Scaler" )) || (id == 2 && !strcmp( l->name, "Matrox CRTC2" )) || (id == 3 && !strcmp( l->name, "Matrox CRTC2 Sub-Picture" ))) if ((l->res = dfb->GetDisplayLayer( dfb, id, l->layer )) == DFB_OK) return DFENUM_CANCEL;#endif return DFENUM_OK;}static intpreinit( const char *arg ){ DFBResult res; int force_input = -1; /* Some defaults */ use_bes = 0; use_crtc2 = 1; use_spic = 1; field_parity = -1;#if DIRECTFBVERSION > DFB_VERSION(0,9,17) buffermode = DLBM_TRIPLE; osd_max = 4;#else buffermode = DLBM_BACKVIDEO; osd_max = 2;#endif flipping = 1; tvnorm = -1; use_input = !getenv( "DISPLAY" ); if (vo_subdevice) { int show_help = 0; int opt_no = 0; while (*vo_subdevice != '\0') { if (!strncmp(vo_subdevice, "bes", 3)) { use_bes = !opt_no; vo_subdevice += 3; opt_no = 0; } else if (!strncmp(vo_subdevice, "crtc2", 5)) { use_crtc2 = !opt_no; vo_subdevice += 5; opt_no = 0; } else if (!strncmp(vo_subdevice, "spic", 4)) { use_spic = !opt_no; vo_subdevice += 4; opt_no = 0; } else if (!strncmp(vo_subdevice, "input", 5)) { force_input = !opt_no; vo_subdevice += 5; opt_no = 0; } else if (!strncmp(vo_subdevice, "remote", 6)) { use_remote = !opt_no; vo_subdevice += 6; opt_no = 0; } else if (!strncmp(vo_subdevice, "buffermode=", 11)) { if (opt_no) { show_help = 1; break; } vo_subdevice += 11; if (!strncmp(vo_subdevice, "single", 6)) { buffermode = DLBM_FRONTONLY; osd_max = 1; flipping = 0; vo_subdevice += 6; } else if (!strncmp(vo_subdevice, "double", 6)) { buffermode = DLBM_BACKVIDEO; osd_max = 2; flipping = 1; vo_subdevice += 6; } else if (!strncmp(vo_subdevice, "triple", 6)) { buffermode = DLBM_TRIPLE; osd_max = 4; flipping = 1; vo_subdevice += 6; } else { show_help = 1; break; } opt_no = 0; } else if (!strncmp(vo_subdevice, "fieldparity=", 12)) { if (opt_no) { show_help = 1; break; } vo_subdevice += 12; if (!strncmp(vo_subdevice, "top", 3)) { field_parity = 0; vo_subdevice += 3; } else if (!strncmp(vo_subdevice, "bottom", 6)) { field_parity = 1; vo_subdevice += 6; } else { show_help = 1; break; } opt_no = 0; } else if (!strncmp(vo_subdevice, "tvnorm=", 7)) { if (opt_no) { show_help = 1; break; } vo_subdevice += 7; if (!strncmp(vo_subdevice, "pal", 3)) { tvnorm = 0; vo_subdevice += 3; } else if (!strncmp(vo_subdevice, "ntsc" , 4)) { tvnorm = 1; vo_subdevice += 4; } else if (!strncmp(vo_subdevice, "auto" , 4)) { tvnorm = 2; vo_subdevice += 4; } else { show_help = 1; break; } opt_no = 0; } else if (!strncmp(vo_subdevice, "no", 2)) { if (opt_no) { show_help = 1; break; } vo_subdevice += 2; opt_no = 1; } else if (*vo_subdevice == ':') { if (opt_no) { show_help = 1; break; } vo_subdevice++; opt_no = 0; } else { show_help = 1; break; } } if (show_help) { mp_msg( MSGT_VO, MSGL_ERR, "\nvo_dfbmga command line help:\n" "Example: mplayer -vo dfbmga:nocrtc2:bes:buffermode=single\n" "\nOptions (use 'no' prefix to disable):\n" " bes Use Backend Scaler\n" " crtc2 Use CRTC2\n" " spic Use hardware sub-picture for OSD\n" " input Use DirectFB for keyboard input\n" " remote Use DirectFB for remote control input\n" "\nOther options:\n" " buffermode=(single|double|triple)\n" " single Use single buffering\n" " double Use double buffering\n" " triple Use triple buffering\n" " fieldparity=(top|bottom)\n" " top Top field first\n" " bottom Bottom field first\n" " tvnorm=(pal|ntsc|auto)\n" " pal Force PAL\n" " ntsc Force NTSC\n" " auto Select according to FPS\n" "\n" );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?