• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
xorg_xvmc_init(ScreenPtr pScreen,char * name)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