1 /*
2 * Copyright 2010 Christian König
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *
23 *
24 * Based on vl_hwmc.c from xf86-video-nouveau
25 *
26 */
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include <xf86.h>
33 #include "radeon_video.h"
34 #include "compat-api.h"
35
36 #include <X11/extensions/Xv.h>
37 #include <X11/extensions/XvMC.h>
38 #include "fourcc.h"
39
40 #define FOURCC_RGB 0x0000003
41
42 static int subpicture_index_list[] =
43 {
44 FOURCC_RGB,
45 FOURCC_IA44,
46 FOURCC_AI44
47 };
48
49 static XF86MCImageIDList subpicture_list =
50 {
51 3,
52 subpicture_index_list
53 };
54
55 static XF86MCSurfaceInfoRec yv12_mpeg2_surface =
56 {
57 FOURCC_YV12,
58 XVMC_CHROMA_FORMAT_420,
59 0,
60 2048,
61 2048,
62 2048,
63 2048,
64 XVMC_IDCT | XVMC_MOCOMP | XVMC_MPEG_2,
65 XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
66 &subpicture_list
67 };
68
69 static XF86MCSurfaceInfoPtr surfaces[] =
70 {
71 (XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface,
72 };
73
74 static XF86ImageRec rgb_subpicture =
75 {
76 FOURCC_RGB,
77 XvRGB,
78 LSBFirst,
79 {
80 'R', 'G', 'B', 0x00,
81 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
82 },
83 32,
84 XvPacked,
85 1,
86 24, 0x00FF0000, 0x0000FF00, 0x000000FF,
87 0, 0, 0,
88 0, 0, 0,
89 0, 0, 0,
90 {
91 'B','G','R','X',
92 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
93 },
94 XvTopToBottom
95 };
96
97 static XF86ImageRec ia44_subpicture = XVIMAGE_IA44;
98 static XF86ImageRec ai44_subpicture = XVIMAGE_AI44;
99
100 static XF86ImagePtr subpictures[] =
101 {
102 (XF86ImagePtr)&rgb_subpicture,
103 (XF86ImagePtr)&ia44_subpicture,
104 (XF86ImagePtr)&ai44_subpicture
105 };
106
107 static XF86MCAdaptorRec adaptor_template =
108 {
109 "",
110 1,
111 surfaces,
112 3,
113 subpictures,
114 (xf86XvMCCreateContextProcPtr)NULL,
115 (xf86XvMCDestroyContextProcPtr)NULL,
116 (xf86XvMCCreateSurfaceProcPtr)NULL,
117 (xf86XvMCDestroySurfaceProcPtr)NULL,
118 (xf86XvMCCreateSubpictureProcPtr)NULL,
119 (xf86XvMCDestroySubpictureProcPtr)NULL
120 };
121
122 XF86MCAdaptorPtr
RADEONCreateAdaptorXvMC(ScreenPtr pScreen,char * xv_adaptor_name)123 RADEONCreateAdaptorXvMC(ScreenPtr pScreen, char *xv_adaptor_name)
124 {
125 XF86MCAdaptorPtr adaptor;
126 ScrnInfoPtr pScrn;
127
128 assert(pScreen);
129
130 pScrn = xf86ScreenToScrn(pScreen);
131 adaptor = xf86XvMCCreateAdaptorRec();
132
133 if (!adaptor)
134 {
135 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Memory allocation failed.\n");
136 return NULL;
137 }
138
139 *adaptor = adaptor_template;
140 adaptor->name = xv_adaptor_name;
141
142 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Associated with %s.\n", adaptor->name);
143
144 return adaptor;
145 }
146