1
|
1
|
|
2 // mga_vid drawing functions
|
|
3
|
56
|
4 static int mga_next_frame=0;
|
|
5
|
|
6 static mga_vid_config_t mga_vid_config;
|
|
7 static uint8_t *vid_data, *frames[4];
|
|
8 static int f;
|
|
9
|
202
|
10 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
|
|
11 int x,y;
|
|
12 uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31;
|
47
|
13
|
202
|
14 if (mga_vid_config.format==MGA_VID_FORMAT_YV12){
|
1
|
15
|
202
|
16 for(y=0;y<h;y++){
|
|
17 uint8_t *dst = vid_data + bespitch * (y0+y) + x0;
|
|
18 for(x=0;x<w;x++){
|
|
19 // dst[x]=(dst[x]*srca[x]+src[x]*(srca[x]^255))>>8;
|
|
20 if(srca[x])
|
249
|
21 dst[x]=((dst[x]*srca[x])>>8)+src[x];
|
|
22 //dst[x]=(dst[x]*(srca[x]^255)+src[x]*(srca[x]))>>8;
|
202
|
23 }
|
|
24 src+=stride;
|
|
25 srca+=stride;
|
|
26 }
|
|
27
|
|
28 } else {
|
1
|
29
|
202
|
30 for(y=0;y<h;y++){
|
|
31 uint8_t *dst = vid_data + 2*(bespitch * (y0+y) + x0);
|
|
32 for(x=0;x<w;x++){
|
|
33 // dst[x]=(dst[x]*srca[x]+src[x]*(srca[x]^255))>>8;
|
|
34 if(srca[x])
|
249
|
35 dst[2*x]=((dst[2*x]*srca[x])>>8)+src[x];
|
|
36 //dst[2*x]=(dst[2*x]*(srca[x]^255)+src[x]*(srca[x]))>>8;
|
202
|
37 }
|
|
38 src+=stride;
|
|
39 srca+=stride;
|
|
40 }
|
|
41
|
|
42 }
|
|
43
|
1
|
44 }
|
|
45
|
|
46
|
|
47 //static void
|
|
48 //write_slice_g200(uint8_t *y,uint8_t *cr, uint8_t *cb,uint32_t slice_num)
|
|
49
|
|
50 static void
|
|
51 draw_slice_g200(uint8_t *image[], int stride[], int width,int height,int x,int y)
|
|
52 {
|
|
53 uint8_t *src;
|
|
54 uint8_t *src2;
|
|
55 uint8_t *dest;
|
|
56 uint32_t bespitch,h,w;
|
|
57
|
284
|
58 bespitch = (mga_vid_config.src_width + 31) & ~31;
|
1
|
59
|
284
|
60 dest = vid_data + bespitch*y + x;
|
1
|
61 src = image[0];
|
284
|
62 for(h=0; h < height; h++)
|
|
63 {
|
|
64 memcpy(dest, src, width);
|
|
65 src += stride[0];
|
|
66 dest += bespitch;
|
|
67 }
|
1
|
68
|
|
69 width/=2;height/=2;x/=2;y/=2;
|
|
70
|
284
|
71 dest = vid_data + bespitch*mga_vid_config.src_height + bespitch*y + 2*x;
|
1
|
72 src = image[1];
|
|
73 src2 = image[2];
|
|
74 for(h=0; h < height; h++)
|
|
75 {
|
|
76 for(w=0; w < width; w++)
|
|
77 {
|
|
78 dest[2*w+0] = src[w];
|
|
79 dest[2*w+1] = src2[w];
|
|
80 }
|
|
81 dest += bespitch;
|
284
|
82 src += stride[1];
|
|
83 src2+= stride[2];
|
1
|
84 }
|
|
85 }
|
|
86
|
|
87 static void
|
|
88 draw_slice_g400(uint8_t *image[], int stride[], int w,int h,int x,int y)
|
|
89 {
|
|
90 uint8_t *src;
|
|
91 uint8_t *dest;
|
|
92 uint32_t bespitch,bespitch2;
|
|
93 int i;
|
|
94
|
|
95 bespitch = (mga_vid_config.src_width + 31) & ~31;
|
|
96 bespitch2 = bespitch/2;
|
|
97
|
|
98 dest = vid_data + bespitch * y + x;
|
|
99 src = image[0];
|
|
100 for(i=0;i<h;i++){
|
|
101 memcpy(dest,src,w);
|
|
102 src+=stride[0];
|
|
103 dest += bespitch;
|
|
104 }
|
|
105
|
|
106 w/=2;h/=2;x/=2;y/=2;
|
|
107
|
|
108 dest = vid_data + bespitch*mga_vid_config.src_height + bespitch2 * y + x;
|
|
109 src = image[1];
|
|
110 for(i=0;i<h;i++){
|
|
111 memcpy(dest,src,w);
|
|
112 src+=stride[1];
|
|
113 dest += bespitch2;
|
|
114 }
|
|
115
|
|
116 dest = vid_data + bespitch*mga_vid_config.src_height
|
|
117 + bespitch*mga_vid_config.src_height / 4
|
|
118 + bespitch2 * y + x;
|
|
119 src = image[2];
|
|
120 for(i=0;i<h;i++){
|
|
121 memcpy(dest,src,w);
|
|
122 src+=stride[2];
|
|
123 dest += bespitch2;
|
|
124 }
|
|
125
|
|
126 }
|
|
127
|
|
128 static uint32_t
|
|
129 draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y)
|
|
130 {
|
|
131 if (mga_vid_config.card_type == MGA_G200)
|
|
132 draw_slice_g200(src,stride,w,h,x,y);
|
|
133 else
|
|
134 draw_slice_g400(src,stride,w,h,x,y);
|
|
135 return 0;
|
|
136 }
|
|
137
|
|
138 static void
|
31
|
139 vo_mga_flip_page(void)
|
1
|
140 {
|
47
|
141
|
|
142 // printf("-- flip to %d --\n",mga_next_frame);
|
1
|
143
|
47
|
144 #if 1
|
|
145 ioctl(f,MGA_VID_FSEL,&mga_next_frame);
|
56
|
146 mga_next_frame=(mga_next_frame+1)%mga_vid_config.num_frames;
|
47
|
147 vid_data=frames[mga_next_frame];
|
|
148 #endif
|
1
|
149
|
|
150 }
|
|
151
|
|
152
|
|
153 static void
|
|
154 write_frame_yuy2(uint8_t *y)
|
|
155 {
|
|
156 uint8_t *dest;
|
|
157 uint32_t bespitch,h;
|
|
158 int len=2*mga_vid_config.src_width;
|
|
159
|
|
160 dest = vid_data;
|
|
161 bespitch = (mga_vid_config.src_width + 31) & ~31;
|
|
162
|
|
163 // y+=2*mga_vid_config.src_width*mga_vid_config.src_height;
|
|
164
|
|
165 for(h=0; h < mga_vid_config.src_height; h++)
|
|
166 {
|
|
167 // y -= 2*mga_vid_config.src_width;
|
|
168 memcpy(dest, y, len);
|
|
169 y += len;
|
|
170 dest += 2*bespitch;
|
|
171 }
|
|
172 }
|
|
173
|
|
174
|
|
175 static uint32_t
|
|
176 draw_frame(uint8_t *src[])
|
|
177 {
|
|
178 if (mga_vid_config.format==MGA_VID_FORMAT_YUY2)
|
|
179 write_frame_yuy2(src[0]);
|
|
180 return 0;
|
|
181 }
|
|
182
|
|
183 static uint32_t
|
|
184 query_format(uint32_t format)
|
|
185 {
|
|
186 switch(format){
|
|
187 case IMGFMT_YV12:
|
|
188 case IMGFMT_YUY2:
|
|
189 // case IMGFMT_RGB|24:
|
|
190 // case IMGFMT_BGR|24:
|
|
191 return 1;
|
|
192 }
|
|
193 return 0;
|
|
194 }
|
|
195
|
56
|
196 static int mga_init(){
|
|
197 char *frame_mem;
|
|
198
|
|
199 mga_vid_config.num_frames=4;
|
|
200 mga_vid_config.version=MGA_VID_VERSION;
|
|
201 if (ioctl(f,MGA_VID_CONFIG,&mga_vid_config))
|
|
202 {
|
275
|
203 perror("Error in mga_vid_config ioctl()");
|
|
204 printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
|
56
|
205 return -1;
|
|
206 }
|
|
207 ioctl(f,MGA_VID_ON,0);
|
|
208
|
|
209 frames[0] = (char*)mmap(0,mga_vid_config.frame_size*mga_vid_config.num_frames,PROT_WRITE,MAP_SHARED,f,0);
|
|
210 frames[1] = frames[0] + 1*mga_vid_config.frame_size;
|
|
211 frames[2] = frames[0] + 2*mga_vid_config.frame_size;
|
|
212 frames[3] = frames[0] + 3*mga_vid_config.frame_size;
|
|
213 mga_next_frame = 0;
|
|
214 vid_data = frames[mga_next_frame];
|
|
215
|
|
216 //clear the buffer
|
|
217 memset(frames[0],0x80,mga_vid_config.frame_size*mga_vid_config.num_frames);
|
|
218
|
|
219 return 0;
|
|
220
|
|
221 }
|
|
222
|