1 #include "xorg_tracker.h" 2 3 #include <xf86.h> 4 #include <xf86xv.h> 5 #include <xf86xvmc.h> 6 #include <X11/extensions/Xv.h> 7 #include <X11/extensions/XvMC.h> 8 #include <fourcc.h> 9 10 #define FOURCC_RGB 0x0000003 11 #define XVIMAGE_RGB \ 12 { \ 13 FOURCC_RGB, \ 14 XvRGB, \ 15 LSBFirst, \ 16 { \ 17 'R', 'G', 'B', 0x00, \ 18 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71 \ 19 }, \ 20 32, \ 21 XvPacked, \ 22 1, \ 23 24, 0x00FF0000, 0x0000FF00, 0x000000FF, \ 24 0, 0, 0, \ 25 0, 0, 0, \ 26 0, 0, 0, \ 27 { \ 28 'B','G','R','X', \ 29 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ 30 }, \ 31 XvTopToBottom \ 32 } 33 34 static int subpicture_index_list[] = { 35 FOURCC_RGB, 36 FOURCC_IA44, 37 FOURCC_AI44 38 }; 39 40 static XF86MCImageIDList subpicture_list = 41 { 42 sizeof(subpicture_index_list)/sizeof(*subpicture_index_list), 43 subpicture_index_list 44 }; 45 46 static XF86MCSurfaceInfoRec yv12_mpeg2_surface = 47 { 48 FOURCC_I420, 49 XVMC_CHROMA_FORMAT_420, 50 0, 51 2048, 2048, 2048, 2048, 52 XVMC_IDCT | XVMC_MPEG_2, 53 XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE, 54 &subpicture_list 55 }; 56 57 static const XF86MCSurfaceInfoRec uyvy_mpeg2_surface = 58 { 59 FOURCC_UYVY, 60 XVMC_CHROMA_FORMAT_422, 61 0, 62 2048, 2048, 2048, 2048, 63 XVMC_IDCT | XVMC_MPEG_2, 64 XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE, 65 &subpicture_list 66 }; 67 68 static XF86MCSurfaceInfoPtr surfaces[] = 69 { 70 (XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface, 71 (XF86MCSurfaceInfoPtr)&uyvy_mpeg2_surface 72 }; 73 74 static const XF86ImageRec rgb_subpicture = XVIMAGE_RGB; 75 static const XF86ImageRec ia44_subpicture = XVIMAGE_IA44; 76 static const XF86ImageRec ai44_subpicture = XVIMAGE_AI44; 77 78 static XF86ImagePtr subpictures[] = 79 { 80 (XF86ImagePtr)&rgb_subpicture, 81 (XF86ImagePtr)&ia44_subpicture, 82 (XF86ImagePtr)&ai44_subpicture 83 }; 84 85 static const XF86MCAdaptorRec adaptor_template = 86 { 87 "", 88 sizeof(surfaces)/sizeof(*surfaces), 89 surfaces, 90 sizeof(subpictures)/sizeof(*subpictures), 91 subpictures, 92 (xf86XvMCCreateContextProcPtr)NULL, 93 (xf86XvMCDestroyContextProcPtr)NULL, 94 (xf86XvMCCreateSurfaceProcPtr)NULL, 95 (xf86XvMCDestroySurfaceProcPtr)NULL, 96 (xf86XvMCCreateSubpictureProcPtr)NULL, 97 (xf86XvMCDestroySubpictureProcPtr)NULL 98 }; 99 100 void 101 xorg_xvmc_init(ScreenPtr pScreen, char *name) 102 { 103 ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 104 XF86MCAdaptorPtr adaptorXvMC = xf86XvMCCreateAdaptorRec(); 105 if (!adaptorXvMC) 106 return; 107 108 *adaptorXvMC = adaptor_template; 109 adaptorXvMC->name = name; 110 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 111 "[XvMC] Associated with %s.\n", name); 112 if (!xf86XvMCScreenInit(pScreen, 1, &adaptorXvMC)) 113 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 114 "[XvMC] Failed to initialize extension.\n"); 115 else 116 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 117 "[XvMC] Extension initialized.\n"); 118 xf86XvMCDestroyAdaptorRec(adaptorXvMC); 119 } 120