annotate libvo/vo_vesa.c @ 12043:8d45dcfc016f

Fixed a bug that was accidentally introduced by the addition of MPEG Transport Stream support. We now handle errors such as 'stream not found' correctly once again.
author rsf
date Fri, 19 Mar 2004 10:15:41 +0000
parents 972d1998bde9
children 430a71a762b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2519
6f3fa9bc3b27 yv12 to yv12 scaler
michael
parents: 2506
diff changeset
1 /*
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
2 * video_out_vesa.c
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
3 *
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
4 * Copyright (C) Nick Kurshev <nickols_k@mail.ru> - Oct 2001
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
5 *
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
6 * You can redistribute this file under terms and conditions
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
7 * of GNU General Public licence v2.
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
8 * This file is partly based on vbetest.c from lrmi distributive.
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
9 */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
10
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
11 /*
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
12 TODO:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
13 - hw YUV support (need volunteers who have corresponding hardware)
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
14 - triple buffering (if it will really speedup playback).
2692
b8e628b7a029 Minor notes
nick
parents: 2689
diff changeset
15 note: triple buffering requires VBE 3.0 - need volunteers.
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
16 */
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2774
diff changeset
17 #include "config.h"
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
18 #include "gtf.h"
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
19 #include <stdio.h>
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2774
diff changeset
20 #ifdef HAVE_MALLOC_H
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2774
diff changeset
21 #include <malloc.h>
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2774
diff changeset
22 #endif
2446
6fb598bd7ede Suppressing warnings
nick
parents: 2410
diff changeset
23 #include <stdlib.h>
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
24 #include <string.h>
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
25 #include <stddef.h>
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
26 #include <limits.h>
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
27 #include <unistd.h>
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
28 #include <pwd.h>
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
29 #include <sys/types.h>
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
30 #include <sys/stat.h>
8791
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
31 #include <fcntl.h>
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
32
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
33
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
34 #include "video_out.h"
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
35 #include "video_out_internal.h"
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
36
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
37 #include "fastmemcpy.h"
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
38 #include "sub.h"
9380
edfe34c5405d linux->osdep
arpi
parents: 9170
diff changeset
39 #include "osdep/vbelib.h"
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
40 #include "bswap.h"
2689
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
41 #include "aspect.h"
3202
e9b18714e3dc Minor optimization
nick
parents: 2971
diff changeset
42 #include "vesa_lvo.h"
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
43 #ifdef CONFIG_VIDIX
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
44 #include "vosub_vidix.h"
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
45 #endif
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
46
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
47 #include "../postproc/swscale.h"
10233
35f52ad860a0 vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents: 9958
diff changeset
48 #include "../libmpcodecs/vf_scale.h"
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
49
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
50
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
51 #ifdef HAVE_PNG
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
52 extern vo_functions_t video_out_png;
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
53 #endif
a2df307ed979 Screenshot on the fly
nick
parents: 4667
diff changeset
54
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
55 extern int verbose;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
56
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
57 extern char *monitor_hfreq_str;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
58 extern char *monitor_vfreq_str;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
59 extern char *monitor_dotclock_str;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
60
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
61 #define MAX_BUFFERS 3
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
62
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
63 #ifndef max
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
64 #define max(a,b) ((a)>(b)?(a):(b))
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
65 #endif
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
66 #ifndef min
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
67 #define min(a,b) ((a)<(b)?(a):(b))
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
68 #endif
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
69
2688
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
70 #define UNUSED(x) ((void)(x)) /**< Removes warning about unused arguments */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
71
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7690
diff changeset
72 static vo_info_t info =
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
73 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
74 "VESA VBE 2.0 video output",
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
75 "vesa",
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
76 "Nick Kurshev <nickols_k@mail.ru>",
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
77 "Requires ROOT privileges"
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
78 };
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
79
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7690
diff changeset
80 LIBVO_EXTERN(vesa)
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7690
diff changeset
81
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
82 /* driver data */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
83
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
84 struct win_frame
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
85 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
86 uint8_t *ptr; /* pointer to window's frame memory */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
87 uint32_t low; /* lowest boundary of frame */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
88 uint32_t high; /* highest boundary of frame */
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2554
diff changeset
89 char idx; /* indicates index of relocatable frame (A=0 or B=1)
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
90 special case for DGA: idx=-1
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
91 idx=-2 indicates invalid frame, exists only in init() */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
92 };
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
93
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
94 static void (*cpy_blk_fnc)(unsigned long,uint8_t *,unsigned long) = NULL;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
95
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
96 static uint32_t srcW=0,srcH=0,srcBpp,srcFourcc; /* source image description */
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
97 static uint32_t dstBpp,dstW, dstH,dstFourcc; /* destinition image description */
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
98
9494
543ab3909b78 sws_ prefix, more seperation between internal & external swscaler API
michael
parents: 9380
diff changeset
99 static struct SwsContext * sws = NULL;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
100
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
101 static int32_t x_offset,y_offset; /* to center image on screen */
9170
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
102 static unsigned init_mode=0; /* mode before run of mplayer */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
103 static void *init_state = NULL; /* state before run of mplayer */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
104 static struct win_frame win; /* real-mode window to video memory */
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
105 static uint8_t *dga_buffer = NULL; /* for yuv2rgb and sw_scaling */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
106 static unsigned video_mode; /* selected video mode for playback */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
107 static struct VesaModeInfoBlock video_mode_info;
2331
9e8585a7182e Final fix of libmpeg2 zooming: flipping page support
nick
parents: 2329
diff changeset
108 static int flip_trigger = 0;
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
109 static void (*draw_alpha_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride);
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
110
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
111 /* multibuffering */
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
112 uint8_t* video_base; /* should be never changed */
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
113 uint32_t multi_buff[MAX_BUFFERS]; /* contains offsets of buffers */
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
114 uint8_t multi_size=0; /* total number of buffers */
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
115 uint8_t multi_idx=0; /* active buffer */
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
116
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
117 /* Linux Video Overlay */
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
118 static const char *lvo_name = NULL;
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
119 static int lvo_opened = 0;
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
120 #ifdef CONFIG_VIDIX
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
121 static const char *vidix_name = NULL;
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
122 static int vidix_opened = 0;
11158
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
123 static vidix_grkey_t gr_key;
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
124 #endif
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
125
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
126 #define HAS_DGA() (win.idx == -1)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
127 #define MOVIE_MODE (MODE_ATTR_COLOR | MODE_ATTR_GRAPHICS)
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
128 #define FRAME_MODE (MODE_WIN_RELOCATABLE | MODE_WIN_WRITEABLE)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
129
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
130 static char * vbeErrToStr(int err)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
131 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
132 char *retval;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
133 static char sbuff[80];
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
134 if((err & VBE_VESA_ERROR_MASK) == VBE_VESA_ERROR_MASK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
135 {
4667
95fa3901cafc add vsync support for doublebuffering to vo_vesa
atmos4
parents: 4601
diff changeset
136 sprintf(sbuff,"VESA failed = 0x4f%02x",(err & VBE_VESA_ERRCODE_MASK)>>8);
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
137 retval = sbuff;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
138 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
139 else
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
140 switch(err)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
141 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
142 case VBE_OK: retval = "No error"; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
143 case VBE_VM86_FAIL: retval = "vm86() syscall failed"; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
144 case VBE_OUT_OF_DOS_MEM: retval = "Out of DOS memory"; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
145 case VBE_OUT_OF_MEM: retval = "Out of memory"; break;
2360
aa4d96380b7f Broken BIOS test
nick
parents: 2337
diff changeset
146 case VBE_BROKEN_BIOS: retval = "Broken BIOS or DOS TSR"; break;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
147 default: sprintf(sbuff,"Unknown or internal error: %i",err); retval=sbuff; break;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
148 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
149 return retval;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
150 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
151
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
152 #define PRINT_VBE_ERR(name,err) { printf("vo_vesa: %s returns: %s\n",name,vbeErrToStr(err)); fflush(stdout); }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
153
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
154 static void vesa_term( void )
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
155 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
156 int err;
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
157 if(lvo_opened) { vlvo_term(); lvo_opened = 0; }
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
158 #ifdef CONFIG_VIDIX
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
159 else if(vidix_opened) { vidix_term(); vidix_opened = 0; }
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
160 #endif
9170
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
161 if(init_state) if((err=vbeRestoreState(init_state)) != VBE_OK) PRINT_VBE_ERR("vbeRestoreState",err);
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
162 init_state=NULL;
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
163 if(init_mode) if((err=vbeSetMode(init_mode,NULL)) != VBE_OK) PRINT_VBE_ERR("vbeSetMode",err);
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
164 init_mode=0;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
165 if(HAS_DGA()) vbeUnmapVideoBuffer((unsigned long)win.ptr,win.high);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
166 if(dga_buffer && !HAS_DGA()) free(dga_buffer);
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
167 vbeDestroy();
9494
543ab3909b78 sws_ prefix, more seperation between internal & external swscaler API
michael
parents: 9380
diff changeset
168 if(sws) sws_freeContext(sws);
9170
bcf4bf10f9c7 hopefully better uninit check
arpi
parents: 8792
diff changeset
169 sws=NULL;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
170 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
171
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
172 #define VALID_WIN_FRAME(offset) (offset >= win.low && offset < win.high)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
173 #define VIDEO_PTR(offset) (win.ptr + offset - win.low)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
174
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
175 static inline void __vbeSwitchBank(unsigned long offset)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
176 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
177 unsigned long gran;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
178 unsigned new_offset;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
179 int err;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
180 gran = video_mode_info.WinGranularity*1024;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
181 new_offset = offset / gran;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
182 if(HAS_DGA()) { err = -1; goto show_err; }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
183 if((err=vbeSetWindow(win.idx,new_offset)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
184 {
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2554
diff changeset
185 show_err:
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
186 vesa_term();
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
187 PRINT_VBE_ERR("vbeSetWindow",err);
11678
972d1998bde9 occured --> occurred typo patch by Clinton Roy <croy@dstc.edu.au>
diego
parents: 11565
diff changeset
188 printf("vo_vesa: Fatal error occurred! Can't continue\n");
10734
b105d7aba10d remove exit_player and exit references
alex
parents: 10404
diff changeset
189 abort();
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
190 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
191 win.low = new_offset * gran;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
192 win.high = win.low + video_mode_info.WinSize*1024;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
193 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
194
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
195 static void __vbeSetPixel(int x, int y, int r, int g, int b)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
196 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
197 int x_res = video_mode_info.XResolution;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
198 int y_res = video_mode_info.YResolution;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
199 int shift_r = video_mode_info.RedFieldPosition;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
200 int shift_g = video_mode_info.GreenFieldPosition;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
201 int shift_b = video_mode_info.BlueFieldPosition;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
202 int pixel_size = (dstBpp+7)/8;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
203 int bpl = video_mode_info.BytesPerScanLine;
2676
d3393d940aa5 Fixed rgb2rgb in DGA mode
nick
parents: 2649
diff changeset
204 int color;
d3393d940aa5 Fixed rgb2rgb in DGA mode
nick
parents: 2649
diff changeset
205 unsigned offset;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
206
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
207 if (x < 0 || x >= x_res || y < 0 || y >= y_res) return;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
208 r >>= 8 - video_mode_info.RedMaskSize;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
209 g >>= 8 - video_mode_info.GreenMaskSize;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
210 b >>= 8 - video_mode_info.BlueMaskSize;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
211 color = (r << shift_r) | (g << shift_g) | (b << shift_b);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
212 offset = y * bpl + (x * pixel_size);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
213 if(!VALID_WIN_FRAME(offset)) __vbeSwitchBank(offset);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
214 memcpy(VIDEO_PTR(offset), &color, pixel_size);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
215 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
216
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
217 /*
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
218 Copies part of frame to video memory. Data should be in the same format
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
219 as video memory.
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
220 */
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
221 static void __vbeCopyBlockFast(unsigned long offset,uint8_t *image,unsigned long size)
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
222 {
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
223 memcpy(&win.ptr[offset],image,size);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
224 }
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
225
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
226 static void __vbeCopyBlock(unsigned long offset,uint8_t *image,unsigned long size)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
227 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
228 unsigned long delta,src_idx = 0;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
229 while(size)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
230 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
231 if(!VALID_WIN_FRAME(offset)) __vbeSwitchBank(offset);
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
232 delta = min(size,win.high - offset);
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
233 memcpy(VIDEO_PTR(offset),&image[src_idx],delta);
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
234 src_idx += delta;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
235 offset += delta;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
236 size -= delta;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
237 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
238 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
239
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
240 /*
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
241 Copies frame to video memory. Data should be in the same format as video
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
242 memory.
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
243 */
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
244
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
245 #define PIXEL_SIZE() ((dstBpp+7)/8)
2676
d3393d940aa5 Fixed rgb2rgb in DGA mode
nick
parents: 2649
diff changeset
246 #define SCREEN_LINE_SIZE(pixel_size) (video_mode_info.XResolution*(pixel_size) )
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
247 #define IMAGE_LINE_SIZE(pixel_size) (dstW*(pixel_size))
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
248
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
249 static void __vbeCopyData(uint8_t *image)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
250 {
2308
ce35271bdb10 Best fix of slice drawing with libmpeg2
nick
parents: 2307
diff changeset
251 unsigned long i,j,image_offset,offset;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
252 unsigned pixel_size,image_line_size,screen_line_size,x_shift;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
253 pixel_size = PIXEL_SIZE();
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
254 screen_line_size = SCREEN_LINE_SIZE(pixel_size);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
255 image_line_size = IMAGE_LINE_SIZE(pixel_size);
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
256 if(dstW == video_mode_info.XResolution)
2306
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
257 {
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
258 /* Special case for zooming */
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
259 (*cpy_blk_fnc)(y_offset*screen_line_size,image,image_line_size*dstH);
2306
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
260 }
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
261 else
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
262 {
2306
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
263 x_shift = x_offset*pixel_size;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
264 for(j=0,i=y_offset;j<dstH;i++,j++)
2306
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
265 {
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
266 offset = i*screen_line_size+x_shift;
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
267 image_offset = j*image_line_size;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
268 (*cpy_blk_fnc)(offset,&image[image_offset],image_line_size);
2306
42cf51474f45 Qualitative speedup for P3 & K7 cpus
nick
parents: 2305
diff changeset
269 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
270 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
271 }
2328
00f64d5858b8 Bad fix of libmpeg2 zooming
nick
parents: 2308
diff changeset
272
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
273 /* is called for yuv only */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
274 static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
275 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
276 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
277 uint8_t *dst[3]= {dga_buffer, NULL, NULL};
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
278 int dstStride[3];
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
279 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
280 printf("vo_vesa: draw_slice was called: w=%u h=%u x=%u y=%u\n",w,h,x,y);
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
281 dstStride[0]=dstride*((dstBpp+7)/8);
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
282 dstStride[1]=
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
283 dstStride[2]=dstStride[0]>>1;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
284 if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE();
10404
fdcb22f51ec3 10l (red <-> blue) fix
michael
parents: 10233
diff changeset
285 sws_scale_ordered(sws,image,stride,y,h,dst,dstStride);
2331
9e8585a7182e Final fix of libmpeg2 zooming: flipping page support
nick
parents: 2329
diff changeset
286 flip_trigger = 1;
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
287 return 0;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
288 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
289
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
290 /* Please comment it out if you want have OSD within movie */
6825
2cbf7d447bb2 Disable OSD outside movie, because it's not redrawn currently, user can use -vop expand to get osd outisde movie.
atmos4
parents: 6203
diff changeset
291 /*#define OSD_OUTSIDE_MOVIE 1*/
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
292
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
293 static void draw_alpha_32(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
294 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
295 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
296 #ifndef OSD_OUTSIDE_MOVIE
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
297 if(HAS_DGA())
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
298 {
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
299 x0 += x_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
300 y0 += y_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
301 }
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
302 #endif
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
303 vo_draw_alpha_rgb32(w,h,src,srca,stride,dga_buffer+4*(y0*dstride+x0),4*dstride);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
304 }
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
305
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
306 static void draw_alpha_24(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
307 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
308 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
309 #ifndef OSD_OUTSIDE_MOVIE
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
310 if(HAS_DGA())
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
311 {
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
312 x0 += x_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
313 y0 += y_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
314 }
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
315 #endif
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
316 vo_draw_alpha_rgb24(w,h,src,srca,stride,dga_buffer+3*(y0*dstride+x0),3*dstride);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
317 }
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
318
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
319 static void draw_alpha_16(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
320 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
321 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
322 #ifndef OSD_OUTSIDE_MOVIE
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
323 if(HAS_DGA())
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
324 {
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
325 x0 += x_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
326 y0 += y_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
327 }
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
328 #endif
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
329 vo_draw_alpha_rgb16(w,h,src,srca,stride,dga_buffer+2*(y0*dstride+x0),2*dstride);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
330 }
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
331
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
332 static void draw_alpha_15(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
333 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
334 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
335 #ifndef OSD_OUTSIDE_MOVIE
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
336 if(HAS_DGA())
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
337 {
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
338 x0 += x_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
339 y0 += y_offset;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
340 }
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
341 #endif
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
342 vo_draw_alpha_rgb15(w,h,src,srca,stride,dga_buffer+2*(y0*dstride+x0),2*dstride);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
343 }
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
344
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
345 static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
346 {
2688
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
347 UNUSED(x0);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
348 UNUSED(y0);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
349 UNUSED(w);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
350 UNUSED(h);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
351 UNUSED(src);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
352 UNUSED(srca);
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
353 UNUSED(stride);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
354 }
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
355
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
356
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
357 static void draw_osd(void)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
358 {
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
359 uint32_t w,h;
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
360 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
361 printf("vo_vesa: draw_osd was called\n");
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
362 {
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
363 #ifdef OSD_OUTSIDE_MOVIE
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
364 w = HAS_DGA()?video_mode_info.XResolution:dstW;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
365 h = HAS_DGA()?video_mode_info.YResolution:dstH;
4572
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
366 #else
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
367 w = dstW;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
368 h = dstH;
67d10f13a930 Configurable OSD zones
nick
parents: 4554
diff changeset
369 #endif
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
370 if(dga_buffer) vo_draw_text(w,h,draw_alpha_fnc);
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
371 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
372 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
373
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
374 static void flip_page(void)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
375 {
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
376 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
377 printf("vo_vesa: flip_page was called\n");
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
378 if(flip_trigger)
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
379 {
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
380 if(!HAS_DGA()) __vbeCopyData(dga_buffer);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
381 flip_trigger = 0;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
382 }
4493
be41ab8c8918 code cleanup
nick
parents: 4434
diff changeset
383 if(vo_doublebuffering && multi_size > 1)
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
384 {
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
385 int err;
4667
95fa3901cafc add vsync support for doublebuffering to vo_vesa
atmos4
parents: 4601
diff changeset
386 if((err=vbeSetDisplayStart(multi_buff[multi_idx],vo_vsync)) != VBE_OK)
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
387 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
388 vesa_term();
2692
b8e628b7a029 Minor notes
nick
parents: 2689
diff changeset
389 PRINT_VBE_ERR("vbeSetDisplayStart",err);
11678
972d1998bde9 occured --> occurred typo patch by Clinton Roy <croy@dstc.edu.au>
diego
parents: 11565
diff changeset
390 printf("vo_vesa: Fatal error occurred! Can't continue\n");
10734
b105d7aba10d remove exit_player and exit references
alex
parents: 10404
diff changeset
391 abort();
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
392 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
393 multi_idx = multi_idx ? 0 : 1;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
394 win.ptr = dga_buffer = video_base + multi_buff[multi_idx];
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
395 }
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
396 /*
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
397 else
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
398 if(tripple_buffering)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
399 {
4667
95fa3901cafc add vsync support for doublebuffering to vo_vesa
atmos4
parents: 4601
diff changeset
400 vbeSetScheduledDisplayStart(multi_buff[multi_idx],vo_vsync);
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
401 multi_idx++;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
402 if(multi_idx > 2) multi_idx = 0;
4667
95fa3901cafc add vsync support for doublebuffering to vo_vesa
atmos4
parents: 4601
diff changeset
403 win.ptr = dga_buffer = video_base + multi_buff[multi_idx];
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
404 }
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
405 */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
406 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
407
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
408 /* is called for rgb only */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
409 static uint32_t draw_frame(uint8_t *src[])
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
410 {
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
411 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
412 printf("vo_vesa: draw_frame was called\n");
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
413 if(sws)
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
414 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
415 unsigned int dstride=HAS_DGA()?video_mode_info.XResolution:dstW;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
416 int srcStride[1];
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
417 uint8_t *dst[3]= {dga_buffer, NULL, NULL};
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
418 int dstStride[3];
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
419 dstStride[0]=dstride*((dstBpp+7)/8);
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
420 dstStride[1]=
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
421 dstStride[2]=dstStride[0]>>1;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
422 if(srcFourcc == IMGFMT_RGB32 || srcFourcc == IMGFMT_BGR32)
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
423 srcStride[0] = srcW*4;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
424 else
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
425 if(srcFourcc == IMGFMT_RGB24 || srcFourcc == IMGFMT_BGR24)
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
426 srcStride[0] = srcW*3;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
427 else
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
428 srcStride[0] = srcW*2;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
429 if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE();
10404
fdcb22f51ec3 10l (red <-> blue) fix
michael
parents: 10233
diff changeset
430 sws_scale_ordered(sws,src,srcStride,0,srcH,dst,dstStride);
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
431 flip_trigger=1;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
432 }
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
433 return 0;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
434 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
435
2953
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
436 #define SUBDEV_NODGA 0x00000001UL
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
437 #define SUBDEV_FORCEDGA 0x00000002UL
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
438 static uint32_t subdev_flags = 0xFFFFFFFEUL;
2953
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
439 static uint32_t parseSubDevice(const char *sd)
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
440 {
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
441 uint32_t flags;
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
442 flags = 0;
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
443 if(strcmp(sd,"nodga") == 0) { flags |= SUBDEV_NODGA; flags &= ~(SUBDEV_FORCEDGA); }
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
444 else
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
445 if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; }
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
446 else
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
447 if(memcmp(sd,"lvo:",4) == 0) lvo_name = &sd[4]; /* lvo_name will be valid within init() */
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
448 #ifdef CONFIG_VIDIX
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
449 else
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
450 if(memcmp(sd,"vidix",5) == 0) vidix_name = &sd[5]; /* vidix_name will be valid within init() */
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
451 #endif
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
452 else { printf("vo_vesa: Unknown subdevice: '%s'\n", sd); return 0xFFFFFFFFUL; }
2953
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
453 return flags;
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
454 }
b0cf2b649d3c Fixed incorretc terminating of lvo stuff and improving of query_format
nick
parents: 2918
diff changeset
455
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
456 static uint32_t query_format(uint32_t format)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
457 {
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
458 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
459 printf("vo_vesa: query_format was called: %x (%s)\n",format,vo_format_name(format));
7690
d8ce19f6b1fe draw_slice() seems to support all csp
arpi
parents: 7650
diff changeset
460 return 1 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; /* due new SwScale code */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
461 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
462
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
463 static void paintBkGnd( void )
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
464 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
465 int x_res = video_mode_info.XResolution;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
466 int y_res = video_mode_info.YResolution;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
467 int x, y;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
468
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
469 for (y = 0; y < y_res; ++y)
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
470 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
471 for (x = 0; x < x_res; ++x)
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
472 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
473 int r, g, b;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
474 if ((x & 16) ^ (y & 16))
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
475 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
476 r = x * 255 / x_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
477 g = y * 255 / y_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
478 b = 255 - x * 255 / x_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
479 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
480 else
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
481 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
482 r = 255 - x * 255 / x_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
483 g = y * 255 / y_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
484 b = 255 - y * 255 / y_res;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
485 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
486 __vbeSetPixel(x, y, r, g, b);
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
487 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
488 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
489 }
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
490
2914
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
491 static void clear_screen( void )
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
492 {
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
493 int x_res = video_mode_info.XResolution;
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
494 int y_res = video_mode_info.YResolution;
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
495 int x, y;
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
496
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
497 for (y = 0; y < y_res; ++y)
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
498 for (x = 0; x < x_res; ++x)
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
499 __vbeSetPixel(x, y, 0, 0, 0);
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
500 }
1ccec8cd9310 Screen clearing instead of stupid BIOSes
nick
parents: 2872
diff changeset
501
2293
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
502 static char *model2str(unsigned char type)
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
503 {
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
504 char *retval;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
505 switch(type)
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
506 {
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
507 case memText: retval = "Text"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
508 case memCGA: retval="CGA"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
509 case memHercules: retval="Hercules"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
510 case memPL: retval="Planar"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
511 case memPK: retval="Packed pixel"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
512 case mem256: retval="256"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
513 case memRGB: retval="Direct color RGB"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
514 case memYUV: retval="Direct color YUV"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
515 default: retval="Unknown"; break;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
516 }
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
517 return retval;
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
518 }
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
519
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
520 unsigned fillMultiBuffer( unsigned long vsize, unsigned nbuffs )
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
521 {
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
522 unsigned long screen_size, offset;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
523 unsigned total,i;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
524 screen_size = video_mode_info.XResolution*video_mode_info.YResolution*((dstBpp+7)/8);
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
525 if(screen_size%64) screen_size=((screen_size/64)*64)+64;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
526 total = vsize / screen_size;
2918
a4646faefabd No comments
nick
parents: 2914
diff changeset
527 if(verbose) printf("vo_vesa: Can use up to %u video buffers\n",total);
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
528 i = 0;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
529 offset = 0;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
530 total = min(total,nbuffs);
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
531 while(i < total) { multi_buff[i++] = offset; offset += screen_size; }
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
532 if(!i)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
533 printf("vo_vesa: Your have too small size of video memory for this mode:\n"
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
534 "vo_vesa: Requires: %08lX exists: %08lX\n", screen_size, vsize);
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
535 return i;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
536 }
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
537
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
538
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
539 static int set_refresh(unsigned x, unsigned y, unsigned mode,struct VesaCRTCInfoBlock *crtc_pass)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
540 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
541 unsigned pixclk;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
542 float H_freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
543
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
544 range_t *monitor_hfreq = NULL;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
545 range_t *monitor_vfreq = NULL;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
546 range_t *monitor_dotclock = NULL;
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
547
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
548 monitor_hfreq = str2range(monitor_hfreq_str);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
549 monitor_vfreq = str2range(monitor_vfreq_str);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
550 monitor_dotclock = str2range(monitor_dotclock_str);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
551
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
552 if (!monitor_hfreq || !monitor_vfreq || !monitor_dotclock) {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
553 printf("vo_vesa: you have to specify the capabilities of"
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
554 " the monitor. Not changing refresh rate.\n");
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
555 return 0;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
556 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
557
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
558 H_freq = range_max(monitor_hfreq)/1000;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
559
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
560 // printf("H_freq MAX %f\n",H_freq);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
561
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
562 do
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
563 {
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
564 H_freq -= 0.01;
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
565 GTF_calcTimings(x,y,H_freq,GTF_HF,0, 0,crtc_pass);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
566 // printf("PixelCLK %d\n",(unsigned)crtc_pass->PixelClock);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
567 }
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
568 while ( (!in_range(monitor_vfreq,crtc_pass->RefreshRate/100)||
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
569 !in_range(monitor_hfreq,H_freq*1000))&&(H_freq>0));
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
570
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
571 pixclk = crtc_pass->PixelClock;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
572 // printf("PIXclk before %d\n",pixclk);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
573 vbeGetPixelClock(&mode,&pixclk);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
574 // printf("PIXclk after %d\n",pixclk);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
575 GTF_calcTimings(x,y,pixclk/1000000,GTF_PF,0,0,crtc_pass);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
576 // printf("Flags: %x\n",(unsigned) crtc_pass->Flags);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
577 /*
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
578 printf("hTotal %d\n",crtc_pass->hTotal);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
579 printf("hSyncStart %d\n",crtc_pass->hSyncStart);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
580 printf("hSyncEnd %d\n",crtc_pass->hSyncEnd);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
581
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
582 printf("vTotal %d\n",crtc_pass->vTotal);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
583 printf("vSyncStart %d\n",crtc_pass->vSyncStart);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
584 printf("vSyncEnd %d\n",crtc_pass->vSyncEnd);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
585
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
586 printf("RR %d\n",crtc_pass->RefreshRate);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
587 printf("PixelCLK %d\n",(unsigned)crtc_pass->PixelClock);*/
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
588
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
589 if (!in_range(monitor_vfreq,crtc_pass->RefreshRate/100)||
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
590 !in_range(monitor_hfreq,H_freq*1000)) {
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
591 printf( "vo_vesa: Unable to fit the mode into monitor's limitation."
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
592 " Not changing refresh rate.\n");
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
593 return 0;
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
594 }
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
595
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
596 return 1;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
597 }
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
598
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
599 /* fullscreen:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
600 * bit 0 (0x01) means fullscreen (-fs)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
601 * bit 1 (0x02) means mode switching (-vm)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
602 * bit 2 (0x04) enables software scaling (-zoom)
2335
26fdd1a317ad Again changed logic:
nick
parents: 2333
diff changeset
603 * bit 3 (0x08) enables flipping (-flip) (NK: and for what?)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
604 */
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
605
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
606 static uint32_t
7124
eca7dbad0166 finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents: 7069
diff changeset
607 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
608 {
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
609 struct VbeInfoBlock vib;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
610 struct VesaModeInfoBlock vmib;
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
611 struct VesaCRTCInfoBlock crtc_pass;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
612 size_t i,num_modes;
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
613 uint32_t w,h;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
614 unsigned short *mode_ptr,win_seg;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
615 unsigned bpp,best_x = UINT_MAX,best_y=UINT_MAX,best_mode_idx = UINT_MAX;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
616 int err,fs_mode,use_scaler=0;
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
617 srcW = dstW = width;
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
618 srcH = dstH = height;
2336
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
619 fs_mode = 0;
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
620 if(subdev_flags == 0xFFFFFFFEUL)
2971
56faed773768 Added preinit of lvo stuff
nick
parents: 2966
diff changeset
621 {
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
622 printf("vo_vesa: detected internal fatal error: init is called before preinit\n");
2971
56faed773768 Added preinit of lvo stuff
nick
parents: 2966
diff changeset
623 return -1;
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
624 }
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
625 if(subdev_flags == 0xFFFFFFFFUL) return -1;
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
626 if(flags & 0x8)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
627 {
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
628 printf("vo_vesa: switch -flip is not supported\n");
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
629 }
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
630 if(flags & 0x04) use_scaler = 1;
2336
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
631 if(flags & 0x01)
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
632 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
633 if(use_scaler) use_scaler = 2;
2336
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
634 else fs_mode = 1;
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
635 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
636 if((err=vbeInit()) != VBE_OK) { PRINT_VBE_ERR("vbeInit",err); return -1; }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
637 memcpy(vib.VESASignature,"VBE2",4);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
638 if((err=vbeGetControllerInfo(&vib)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
639 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
640 PRINT_VBE_ERR("vbeGetControllerInfo",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
641 printf("vo_vesa: possible reason: No VBE2 BIOS found\n");
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
642 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
643 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
644 /* Print general info here */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
645 printf("vo_vesa: Found VESA VBE BIOS Version %x.%x Revision: %x\n",
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
646 (int)(vib.VESAVersion >> 8) & 0xff,
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
647 (int)(vib.VESAVersion & 0xff),
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
648 (int)(vib.OemSoftwareRev & 0xffff));
2255
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
649 printf("vo_vesa: Video memory: %u Kb\n",vib.TotalMemory*64);
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
650 printf("vo_vesa: VESA Capabilities: %s %s %s %s %s\n"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
651 ,vib.Capabilities & VBE_DAC_8BIT ? "8-bit DAC," : "6-bit DAC,"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
652 ,vib.Capabilities & VBE_NONVGA_CRTC ? "non-VGA CRTC,":"VGA CRTC,"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
653 ,vib.Capabilities & VBE_SNOWED_RAMDAC ? "snowed RAMDAC,":"normal RAMDAC,"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
654 ,vib.Capabilities & VBE_STEREOSCOPIC ? "stereoscopic,":"no stereoscopic,"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
655 ,vib.Capabilities & VBE_STEREO_EVC ? "Stereo EVC":"no stereo");
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
656 printf("vo_vesa: !!! Below will be printed OEM info. !!!\n");
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
657 printf("vo_vesa: You should watch 5 OEM related lines below else you've broken vm86\n");
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
658 printf("vo_vesa: OEM info: %s\n",vib.OemStringPtr);
2255
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
659 printf("vo_vesa: OEM Revision: %x\n",vib.OemSoftwareRev);
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
660 printf("vo_vesa: OEM vendor: %s\n",vib.OemVendorNamePtr);
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
661 printf("vo_vesa: OEM Product Name: %s\n",vib.OemProductNamePtr);
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
662 printf("vo_vesa: OEM Product Rev: %s\n",vib.OemProductRevPtr);
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
663 printf("vo_vesa: Hint: To get workable TV-Out you should have plugged tv-connector in\n"
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
664 "vo_vesa: before booting PC since VESA BIOS initializes itself only during POST\n");
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
665 /* Find best mode here */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
666 num_modes = 0;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
667 mode_ptr = vib.VideoModePtr;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
668 while(*mode_ptr++ != 0xffff) num_modes++;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
669 switch(format)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
670 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
671 case IMGFMT_BGR8:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
672 case IMGFMT_RGB8: bpp = 8; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
673 case IMGFMT_BGR15:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
674 case IMGFMT_RGB15: bpp = 15; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
675 case IMGFMT_BGR16:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
676 case IMGFMT_RGB16: bpp = 16; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
677 case IMGFMT_BGR24:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
678 case IMGFMT_RGB24: bpp = 24; break;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
679 case IMGFMT_BGR32:
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
680 case IMGFMT_RGB32: bpp = 32; break;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
681 default: bpp = 16; break;
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
682 }
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
683 srcBpp = bpp;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
684 srcFourcc = format;
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
685 if(vo_dbpp) bpp = vo_dbpp;
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
686 switch(bpp)
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
687 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
688 case 15: draw_alpha_fnc = draw_alpha_15;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
689 dstFourcc = IMGFMT_BGR15;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
690 break;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
691 case 16: draw_alpha_fnc = draw_alpha_16;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
692 dstFourcc = IMGFMT_BGR16;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
693 break;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
694 case 24: draw_alpha_fnc = draw_alpha_24;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
695 dstFourcc = IMGFMT_BGR24;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
696 break;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
697 case 32: draw_alpha_fnc = draw_alpha_32;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
698 dstFourcc = IMGFMT_BGR32;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
699 break;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
700 default: draw_alpha_fnc = draw_alpha_null;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
701 dstFourcc = IMGFMT_BGR16;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
702 break;
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
703 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
704 if(verbose)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
705 {
2304
0769b2fb3ce2 Fixed zooming bug
nick
parents: 2298
diff changeset
706 printf("vo_vesa: Requested mode: %ux%u@%u (%s)\n",width,height,bpp,vo_format_name(format));
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
707 printf("vo_vesa: Total modes found: %u\n",num_modes);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
708 mode_ptr = vib.VideoModePtr;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
709 printf("vo_vesa: Mode list:");
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
710 for(i = 0;i < num_modes;i++)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
711 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
712 printf(" %04X",mode_ptr[i]);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
713 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
714 printf("\nvo_vesa: Modes in detail:\n");
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
715 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
716 mode_ptr = vib.VideoModePtr;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
717 if(use_scaler)
2335
26fdd1a317ad Again changed logic:
nick
parents: 2333
diff changeset
718 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
719 dstW = d_width;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
720 dstH = d_height;
2335
26fdd1a317ad Again changed logic:
nick
parents: 2333
diff changeset
721 }
26fdd1a317ad Again changed logic:
nick
parents: 2333
diff changeset
722 if(vo_screenwidth) w = vo_screenwidth;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
723 else w = max(dstW,width);
2335
26fdd1a317ad Again changed logic:
nick
parents: 2333
diff changeset
724 if(vo_screenheight) h = vo_screenheight;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
725 else h = max(dstH,height);
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
726 for(i=0;i < num_modes;i++)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
727 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
728 if((err=vbeGetModeInfo(mode_ptr[i],&vmib)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
729 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
730 PRINT_VBE_ERR("vbeGetModeInfo",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
731 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
732 }
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
733 if(vmib.XResolution >= w &&
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
734 vmib.YResolution >= h &&
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
735 (vmib.ModeAttributes & MOVIE_MODE) == MOVIE_MODE &&
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
736 vmib.BitsPerPixel == bpp &&
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
737 vmib.MemoryModel == memRGB)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
738 {
2293
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
739 if(vmib.XResolution <= best_x &&
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
740 vmib.YResolution <= best_y)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
741 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
742 best_x = vmib.XResolution;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
743 best_y = vmib.YResolution;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
744 best_mode_idx = i;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
745 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
746 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
747 if(verbose)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
748 {
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
749 printf("vo_vesa: Mode (%03u): mode=%04X %ux%u@%u attr=%04X\n"
2293
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
750 "vo_vesa: #planes=%u model=%u(%s) #pages=%u\n"
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
751 "vo_vesa: winA=%X(attr=%u) winB=%X(attr=%u) winSize=%u winGran=%u\n"
2446
6fb598bd7ede Suppressing warnings
nick
parents: 2410
diff changeset
752 "vo_vesa: direct_color=%u DGA_phys_addr=%08lX\n"
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
753 ,i,mode_ptr[i],vmib.XResolution,vmib.YResolution,vmib.BitsPerPixel,vmib.ModeAttributes
2293
638cd37032da Better resolution detection
nick
parents: 2255
diff changeset
754 ,vmib.NumberOfPlanes,vmib.MemoryModel,model2str(vmib.MemoryModel),vmib.NumberOfImagePages
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
755 ,vmib.WinASegment,vmib.WinAAttributes,vmib.WinBSegment,vmib.WinBAttributes,vmib.WinSize,vmib.WinGranularity
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
756 ,vmib.DirectColorModeInfo,vmib.PhysBasePtr);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
757 if(vmib.MemoryModel == 6 || vmib.MemoryModel == 7)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
758 printf("vo_vesa: direct_color_info = %u:%u:%u:%u\n"
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
759 ,vmib.RedMaskSize,vmib.GreenMaskSize,vmib.BlueMaskSize,vmib.RsvdMaskSize);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
760 fflush(stdout);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
761 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
762 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
763 if(best_mode_idx != UINT_MAX)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
764 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
765 video_mode = vib.VideoModePtr[best_mode_idx];
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
766 fflush(stdout);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
767 if((err=vbeGetMode(&init_mode)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
768 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
769 PRINT_VBE_ERR("vbeGetMode",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
770 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
771 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
772 if(verbose) printf("vo_vesa: Initial video mode: %x\n",init_mode);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
773 if((err=vbeGetModeInfo(video_mode,&video_mode_info)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
774 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
775 PRINT_VBE_ERR("vbeGetModeInfo",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
776 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
777 }
7025
3bc8ff93d64e 10l bug - noticed by Emiel Neggers <emiel@neggers.net>
arpi
parents: 6825
diff changeset
778 dstBpp = video_mode_info.BitsPerPixel;
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
779 printf("vo_vesa: Using VESA mode (%u) = %x [%ux%u@%u]\n"
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
780 ,best_mode_idx,video_mode,video_mode_info.XResolution
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
781 ,video_mode_info.YResolution,dstBpp);
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
782 if(subdev_flags & SUBDEV_NODGA) video_mode_info.PhysBasePtr = 0;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
783 if(use_scaler || fs_mode)
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
784 {
2304
0769b2fb3ce2 Fixed zooming bug
nick
parents: 2298
diff changeset
785 /* software scale */
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
786 if(use_scaler > 1)
2689
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
787 {
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
788 aspect_save_orig(width,height);
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
789 aspect_save_prescale(d_width,d_height);
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
790 aspect_save_screenres(video_mode_info.XResolution,video_mode_info.YResolution);
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
791 aspect(&dstW,&dstH,A_ZOOM);
2689
6a5b6b16d85c Use standard aspect code
nick
parents: 2688
diff changeset
792 }
2336
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
793 else
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
794 if(fs_mode)
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
795 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
796 dstW = video_mode_info.XResolution;
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
797 dstH = video_mode_info.YResolution;
2336
b2e0b131c1a7 Again changed logic:
nick
parents: 2335
diff changeset
798 }
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
799 use_scaler = 1;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
800 }
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
801 if(!lvo_name
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
802 #ifdef CONFIG_VIDIX
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
803 && !vidix_name
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
804 #endif
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
805 )
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
806 {
9494
543ab3909b78 sws_ prefix, more seperation between internal & external swscaler API
michael
parents: 9380
diff changeset
807 sws = sws_getContextFromCmdLine(srcW,srcH,srcFourcc,dstW,dstH,dstFourcc);
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
808 if(!sws)
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
809 {
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
810 printf("vo_vesa: Can't initialize SwScaler\n");
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
811 return -1;
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
812 }
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
813 else if(verbose) printf("vo_vesa: Using SW BES emulator\n");
2298
674acdf0aa43 SwScaling support
nick
parents: 2296
diff changeset
814 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
815 if((video_mode_info.WinAAttributes & FRAME_MODE) == FRAME_MODE)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
816 win.idx = 0; /* frame A */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
817 else
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
818 if((video_mode_info.WinBAttributes & FRAME_MODE) == FRAME_MODE)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
819 win.idx = 1; /* frame B */
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
820 else win.idx = -2;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
821 /* Try use DGA instead */
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
822 if(video_mode_info.PhysBasePtr && vib.TotalMemory && (video_mode_info.ModeAttributes & MODE_ATTR_LINEAR))
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
823 {
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
824 void *lfb;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
825 unsigned long vsize;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
826 vsize = vib.TotalMemory*64*1024;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
827 lfb = vbeMapVideoBuffer(video_mode_info.PhysBasePtr,vsize);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
828 if(lfb == NULL)
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
829 printf("vo_vesa: Can't use DGA. Force bank switching mode. :(\n");
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
830 else
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
831 {
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
832 video_base = win.ptr = lfb;
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
833 win.low = 0UL;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
834 win.high = vsize;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
835 win.idx = -1; /* HAS_DGA() is on */
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
836 video_mode |= VESA_MODE_USE_LINEAR;
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
837 printf("vo_vesa: Using DGA (physical resources: %08lXh, %08lXh)"
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
838 ,video_mode_info.PhysBasePtr
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
839 ,vsize);
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
840 if(verbose) printf(" at %08lXh",(unsigned long)lfb);
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
841 printf("\n");
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
842 if(!(multi_size = fillMultiBuffer(vsize,2))) return -1;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
843 if(vo_doublebuffering && multi_size < 2)
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
844 printf("vo_vesa: Can't use double buffering: not enough video memory\n");
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
845 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
846 }
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
847 if(win.idx == -2)
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
848 {
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
849 printf("vo_vesa: Can't find neither DGA nor relocatable window's frame.\n");
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
850 return -1;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
851 }
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
852 if(!HAS_DGA())
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
853 {
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
854 if(subdev_flags & SUBDEV_FORCEDGA)
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
855 {
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
856 printf("vo_vesa: you've forced DGA. Exiting\n");
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
857 return -1;
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
858 }
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
859 if(!(win_seg = win.idx == 0 ? video_mode_info.WinASegment:video_mode_info.WinBSegment))
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
860 {
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
861 printf("vo_vesa: Can't find valid window address\n");
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
862 return -1;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
863 }
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
864 win.ptr = PhysToVirtSO(win_seg,0);
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
865 win.low = 0L;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
866 win.high= video_mode_info.WinSize*1024;
2649
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
867 printf("vo_vesa: Using bank switching mode (physical resources: %08lXh, %08lXh)\n"
d05fc32b7984 What's new:
nick
parents: 2637
diff changeset
868 ,(unsigned long)win.ptr,(unsigned long)win.high);
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
869 }
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
870 if(video_mode_info.XResolution > dstW)
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
871 x_offset = (video_mode_info.XResolution - dstW) / 2;
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
872 else x_offset = 0;
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
873 if(video_mode_info.YResolution > dstH)
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
874 y_offset = (video_mode_info.YResolution - dstH) / 2;
2329
fc52a0a1626f Support of: -x -y -bpp
nick
parents: 2328
diff changeset
875 else y_offset = 0;
2305
82c17b134946 Fixed half-image bug and added computing of correct aspect during zooming
nick
parents: 2304
diff changeset
876 if(verbose)
82c17b134946 Fixed half-image bug and added computing of correct aspect during zooming
nick
parents: 2304
diff changeset
877 printf("vo_vesa: image: %ux%u screen = %ux%u x_offset = %u y_offset = %u\n"
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
878 ,dstW,dstH
2305
82c17b134946 Fixed half-image bug and added computing of correct aspect during zooming
nick
parents: 2304
diff changeset
879 ,video_mode_info.XResolution,video_mode_info.YResolution
82c17b134946 Fixed half-image bug and added computing of correct aspect during zooming
nick
parents: 2304
diff changeset
880 ,x_offset,y_offset);
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
881 if(HAS_DGA())
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
882 {
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
883 dga_buffer = win.ptr; /* Trickly ;) */
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
884 cpy_blk_fnc = __vbeCopyBlockFast;
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
885 }
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
886 else
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2554
diff changeset
887 {
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
888 cpy_blk_fnc = __vbeCopyBlock;
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
889 if(!lvo_name
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
890 #ifdef CONFIG_VIDIX
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
891 && !vidix_name
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
892 #endif
4601
8cda24d7f074 Make code simple. Use swScaler even for fastmemcpy purposes :)
nick
parents: 4596
diff changeset
893 )
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
894 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
895 if(!(dga_buffer = memalign(64,video_mode_info.XResolution*video_mode_info.YResolution*dstBpp)))
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2554
diff changeset
896 {
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
897 printf("vo_vesa: Can't allocate temporary buffer\n");
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
898 return -1;
2610
65cb69a90a9f vo_vesa: DGA support
nick
parents: 2554
diff changeset
899 }
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
900 if(verbose) printf("vo_vesa: dga emulator was allocated = %p\n",dga_buffer);
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
901 }
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
902 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
903 if((err=vbeSaveState(&init_state)) != VBE_OK)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
904 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
905 PRINT_VBE_ERR("vbeSaveState",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
906 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
907 }
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
908
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
909 /* TODO:
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
910 user might pass refresh value,
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
911 GTF constants might be read from monitor
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
912 for best results, I don't have a spec (RM)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
913 */
7360
18e1b57616fc It prevents mode change when Hsync out of range.
arpi
parents: 7124
diff changeset
914
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
915 if (((int)(vib.VESAVersion >> 8) & 0xff) > 2) {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
916
7650
7e8193475ddf a small fix for vo_vesa, when calling set_refresh, when -nofs used.
arpi
parents: 7360
diff changeset
917 if (set_refresh(video_mode_info.XResolution,video_mode_info.YResolution,video_mode,&crtc_pass))
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
918 video_mode = video_mode | 0x800;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
919
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
920 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
921
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
922 ;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
923
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
924 if ((err=vbeSetMode(video_mode,&crtc_pass)) != VBE_OK)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
925 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
926 PRINT_VBE_ERR("vbeSetMode",err);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
927 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
928 }
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents: 7025
diff changeset
929
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
930 /* Now we are in video mode!!!*/
2337
e6d8e9a54afa OSD support
nick
parents: 2336
diff changeset
931 /* Below 'return -1' is impossible */
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
932 if(verbose)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
933 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
934 printf("vo_vesa: Graphics mode was activated\n");
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
935 fflush(stdout);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
936 }
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
937 if(lvo_name)
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
938 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
939 if(vlvo_init(width,height,x_offset,y_offset,dstW,dstH,format,dstBpp) != 0)
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
940 {
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
941 printf("vo_vesa: Can't initialize Linux Video Overlay\n");
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
942 vesa_term();
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
943 return -1;
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
944 }
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
945 else printf("vo_vesa: Using video overlay: %s\n",lvo_name);
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
946 lvo_opened = 1;
2869
107d9e9e5bd1 New video output technique Linux Video Overlay:
nick
parents: 2775
diff changeset
947 }
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
948 #ifdef CONFIG_VIDIX
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
949 else
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
950 if(vidix_name)
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
951 {
4537
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
952 if(vidix_init(width,height,x_offset,y_offset,dstW,
bc5b78f1df77 Support of scaling with every fourcc
nick
parents: 4493
diff changeset
953 dstH,format,dstBpp,
7124
eca7dbad0166 finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents: 7069
diff changeset
954 video_mode_info.XResolution,video_mode_info.YResolution) != 0)
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
955 {
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
956 printf("vo_vesa: Can't initialize VIDIX driver\n");
4548
59a90d0d662d Correct vesa shutdown on 'config playback' errors
nick
parents: 4537
diff changeset
957 vesa_term();
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
958 return -1;
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
959 }
4083
00c1bba6ca14 Minor bugs and new vidix stuff support
nick
parents: 4030
diff changeset
960 else printf("vo_vesa: Using VIDIX\n");
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4089
diff changeset
961 vidix_start();
11158
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
962
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
963 /* set colorkey */
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
964 if (vidix_grkey_support())
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
965 {
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
966 vidix_grkey_get(&gr_key);
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
967 gr_key.key_op = KEYS_PUT;
11216
30eccb0d1a64 fixed -nocolorkey
alex
parents: 11158
diff changeset
968 if (!(vo_colorkey & 0xFF000000))
11158
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
969 {
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
970 gr_key.ckey.op = CKEY_TRUE;
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
971 gr_key.ckey.red = (vo_colorkey & 0x00FF0000) >> 16;
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
972 gr_key.ckey.green = (vo_colorkey & 0x0000FF00) >> 8;
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
973 gr_key.ckey.blue = vo_colorkey & 0x000000FF;
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
974 } else
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
975 gr_key.ckey.op = CKEY_FALSE;
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
976 vidix_grkey_set(&gr_key);
85f4534d1edb Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents: 10734
diff changeset
977 }
9883
3a407acefec5 multiple init fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9714
diff changeset
978 vidix_opened = 1;
4030
922241968c63 Embedding vidix
nick
parents: 4002
diff changeset
979 }
4089
e1c6178de089 Configurable VIDIX usage
nick
parents: 4083
diff changeset
980 #endif
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
981 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
982 else
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
983 {
2255
98c2bfc87825 More hints. Use save-restore mechanism
nick
parents: 2244
diff changeset
984 printf("vo_vesa: Can't find mode for: %ux%u@%u\n",width,height,bpp);
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
985 return -1;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
986 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
987 if(verbose)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
988 {
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
989 printf("vo_vesa: VESA initialization complete\n");
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
990 fflush(stdout);
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
991 }
2688
e9f6634c6374 Code cleanup
nick
parents: 2686
diff changeset
992 if(HAS_DGA() && vo_doublebuffering)
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
993 {
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
994 for(i=0;i<MAX_BUFFERS;i++)
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
995 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
996 win.ptr = dga_buffer = video_base + multi_buff[i];
8652
edfe94b9d578 Juste a trivial patch for vesa output. The screen were cleaned at init
arpi
parents: 8148
diff changeset
997 clear_screen(); /* Clear screen for stupid BIOSes */
4002
6ce744b637ad paint background on -v -v
nick
parents: 3209
diff changeset
998 if(verbose>1) paintBkGnd();
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
999 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1000 }
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1001 else
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
1002 {
8652
edfe94b9d578 Juste a trivial patch for vesa output. The screen were cleaned at init
arpi
parents: 8148
diff changeset
1003 clear_screen(); /* Clear screen for stupid BIOSes */
9714
3ed7400a9e74 Only write title if verbose>0.
ranma
parents: 9632
diff changeset
1004 if(verbose>1)
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1005 {
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1006 int x;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1007 x = (video_mode_info.XResolution/video_mode_info.XCharSize)/2-strlen(title)/2;
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1008 if(x < 0) x = 0;
9714
3ed7400a9e74 Only write title if verbose>0.
ranma
parents: 9632
diff changeset
1009 paintBkGnd();
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1010 vbeWriteString(x,0,7,title);
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1011 }
2633
fe5ab8c660de Qualitative speedup decoding when video card supports DGA!
nick
parents: 2610
diff changeset
1012 }
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1013 return 0;
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1014 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1015
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1016 static void
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1017 uninit(void)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1018 {
8786
605c85c27e68 Not checking it caused SIGSEV when uninitning after vesa init failed.
filon
parents: 8652
diff changeset
1019 // not inited
2686
44ff6b5c7cea Double buffering support
nick
parents: 2676
diff changeset
1020 vesa_term();
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
1021 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
1022 printf("vo_vesa: uninit was called\n");
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1023 }
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1024
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1025
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1026 static void check_events(void)
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1027 {
2504
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
1028 if(verbose > 2)
13e1c5ab417a vo_vesa: rgb2rgb support
nick
parents: 2446
diff changeset
1029 printf("vo_vesa: check_events was called\n");
2244
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1030 /* Nothing to do */
4e464b527f5a vo_vesa support
nick
parents:
diff changeset
1031 }
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1032
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1033 static uint32_t preinit(const char *arg)
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1034 {
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1035 int pre_init_err = 0;
8791
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1036 int fd;
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1037 if(verbose>1) printf("vo_vesa: preinit(%s) was called\n",arg);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1038 if(verbose > 2)
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1039 printf("vo_vesa: subdevice %s is being initialized\n",arg);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1040 subdev_flags = 0;
9958
fe733da8e8b9 10l fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9883
diff changeset
1041 lvo_name = NULL;
fe733da8e8b9 10l fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9883
diff changeset
1042 #ifdef CONFIG_VIDIX
fe733da8e8b9 10l fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9883
diff changeset
1043 vidix_name = NULL;
fe733da8e8b9 10l fix by Aurelien JACOBS <aurel@gnuage.org>
alex
parents: 9883
diff changeset
1044 #endif
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1045 if(arg) subdev_flags = parseSubDevice(arg);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1046 if(lvo_name) pre_init_err = vlvo_preinit(lvo_name);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1047 #ifdef CONFIG_VIDIX
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1048 else if(vidix_name) pre_init_err = vidix_preinit(vidix_name,&video_out_vesa);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1049 #endif
8791
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1050 // check if we can open /dev/mem (it will be opened later in config(), but if we
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1051 // detect now that we can't we can exit cleanly)
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1052 fd = open("/dev/mem", O_RDWR);
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1053 if (fd < 0)
668b30187d48 Check if we can open /dev/mem in preinit(), so we can exit cleanly.
filon
parents: 8786
diff changeset
1054 return -1;
8792
filon
parents: 8791
diff changeset
1055 else
filon
parents: 8791
diff changeset
1056 close(fd);
4362
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1057 if(verbose > 2)
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1058 printf("vo_subdevice: initialization returns: %i\n",pre_init_err);
7ef67ffa9274 preinit usage
nick
parents: 4352
diff changeset
1059 return pre_init_err;
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1060 }
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1061
4596
c35d7ce151b3 10000hl to Holm... control MUST BE static...
arpi
parents: 4592
diff changeset
1062 static uint32_t control(uint32_t request, void *data, ...)
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1063 {
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4572
diff changeset
1064 switch (request) {
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4572
diff changeset
1065 case VOCTRL_QUERY_FORMAT:
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4572
diff changeset
1066 return query_format(*((uint32_t*)data));
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4572
diff changeset
1067 }
11565
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1068
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1069 #ifdef CONFIG_VIDIX
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1070 if (vidix_name) {
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1071 switch (request) {
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1072 case VOCTRL_SET_EQUALIZER:
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1073 {
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1074 va_list ap;
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1075 int value;
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1076
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1077 va_start(ap, data);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1078 value = va_arg(ap, int);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1079 va_end(ap);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1080
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1081 return vidix_control(request, data, (int *)value);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1082 }
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1083 case VOCTRL_GET_EQUALIZER:
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1084 {
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1085 va_list ap;
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1086 int *value;
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1087
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1088 va_start(ap, data);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1089 value = va_arg(ap, int*);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1090 va_end(ap);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1091
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1092 return vidix_control(request, data, value);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1093 }
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1094 }
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1095 return vidix_control(request, data);
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1096 }
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1097 #endif
0d24c99199e2 Some more vidix crap - vidix equalizer passthrough. Patch by Oleg I. Vdovikin <vdovikin@jscc.ru>
alex
parents: 11216
diff changeset
1098
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4572
diff changeset
1099 return VO_NOTIMPL;
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4198
diff changeset
1100 }