Mercurial > mplayer.hg
annotate libvo/sdl_common.c @ 33517:850a3272e10d
Change code to allow STREAM_CTRL_GET_CURRENT_TIME with cache enabled.
Due to that time being from what is currently read into the cache it
is unfortunately somewhat inaccurate and unsmooth, however for streams
that do have stream timestamps it is till a lot better than going by
the demuxer alone.
In particular it fixes bug #1081, when starting a DVD with -chapter
following seeks would be relative to the start of the DVD instead
of the current position.
author | reimar |
---|---|
date | Sun, 12 Jun 2011 11:26:22 +0000 |
parents | 2211cc2fb0c3 |
children | 3c51a42da09c |
rev | line source |
---|---|
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
1 /* |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
2 * common SDL routines |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
3 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
4 * This file is part of MPlayer. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
5 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
9 * (at your option) any later version. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
10 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
14 * GNU General Public License for more details. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
15 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
19 */ |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
20 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
21 #include "sdl_common.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
22 #include "mp_msg.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
23 #include "mp_fifo.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
24 #include "osdep/keycodes.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
25 #include "input/input.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
26 #include "input/mouse.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
27 #include "video_out.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
28 |
31035 | 29 static int old_w; |
30 static int old_h; | |
31 static int mode_flags; | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
32 static int reinit; |
31035 | 33 |
31037 | 34 int vo_sdl_init(void) |
35 { | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
36 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
37 |
31037 | 38 if (!SDL_WasInit(SDL_INIT_VIDEO) && |
39 SDL_Init(SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE) < 0) | |
40 return 0; | |
41 | |
42 // Setup Keyrepeats (500/30 are defaults) | |
43 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, 100 /*SDL_DEFAULT_REPEAT_INTERVAL*/); | |
44 | |
31038
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
45 // Easiest way to get uppercase characters |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
46 SDL_EnableUNICODE(1); |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
47 |
31037 | 48 // We don't want those in our event queue. |
49 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE); | |
50 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); | |
51 SDL_EventState(SDL_USEREVENT, SDL_IGNORE); | |
52 | |
53 return 1; | |
54 } | |
55 | |
56 void vo_sdl_uninit(void) | |
57 { | |
58 if (SDL_WasInit(SDL_INIT_VIDEO)) | |
59 SDL_QuitSubSystem(SDL_INIT_VIDEO); | |
60 } | |
61 | |
31035 | 62 void vo_sdl_fullscreen(void) |
63 { | |
64 if (vo_fs) { | |
65 vo_dwidth = old_w; | |
66 vo_dheight = old_h; | |
67 } else { | |
68 old_w = vo_dwidth; | |
69 old_h = vo_dheight; | |
70 vo_dwidth = vo_screenwidth; | |
71 vo_dheight = vo_screenheight; | |
72 } | |
73 vo_fs = !vo_fs; | |
74 sdl_set_mode(0, mode_flags); | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
75 // on OSX at least we now need to do a full reinit. |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
76 // TODO: this should only be set if really necessary. |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
77 reinit = 1; |
31035 | 78 } |
79 | |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
80 int sdl_set_mode(int bpp, uint32_t flags) |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
81 { |
31035 | 82 SDL_Surface *s; |
83 mode_flags = flags; | |
84 if (vo_fs) flags |= SDL_FULLSCREEN; | |
85 // doublebuf with opengl creates flickering | |
86 if (vo_doublebuffering && !(flags & SDL_OPENGL)) | |
87 flags |= SDL_DOUBLEBUF; | |
88 s = SDL_SetVideoMode(vo_dwidth, vo_dheight, bpp, flags); | |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
89 if (!s) { |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
90 mp_msg(MSGT_VO, MSGL_FATAL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
91 return -1; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
92 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
93 vo_dwidth = s->w; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
94 vo_dheight = s->h; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
95 return 0; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
96 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
97 |
31040 | 98 static const struct mp_keymap keysym_map[] = { |
99 {SDLK_RETURN, KEY_ENTER}, {SDLK_ESCAPE, KEY_ESC}, | |
100 {SDLK_F1, KEY_F+1}, {SDLK_F2, KEY_F+2}, {SDLK_F3, KEY_F+3}, | |
101 {SDLK_F4, KEY_F+4}, {SDLK_F5, KEY_F+5}, {SDLK_F6, KEY_F+6}, | |
102 {SDLK_F7, KEY_F+7}, {SDLK_F8, KEY_F+8}, {SDLK_F9, KEY_F+9}, | |
103 {SDLK_F10, KEY_F+10}, {SDLK_F11, KEY_F+11}, {SDLK_F12, KEY_F+12}, | |
104 {SDLK_KP_PLUS, '+'}, {SDLK_KP_MINUS, '-'}, {SDLK_TAB, KEY_TAB}, | |
105 {SDLK_PAGEUP, KEY_PAGE_UP}, {SDLK_PAGEDOWN, KEY_PAGE_DOWN}, | |
106 {SDLK_UP, KEY_UP}, {SDLK_DOWN, KEY_DOWN}, | |
107 {SDLK_LEFT, KEY_LEFT}, {SDLK_RIGHT, KEY_RIGHT}, | |
108 {SDLK_KP_MULTIPLY, '*'}, {SDLK_KP_DIVIDE, '/'}, | |
109 {SDLK_KP0, KEY_KP0}, {SDLK_KP1, KEY_KP1}, {SDLK_KP2, KEY_KP2}, | |
110 {SDLK_KP3, KEY_KP3}, {SDLK_KP4, KEY_KP4}, {SDLK_KP5, KEY_KP5}, | |
111 {SDLK_KP6, KEY_KP6}, {SDLK_KP7, KEY_KP7}, {SDLK_KP8, KEY_KP8}, | |
112 {SDLK_KP9, KEY_KP9}, | |
113 {SDLK_KP_PERIOD, KEY_KPDEC}, {SDLK_KP_ENTER, KEY_KPENTER}, | |
31318 | 114 {0, 0} |
31040 | 115 }; |
116 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
117 int sdl_default_handle_event(SDL_Event *event) |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
118 { |
31040 | 119 int mpkey; |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
120 if (!event) { |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
121 int res = reinit ? VO_EVENT_REINIT : 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
122 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
123 return res; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
124 } |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
125 switch (event->type) { |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
126 case SDL_VIDEORESIZE: |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
127 vo_dwidth = event->resize.w; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
128 vo_dheight = event->resize.h; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
129 return VO_EVENT_RESIZE; |
31046 | 130 |
31042 | 131 case SDL_VIDEOEXPOSE: |
132 return VO_EVENT_EXPOSE; | |
31046 | 133 |
31050 | 134 case SDL_MOUSEMOTION: |
135 vo_mouse_movement(event->motion.x, event->motion.y); | |
136 break; | |
137 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
138 case SDL_MOUSEBUTTONDOWN: |
31046 | 139 if (!vo_nomouse_input) |
140 mplayer_put_key((MOUSE_BTN0 + event->button.button - 1) | MP_KEY_DOWN); | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
141 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
142 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
143 case SDL_MOUSEBUTTONUP: |
31051 | 144 if (!vo_nomouse_input) |
31046 | 145 mplayer_put_key(MOUSE_BTN0 + event->button.button - 1); |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
146 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
147 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
148 case SDL_KEYDOWN: |
31040 | 149 mpkey = lookup_keymap_table(keysym_map, event->key.keysym.sym); |
150 if (!mpkey && | |
151 event->key.keysym.unicode > 0 && | |
152 event->key.keysym.unicode < 128) | |
153 mpkey = event->key.keysym.unicode; | |
154 if (mpkey) | |
155 mplayer_put_key(mpkey); | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
156 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
157 |
31046 | 158 case SDL_QUIT: |
159 mplayer_put_key(KEY_CLOSE_WIN); | |
160 break; | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
161 } |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
162 return 0; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
163 } |