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