1
|
1
|
|
2 //#define memcpy(a,b,c)
|
|
3
|
|
4 /*
|
|
5 * video_out_mga.c
|
|
6 *
|
|
7 * Copyright (C) Aaron Holtzman - Aug 1999
|
|
8 *
|
|
9 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
|
|
10 *
|
|
11 * mpeg2dec is free software; you can redistribute it and/or modify
|
|
12 * it under the terms of the GNU General Public License as published by
|
|
13 * the Free Software Foundation; either version 2, or (at your option)
|
|
14 * any later version.
|
|
15 *
|
|
16 * mpeg2dec is distributed in the hope that it will be useful,
|
|
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19 * GNU General Public License for more details.
|
|
20 *
|
|
21 * You should have received a copy of the GNU General Public License
|
|
22 * along with GNU Make; see the file COPYING. If not, write to
|
|
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
24 *
|
|
25 */
|
|
26
|
|
27 #include <stdio.h>
|
|
28 #include <stdlib.h>
|
|
29 #include <string.h>
|
|
30
|
|
31 #include "config.h"
|
|
32 #include "video_out.h"
|
|
33 #include "video_out_internal.h"
|
|
34
|
|
35 LIBVO_EXTERN(mga)
|
|
36
|
|
37 #include <sys/ioctl.h>
|
|
38 #include <unistd.h>
|
|
39 #include <fcntl.h>
|
|
40 #include <sys/mman.h>
|
|
41
|
|
42 #include "drivers/mga_vid.h"
|
|
43
|
|
44 static vo_info_t vo_info =
|
|
45 {
|
|
46 "Matrox G200/G400 overlay (/dev/mga_vid)",
|
|
47 "mga",
|
|
48 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>",
|
|
49 ""
|
|
50 };
|
|
51
|
|
52 static mga_vid_config_t mga_vid_config;
|
|
53 static uint8_t *vid_data, *frame0, *frame1;
|
|
54 static int next_frame = 0;
|
|
55 static int f;
|
|
56
|
|
57 #include "mga_common.c"
|
|
58
|
|
59 static uint32_t
|
|
60 init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format)
|
|
61 {
|
|
62 char *frame_mem;
|
|
63 uint32_t frame_size;
|
|
64
|
|
65 f = open("/dev/mga_vid",O_RDWR);
|
|
66
|
|
67 if(f == -1)
|
|
68 {
|
|
69 fprintf(stderr,"Couldn't open /dev/mga_vid\n");
|
|
70 return(-1);
|
|
71 }
|
|
72
|
|
73 switch(format){
|
|
74 case IMGFMT_YV12:
|
|
75 mga_vid_config.format=MGA_VID_FORMAT_YV12; break;
|
|
76 case IMGFMT_YUY2:
|
|
77 mga_vid_config.format=MGA_VID_FORMAT_YUY2; break;
|
|
78 default:
|
|
79 fprintf(stderr,"mga: invalid output format %0X\n",format);
|
|
80 return (-1);
|
|
81 }
|
|
82
|
|
83 mga_vid_config.src_width = width;
|
|
84 mga_vid_config.src_height= height;
|
|
85 // mga_vid_config.dest_width = width;
|
|
86 // mga_vid_config.dest_height= height;
|
|
87 mga_vid_config.dest_width = d_width;
|
|
88 // (width<704)?704:width; // HACK
|
|
89 mga_vid_config.dest_height= d_height;
|
|
90 // (height<576)?576:height; // HACK
|
|
91 mga_vid_config.x_org= 0; // (720-mga_vid_config.dest_width)/2;
|
|
92 mga_vid_config.y_org= 0; // (576-mga_vid_config.dest_height)/2;
|
|
93
|
|
94 if (ioctl(f,MGA_VID_CONFIG,&mga_vid_config))
|
|
95 {
|
|
96 perror("Error in mga_vid_config ioctl");
|
|
97 }
|
|
98 ioctl(f,MGA_VID_ON,0);
|
|
99
|
|
100 frame_size = ((width + 31) & ~31) * height + (((width + 31) & ~31) * height) / 2;
|
|
101 frame_mem = (char*)mmap(0,frame_size*2,PROT_WRITE,MAP_SHARED,f,0);
|
|
102 frame0 = frame_mem;
|
|
103 frame1 = frame_mem + frame_size;
|
|
104 vid_data = frame0;
|
|
105 next_frame = 0;
|
|
106
|
|
107 //clear the buffer
|
|
108 memset(frame_mem,0x80,frame_size*2);
|
|
109
|
|
110 return 0;
|
|
111 }
|
|
112
|
|
113 static const vo_info_t*
|
|
114 get_info(void)
|
|
115 {
|
|
116 return &vo_info;
|
|
117 }
|
|
118
|
|
119 static void
|
|
120 uninit(void)
|
|
121 {
|
|
122 ioctl( f,MGA_VID_OFF,0 );
|
|
123 printf("vo: uninit!\n");
|
|
124 }
|
|
125
|
|
126
|
|
127
|