Mercurial > mplayer.hg
annotate udp_sync.c @ 33737:71c29e8ec68f
Move string functions from interface.c to string.c.
Additionally, change char parameter of gstrchr() to const and
rename parameter size of gstrncmp() n.
The Win32 GUI now needs gstrdup() defined before its first usage.
author | ib |
---|---|
date | Thu, 07 Jul 2011 08:32:10 +0000 |
parents | e46989c7f47e |
children | 6c1d39323b6e |
rev | line source |
---|---|
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
1 /* |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
2 * Network playback synchronization |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
3 * Copyright (C) 2009 Google Inc. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
4 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
5 * This file is part of MPlayer. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
6 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
10 * (at your option) any later version. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
11 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
16 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
20 */ |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
21 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
22 #include "config.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
23 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
24 #if !HAVE_WINSOCK2_H |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
25 #include <errno.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
26 #include <sys/types.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
27 #include <sys/socket.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
28 #include <netinet/in.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
29 #include <stdlib.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
30 #include <sys/ioctl.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
31 #include <fcntl.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
32 #include <string.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
33 #include <strings.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
34 #include <netdb.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
35 #include <signal.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
36 #else |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
37 #include <winsock2.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
38 #include <ws2tcpip.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
39 #endif /* HAVE_WINSOCK2_H */ |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
40 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
41 #include "mplayer.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
42 #include "mp_core.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
43 #include "mp_msg.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
44 #include "help_mp.h" |
31985 | 45 #include "udp_sync.h" |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
46 #include "osdep/timer.h" |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
47 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
48 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
49 // config options for UDP sync |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
50 int udp_master = 0; |
31985 | 51 int udp_slave = 0; |
52 int udp_port = 23867; | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
53 const char *udp_ip = "127.0.0.1"; // where the master sends datagrams |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
54 // (can be a broadcast address) |
31985 | 55 float udp_seek_threshold = 1.0; // how far off before we seek |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
56 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
57 // how far off is still considered equal |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
58 #define UDP_TIMING_TOLERANCE 0.02 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
59 |
32001 | 60 static void set_blocking(int fd, int blocking) |
61 { | |
62 long sock_flags; | |
63 #if HAVE_WINSOCK2_H | |
64 sock_flags = blocking; | |
65 ioctlsocket(fd, FIONBIO, &sock_flags); | |
66 #else | |
67 sock_flags = fcntl(fd, F_GETFL, 0); | |
68 sock_flags = blocking ? sock_flags & ~O_NONBLOCK : sock_flags | O_NONBLOCK; | |
69 fcntl(fd, F_SETFL, sock_flags); | |
70 #endif /* HAVE_WINSOCK2_H */ | |
71 } | |
72 | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
73 // gets a datagram from the master with or without blocking. updates |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
74 // master_position if successful. if the master has exited, returns 1. |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
75 // returns -1 on error or if no message received. |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
76 // otherwise, returns 0. |
33153 | 77 static int get_udp(int blocking, double *master_position) |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
78 { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
79 char mesg[100]; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
80 |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
81 int chars_received = -1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
82 int n; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
83 |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
84 static int sockfd = -1; |
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
85 if (sockfd == -1) { |
32002
86d37b0e4dbc
Use initializer to avoid leaving struct timeval half-uninitialized.
reimar
parents:
32001
diff
changeset
|
86 struct timeval tv = { .tv_sec = 30 }; |
31990
4111548d28f9
Use initializer instead of memset, the memset in addition never
reimar
parents:
31985
diff
changeset
|
87 struct sockaddr_in servaddr = { 0 }; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
88 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
89 sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
32007 | 90 if (sockfd == -1) |
91 return -1; | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
92 |
31985 | 93 servaddr.sin_family = AF_INET; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
94 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
31985 | 95 servaddr.sin_port = htons(udp_port); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
96 bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
97 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
98 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
99 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
100 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
101 |
32001 | 102 set_blocking(sockfd, blocking); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
103 |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
104 while (-1 != (n = recvfrom(sockfd, mesg, sizeof(mesg)-1, 0, |
32010
120953a1fc50
Use NULL for recvfrom return arguments we don't care about (source address).
reimar
parents:
32009
diff
changeset
|
105 NULL, NULL))) { |
33156
9ac31195a5e0
Use strtod instead of sscanf, it is both much faster and allows for
reimar
parents:
33155
diff
changeset
|
106 char *end; |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
107 // flush out any further messages so we don't get behind |
32001 | 108 if (chars_received == -1) |
109 set_blocking(sockfd, 0); | |
110 | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
111 chars_received = n; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
112 mesg[chars_received] = 0; |
31991 | 113 if (strcmp(mesg, "bye") == 0) |
31985 | 114 return 1; |
33156
9ac31195a5e0
Use strtod instead of sscanf, it is both much faster and allows for
reimar
parents:
33155
diff
changeset
|
115 *master_position = strtod(mesg, &end); |
9ac31195a5e0
Use strtod instead of sscanf, it is both much faster and allows for
reimar
parents:
33155
diff
changeset
|
116 if (*end) { |
9ac31195a5e0
Use strtod instead of sscanf, it is both much faster and allows for
reimar
parents:
33155
diff
changeset
|
117 mp_msg(MSGT_CPLAYER, MSGL_WARN, "Could not parse udp string!\n"); |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
118 return -1; |
33156
9ac31195a5e0
Use strtod instead of sscanf, it is both much faster and allows for
reimar
parents:
33155
diff
changeset
|
119 } |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
120 } |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
121 if (chars_received == -1) |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
122 return -1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
123 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
124 return 0; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
125 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
126 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
127 void send_udp(const char *send_to_ip, int port, char *mesg) |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
128 { |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
129 static int sockfd = -1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
130 static struct sockaddr_in socketinfo; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
131 |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
132 if (sockfd == -1) { |
32003
30a84c65efa4
Mark a constant as such and move it into the block where it is used.
reimar
parents:
32002
diff
changeset
|
133 static const int one = 1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
134 int ip_valid = 0; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
135 |
31985 | 136 sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
32007 | 137 if (sockfd == -1) |
138 exit_player(EXIT_ERROR); | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
139 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
140 // Enable broadcast |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
141 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
142 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
143 #if HAVE_WINSOCK2_H |
32006
3133252ce3fa
Actually set the destination address in the sockaddr_in struct for Windows as well...
reimar
parents:
32003
diff
changeset
|
144 socketinfo.sin_addr.s_addr = inet_addr(send_to_ip); |
3133252ce3fa
Actually set the destination address in the sockaddr_in struct for Windows as well...
reimar
parents:
32003
diff
changeset
|
145 ip_valid = socketinfo.sin_addr.s_addr != INADDR_NONE; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
146 #else |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
147 ip_valid = inet_aton(send_to_ip, &socketinfo.sin_addr); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
148 #endif |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
149 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
150 if (!ip_valid) { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
151 mp_msg(MSGT_CPLAYER, MSGL_FATAL, MSGTR_InvalidIP); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
152 exit_player(EXIT_ERROR); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
153 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
154 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
155 socketinfo.sin_family = AF_INET; |
31985 | 156 socketinfo.sin_port = htons(port); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
157 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
158 |
31985 | 159 sendto(sockfd, mesg, strlen(mesg), 0, (struct sockaddr *) &socketinfo, |
160 sizeof(socketinfo)); | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
161 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
162 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
163 // this function makes sure we stay as close as possible to the master's |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
164 // position. returns 1 if the master tells us to exit, |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
165 // -1 on error and normal timing should be used again, 0 otherwise. |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
166 int udp_slave_sync(MPContext *mpctx) |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
167 { |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
168 // remember where the master is in the file |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
169 static double udp_master_position; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
170 // whether we timed out before waiting for a master message |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
171 static int timed_out = -1; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
172 // last time we received a valid master message |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
173 static unsigned last_success; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
174 int master_exited; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
175 |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
176 if (timed_out < 0) { |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
177 // initialize |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
178 udp_master_position = mpctx->sh_video->pts - udp_seek_threshold / 2; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
179 timed_out = 0; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
180 last_success = GetTimerMS(); |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
181 } |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
182 |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
183 // grab any waiting datagrams without blocking |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
184 master_exited = get_udp(0, &udp_master_position); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
185 |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
186 while (!master_exited || (!timed_out && master_exited < 0)) { |
33153 | 187 double my_position = mpctx->sh_video->pts; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
188 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
189 // if we're way off, seek to catch up |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
190 if (FFABS(my_position - udp_master_position) > udp_seek_threshold) { |
31985 | 191 abs_seek_pos = SEEK_ABSOLUTE; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
192 rel_seek_secs = udp_master_position; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
193 break; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
194 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
195 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
196 // normally we expect that the master will have just played the |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
197 // frame we're ready to play. break out and play it, and we'll be |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
198 // right in sync. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
199 // or, the master might be up to a few seconds ahead of us, in |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
200 // which case we also want to play the current frame immediately, |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
201 // without waiting. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
202 // UDP_TIMING_TOLERANCE is a small value that lets us consider |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
203 // the master equal to us even if it's very slightly ahead. |
31991 | 204 if (udp_master_position + UDP_TIMING_TOLERANCE > my_position) |
31992 | 205 break; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
206 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
207 // the remaining case is that we're slightly ahead of the master. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
208 // usually, it just means we called get_udp() before the datagram |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
209 // arrived. call get_udp again, but this time block until we receive |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
210 // a datagram. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
211 master_exited = get_udp(1, &udp_master_position); |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
212 if (master_exited < 0) |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
213 timed_out = 1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
214 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
215 |
33486
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
216 if (master_exited >= 0) { |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
217 last_success = GetTimerMS(); |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
218 timed_out = 0; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
219 } else { |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
220 master_exited = 0; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
221 timed_out |= GetTimerMS() - last_success > 30000; |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
222 } |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
223 |
e46989c7f47e
Change -udp-slave code to temporarily fall back to normal
reimar
parents:
33485
diff
changeset
|
224 return timed_out ? -1 : master_exited; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
225 } |