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