Mercurial > mplayer.hg
annotate mp_fifo.c @ 35005:b1a1dcae9760
Replace MESA YCBCR support by the Apple variant.
This adds hardware support for yuy2 and uyvy color formats when running
on OSX.
In addition add some hacks to make it fast (at least on PPC Mac Mini running
OSX 10.5), ca. 20% faster than -vo corevideo.
The MESA YCBCR variant never worked properly and has become even more broken
and thus been disabled in most maintained drivers and thus is really
a dead-end.
author | reimar |
---|---|
date | Sat, 18 Aug 2012 15:54:34 +0000 |
parents | d63bf64a2094 |
children | 0caa0bf428b9 |
rev | line source |
---|---|
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
1 /* |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
2 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
3 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
7 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
8 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
12 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
13 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
17 */ |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
18 |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
19 #include <stdlib.h> |
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
20 #include "osdep/timer.h" |
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
21 #include "input/input.h" |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
22 #include "input/mouse.h" |
30554 | 23 #include "mp_fifo.h" |
9831 | 24 |
22131
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
25 int key_fifo_size = 7; |
33015 | 26 static int *key_fifo_data; |
27 static unsigned key_fifo_read; | |
28 static unsigned key_fifo_write; | |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
29 static int previous_down_key; |
9831 | 30 |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
31 static void mplayer_put_key_internal(int code){ |
33014 | 32 int fifo_free = key_fifo_read + key_fifo_size - key_fifo_write; |
14077
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
33 if (key_fifo_data == NULL) |
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
34 key_fifo_data = malloc(key_fifo_size * sizeof(int)); |
22131
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
35 if(!fifo_free) return; // FIFO FULL!! |
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
36 // reserve some space for key release events to avoid stuck keys |
33018
d88b8a9e989e
Change condition to avoid needless key state resets with very small
reimar
parents:
33017
diff
changeset
|
37 // Make sure we do not reset key state because of a down event |
d88b8a9e989e
Change condition to avoid needless key state resets with very small
reimar
parents:
33017
diff
changeset
|
38 if((code & MP_KEY_DOWN) && fifo_free <= (key_fifo_size >> 1)) |
22131
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
39 return; |
33017
cc8cef372901
Make "stuck keys" problem impossibly by resetting the internal
reimar
parents:
33016
diff
changeset
|
40 // in the worst case, just reset key state |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
41 if (fifo_free == 1) { |
33145
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
42 // ensure we do not only create MP_KEY_RELEASE_ALL events |
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
43 if (previous_down_key & MP_KEY_RELEASE_ALL) |
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
44 return; |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
45 // HACK: this ensures that a fifo size of 2 does |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
46 // not queue any key presses while still allowing |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
47 // the mouse wheel to work (which sends down and up |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
48 // at nearly the same time |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
49 if (code != previous_down_key) |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
50 code = 0; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
51 code |= MP_KEY_RELEASE_ALL; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
52 } |
33014 | 53 key_fifo_data[key_fifo_write % key_fifo_size]=code; |
54 key_fifo_write++; | |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
55 if (code & MP_KEY_DOWN) |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
56 previous_down_key = code & ~MP_KEY_DOWN; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
57 else |
33145
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
58 previous_down_key = code & MP_KEY_RELEASE_ALL; |
9831 | 59 } |
60 | |
61 int mplayer_get_key(int fd){ | |
62 int key; | |
14077
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
63 if (key_fifo_data == NULL) |
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
64 return MP_INPUT_NOTHING; |
9831 | 65 if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING; |
33014 | 66 key=key_fifo_data[key_fifo_read % key_fifo_size]; |
67 key_fifo_read++; | |
9831 | 68 return key; |
69 } | |
70 | |
71 | |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
72 unsigned doubleclick_time = 300; |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
73 |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
74 static void put_double(int code) { |
33304
d63bf64a2094
Support up to 20 mouse buttons, there really seem to be input devices
reimar
parents:
33145
diff
changeset
|
75 if (code >= MOUSE_BTN0 && code <= MOUSE_BTN_LAST) |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
76 mplayer_put_key_internal(code - MOUSE_BTN0 + MOUSE_BTN0_DBL); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
77 } |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
78 |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
79 void mplayer_put_key(int code) { |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
80 static unsigned last_key_time[2]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
81 static int last_key[2]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
82 unsigned now = GetTimerMS(); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
83 // ignore system-doubleclick if we generate these events ourselves |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
84 if (doubleclick_time && |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
85 (code & ~MP_KEY_DOWN) >= MOUSE_BTN0_DBL && |
33304
d63bf64a2094
Support up to 20 mouse buttons, there really seem to be input devices
reimar
parents:
33145
diff
changeset
|
86 (code & ~MP_KEY_DOWN) <= MOUSE_BTN_LAST_DBL) |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
87 return; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
88 mplayer_put_key_internal(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
89 if (code & MP_KEY_DOWN) { |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
90 code &= ~MP_KEY_DOWN; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
91 last_key[1] = last_key[0]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
92 last_key[0] = code; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
93 last_key_time[1] = last_key_time[0]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
94 last_key_time[0] = now; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
95 if (last_key[1] == code && |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
96 now - last_key_time[1] < doubleclick_time) |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
97 put_double(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
98 return; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
99 } |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
100 if (last_key[0] == code && last_key[1] == code && |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
101 now - last_key_time[1] < doubleclick_time) |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
102 put_double(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
103 } |