vo_x11.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 803 行 · 第 1/2 页
C
803 行
#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <signal.h>#include "config.h"#include "video_out.h"#include "video_out_internal.h"#include <X11/Xlib.h>#include <X11/Xutil.h>#ifdef HAVE_XF86VM#include <X11/extensions/xf86vmode.h>#endif#include <errno.h>#include "x11_common.h"#ifdef HAVE_SHM#include <sys/ipc.h>#include <sys/shm.h>#include <X11/extensions/XShm.h>static int Shmem_Flag;//static int Quiet_Flag; Here also what is this for. It's used but isn't inited ?static XShmSegmentInfo Shminfo[1];static int gXErrorFlag;static int CompletionType = -1;/* since it doesn't seem to be defined on some platforms */int XShmGetEventBase(Display *);#endif#include "sub.h"#include "libswscale/swscale.h"#include "libmpcodecs/vf_scale.h"#define MODE_RGB 0x1#define MODE_BGR 0x2#include "mp_msg.h"#include "help_mp.h"#ifdef HAVE_NEW_GUI#include "gui/interface.h"#include "mplayer.h"#endifstatic vo_info_t info = { "X11 ( XImage/Shm )", "x11", "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>", ""};LIBVO_EXTERN(x11)/* private prototypes */static void Display_Image(XImage * myximage, unsigned char *ImageData);static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride);/* local data */static unsigned char *ImageData;//! original unaligned pointer for freestatic unsigned char *ImageDataOrig;/* X11 related variables */static XImage *myximage = NULL;static int depth, bpp;static XWindowAttributes attribs;static int int_pause;static int Flip_Flag;static int zoomFlag;static uint32_t image_width;static uint32_t image_height;static uint32_t in_format;static uint32_t out_format = 0;static int out_offset;static int srcW = -1;static int srcH = -1;static int aspect; // 1<<16 based fixed point aspect, so that the aspect stays correct during resizingstatic int old_vo_dwidth = -1;static int old_vo_dheight = -1;static void check_events(void){ int ret = vo_x11_check_events(mDisplay); /* clear left over borders and redraw frame if we are paused */ if (ret & VO_EVENT_EXPOSE && int_pause) { vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, myximage->height, 0); flip_page(); } else if ((ret & VO_EVENT_RESIZE) || (ret & VO_EVENT_EXPOSE)) vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, myximage->height, 0);}static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride){ vo_draw_alpha_rgb32(w, h, src, srca, stride, ImageData + 4 * (y0 * image_width + x0), 4 * image_width);}static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride){ vo_draw_alpha_rgb24(w, h, src, srca, stride, ImageData + 3 * (y0 * image_width + x0), 3 * image_width);}static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride){ vo_draw_alpha_rgb16(w, h, src, srca, stride, ImageData + 2 * (y0 * image_width + x0), 2 * image_width);}static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride){ vo_draw_alpha_rgb15(w, h, src, srca, stride, ImageData + 2 * (y0 * image_width + x0), 2 * image_width);}static void draw_alpha_null(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride){}static struct SwsContext *swsContext = NULL;static int dst_width;extern int sws_flags;static XVisualInfo vinfo;static void getMyXImage(void){#ifdef HAVE_SHM if (mLocalDisplay && XShmQueryExtension(mDisplay)) Shmem_Flag = 1; else { Shmem_Flag = 0; mp_msg(MSGT_VO, MSGL_WARN, "Shared memory not supported\nReverting to normal Xlib\n"); } if (Shmem_Flag) CompletionType = XShmGetEventBase(mDisplay) + ShmCompletion; if (Shmem_Flag) { myximage = XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL, &Shminfo[0], image_width, image_height); if (myximage == NULL) { mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling ( Ximage error )\n"); goto shmemerror; } Shminfo[0].shmid = shmget(IPC_PRIVATE, myximage->bytes_per_line * myximage->height, IPC_CREAT | 0777); if (Shminfo[0].shmid < 0) { XDestroyImage(myximage); mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); //perror( strerror( errno ) ); mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling ( seg id error )\n"); goto shmemerror; } Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); if (Shminfo[0].shmaddr == ((char *) -1)) { XDestroyImage(myximage); if (Shminfo[0].shmaddr != ((char *) -1)) shmdt(Shminfo[0].shmaddr); mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling ( address error )\n"); goto shmemerror; } myximage->data = Shminfo[0].shmaddr; ImageData = (unsigned char *) myximage->data; Shminfo[0].readOnly = False; XShmAttach(mDisplay, &Shminfo[0]); XSync(mDisplay, False); if (gXErrorFlag) { XDestroyImage(myximage); shmdt(Shminfo[0].shmaddr); mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n"); gXErrorFlag = 0; goto shmemerror; } else shmctl(Shminfo[0].shmid, IPC_RMID, 0); { static int firstTime = 1; if (firstTime) { mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n"); firstTime = 0; } } } else { shmemerror: Shmem_Flag = 0;#endif myximage = XCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, 0, NULL, image_width, image_height, 8, 0); ImageDataOrig = malloc(myximage->bytes_per_line * image_height + 32); myximage->data = ImageDataOrig + 16 - ((long)ImageDataOrig & 15); memset(myximage->data, 0, myximage->bytes_per_line * image_height); ImageData = myximage->data;#ifdef HAVE_SHM }#endif}static void freeMyXImage(void){#ifdef HAVE_SHM if (Shmem_Flag) { XShmDetach(mDisplay, &Shminfo[0]); XDestroyImage(myximage); shmdt(Shminfo[0].shmaddr); } else#endif { myximage->data = ImageDataOrig; XDestroyImage(myximage); ImageDataOrig = NULL; } myximage = NULL; ImageData = NULL;}#ifdef WORDS_BIGENDIAN#define BO_NATIVE MSBFirst#define BO_NONNATIVE LSBFirst#else#define BO_NATIVE LSBFirst#define BO_NONNATIVE MSBFirst#endifstruct fmt2Xfmtentry_s { uint32_t mpfmt; int byte_order; unsigned red_mask; unsigned green_mask; unsigned blue_mask;} fmt2Xfmt[] = { {IMGFMT_RGB8, BO_NATIVE, 0x00000007, 0x00000038, 0x000000C0}, {IMGFMT_RGB8, BO_NONNATIVE, 0x00000007, 0x00000038, 0x000000C0}, {IMGFMT_BGR8, BO_NATIVE, 0x000000E0, 0x0000001C, 0x00000003}, {IMGFMT_BGR8, BO_NONNATIVE, 0x000000E0, 0x0000001C, 0x00000003}, {IMGFMT_RGB15, BO_NATIVE, 0x0000001F, 0x000003E0, 0x00007C00}, {IMGFMT_BGR15, BO_NATIVE, 0x00007C00, 0x000003E0, 0x0000001F}, {IMGFMT_RGB16, BO_NATIVE, 0x0000001F, 0x000007E0, 0x0000F800}, {IMGFMT_BGR16, BO_NATIVE, 0x0000F800, 0x000007E0, 0x0000001F}, {IMGFMT_RGB24, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, {IMGFMT_RGB24, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, {IMGFMT_BGR24, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, {IMGFMT_BGR24, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, {IMGFMT_RGB32, BO_NATIVE, 0x000000FF, 0x0000FF00, 0x00FF0000}, {IMGFMT_RGB32, BO_NONNATIVE, 0xFF000000, 0x00FF0000, 0x0000FF00}, {IMGFMT_BGR32, BO_NATIVE, 0x00FF0000, 0x0000FF00, 0x000000FF}, {IMGFMT_BGR32, BO_NONNATIVE, 0x0000FF00, 0x00FF0000, 0xFF000000}, {IMGFMT_ARGB, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, {IMGFMT_ARGB, LSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, {IMGFMT_ABGR, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, {IMGFMT_ABGR, LSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, {IMGFMT_RGBA, MSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, {IMGFMT_RGBA, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, {IMGFMT_BGRA, MSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, {IMGFMT_BGRA, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, {0, 0, 0, 0, 0}};static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format){// int screen; int fullscreen = 0; int vm = 0;// int interval, prefer_blank, allow_exp, nothing; unsigned int fg, bg; XGCValues xgcv; Colormap theCmap; XSetWindowAttributes xswa; unsigned long xswamask; struct fmt2Xfmtentry_s *fmte = fmt2Xfmt;#ifdef HAVE_XF86VM unsigned int modeline_width, modeline_height; static uint32_t vm_width; static uint32_t vm_height;#endif vo_mouse_autohide = 1; old_vo_dwidth = -1; old_vo_dheight = -1; if (!title) title = "MPlayer X11 (XImage/Shm) render"; in_format = format; srcW = width; srcH = height; if (flags & (VOFLAG_FULLSCREEN|VOFLAG_MODESWITCHING)) fullscreen = 1; if (flags & VOFLAG_MODESWITCHING) vm = 1; if (flags & VOFLAG_FLIPPING) Flip_Flag = 1; zoomFlag = flags & VOFLAG_SWSCALE; int_pause = 0;// if(!fullscreen) zoomFlag=1; //it makes no sense to avoid zooming on windowd mode//printf( "w: %d h: %d\n\n",vo_dwidth,vo_dheight ); XGetWindowAttributes(mDisplay, mRootWin, &attribs); depth = attribs.depth; if (depth != 15 && depth != 16 && depth != 24 && depth != 32) { Visual *visual; depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); } if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) || (WinID > 0 && vinfo.visualid != XVisualIDFromVisual(attribs.visual))) XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); /* set image size (which is indeed neither the input nor output size), if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here */ image_width = (width + 7) & (~7); image_height = height; aspect = ((1 << 16) * d_width + d_height / 2) / d_height;#ifdef HAVE_NEW_GUI if (use_gui) guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window else#endif {#ifdef HAVE_XF86VM if (vm) { if ((d_width == 0) && (d_height == 0)) { vm_width = image_width; vm_height = image_height; } else { vm_width = d_width; vm_height = d_height; } vo_vm_switch(vm_width, vm_height, &modeline_width, &modeline_height); vo_dx = (vo_screenwidth - modeline_width) / 2; vo_dy = (vo_screenheight - modeline_height) / 2; vo_dwidth = modeline_width; vo_dheight = modeline_height; }#endif bg = WhitePixel(mDisplay, mScreen); fg = BlackPixel(mDisplay, mScreen); theCmap = vo_x11_create_colormap(&vinfo);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?