//static char self_ip_string[INET6_ADDRSTRLEN]; // the ip string being used by this program -- it
// could be one of many, so we need to know it
//static uint32_t self_scope_id; // if it's an ipv6 connection, this will be its scope
-static short connection_ip_family; // AF_INET / AF_INET6
-static uint32_t client_active_remote; // used when you want to control the client...
-
-static SOCKADDR rtp_client_control_socket; // a socket pointing to the control port of the client
-static SOCKADDR rtp_client_timing_socket; // a socket pointing to the timing port of the client
-static int audio_socket; // our local [server] audio socket
-static int control_socket; // our local [server] control socket
-static int timing_socket; // local timing socket
+//static short connection_ip_family; // AF_INET / AF_INET6
+//static uint32_t client_active_remote; // used when you want to control the client...
+
+//static SOCKADDR rtp_client_control_socket; // a socket pointing to the control port of the client
+//static SOCKADDR rtp_client_timing_socket; // a socket pointing to the timing port of the client
+//static int audio_socket; // our local [server] audio socket
+//static int control_socket; // our local [server] control socket
+//static int timing_socket; // local timing socket
// static pthread_t rtp_audio_thread, rtp_control_thread, rtp_timing_thread;
-static int64_t reference_timestamp;
-static uint64_t reference_timestamp_time;
-static uint64_t remote_reference_timestamp_time;
+//static int64_t reference_timestamp;
+//static uint64_t reference_timestamp_time;
+//static uint64_t remote_reference_timestamp_time;
// debug variables
static int request_sent;
ssize_t nread;
while (conn->please_stop == 0) {
- nread = recv(audio_socket, packet, sizeof(packet), 0);
+ nread = recv(conn->audio_socket, packet, sizeof(packet), 0);
uint64_t local_time_now_fp = get_absolute_time_in_fp();
if (time_of_previous_packet_fp) {
}
debug(1, "Audio receiver -- Server RTP thread interrupted. terminating.");
- close(audio_socket);
+ close(conn->audio_socket);
return NULL;
}
rtsp_conn_info *conn = (rtsp_conn_info*)arg;
- reference_timestamp = 0; // nothing valid received yet
+ conn->reference_timestamp = 0; // nothing valid received yet
uint8_t packet[2048], *pktp;
struct timespec tn;
uint64_t remote_time_of_sync, local_time_now, remote_time_now;
int64_t sync_rtp_timestamp, rtp_timestamp_less_latency;
ssize_t nread;
while (conn->please_stop == 0) {
- nread = recv(control_socket, packet, sizeof(packet), 0);
+ nread = recv(conn->control_socket, packet, sizeof(packet), 0);
local_time_now = get_absolute_time_in_fp();
// clock_gettime(CLOCK_MONOTONIC,&tn);
// local_time_now=((uint64_t)tn.tv_sec<<32)+((uint64_t)tn.tv_nsec<<32)/1000000000;
// after the one whose RTP is given. Weird.
}
pthread_mutex_lock(&reference_time_mutex);
- remote_reference_timestamp_time = remote_time_of_sync;
- reference_timestamp_time = remote_time_of_sync - local_to_remote_time_difference;
- reference_timestamp = sync_rtp_timestamp;
+ conn->remote_reference_timestamp_time = remote_time_of_sync;
+ conn->reference_timestamp_time = remote_time_of_sync - local_to_remote_time_difference;
+ conn->reference_timestamp = sync_rtp_timestamp;
pthread_mutex_unlock(&reference_time_mutex);
// debug(1,"New Reference timestamp and timestamp time...");
// get estimated remote time now
}
debug(1, "Control RTP thread interrupted. terminating.");
- close(control_socket);
+ close(conn->control_socket);
return NULL;
}
departure_time = get_absolute_time_in_fp();
socklen_t msgsize = sizeof(struct sockaddr_in);
#ifdef AF_INET6
- if (rtp_client_timing_socket.SAFAMILY == AF_INET6) {
+ if (conn->rtp_client_timing_socket.SAFAMILY == AF_INET6) {
msgsize = sizeof(struct sockaddr_in6);
}
#endif
- if (sendto(timing_socket, &req, sizeof(req), 0, (struct sockaddr *)&rtp_client_timing_socket,
+ if (sendto(conn->timing_socket, &req, sizeof(req), 0, (struct sockaddr *)&conn->rtp_client_timing_socket,
msgsize) == -1) {
perror("Error sendto-ing to timing socket");
}
uint64_t first_local_to_remote_time_difference_time;
uint64_t l2rtd = 0;
while (conn->please_stop == 0) {
- nread = recv(timing_socket, packet, sizeof(packet), 0);
+ nread = recv(conn->timing_socket, packet, sizeof(packet), 0);
arrival_time = get_absolute_time_in_fp();
// clock_gettime(CLOCK_MONOTONIC,&att);
pthread_join(timer_requester, &retval);
debug(1, "Closed and terminated timer requester thread.");
debug(1, "Timing RTP thread terminated.");
- close(timing_socket);
+ close(conn->timing_socket);
return NULL;
}
debug(2, "rtp_setup: cport=%d tport=%d.", cport, tport);
- client_active_remote = active_remote;
+ conn->client_active_remote = active_remote;
// print out what we know about the client
void *client_addr, *self_addr;
char client_port_str[64];
char self_addr_str[64];
- connection_ip_family = remote->SAFAMILY; // keep information about the kind of ip of the client
+ conn->connection_ip_family = remote->SAFAMILY; // keep information about the kind of ip of the client
#ifdef AF_INET6
- if (connection_ip_family == AF_INET6) {
+ if (conn->connection_ip_family == AF_INET6) {
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)remote;
client_addr = &(sa6->sin6_addr);
client_port = ntohs(sa6->sin6_port);
conn->self_scope_id = sa6->sin6_scope_id;
}
#endif
- if (connection_ip_family == AF_INET) {
+ if (conn->connection_ip_family == AF_INET) {
struct sockaddr_in *sa4 = (struct sockaddr_in *)remote;
client_addr = &(sa4->sin_addr);
client_port = ntohs(sa4->sin_port);
self_port = ntohs(sa4->sin_port);
}
- inet_ntop(connection_ip_family, client_addr, conn->client_ip_string, sizeof(conn->client_ip_string));
- inet_ntop(connection_ip_family, self_addr, conn->self_ip_string, sizeof(conn->self_ip_string));
+ inet_ntop(conn->connection_ip_family, client_addr, conn->client_ip_string, sizeof(conn->client_ip_string));
+ inet_ntop(conn->connection_ip_family, self_addr, conn->self_ip_string, sizeof(conn->self_ip_string));
debug(1, "Set up play connection from %s to self at %s.", conn->client_ip_string, conn->self_ip_string);
struct addrinfo hints;
struct addrinfo *servinfo;
- memset(&rtp_client_control_socket, 0, sizeof(rtp_client_control_socket));
+ memset(&conn->rtp_client_control_socket, 0, sizeof(conn->rtp_client_control_socket));
memset(&hints, 0, sizeof hints);
- hints.ai_family = connection_ip_family;
+ hints.ai_family = conn->connection_ip_family;
hints.ai_socktype = SOCK_DGRAM;
char portstr[20];
snprintf(portstr, 20, "%d", cport);
#ifdef AF_INET6
if (servinfo->ai_family == AF_INET6) {
- memcpy(&rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6));
+ memcpy(&conn->rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6));
// ensure the scope id matches that of remote. this is needed for link-local addresses.
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&rtp_client_control_socket;
+ struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&conn->rtp_client_control_socket;
sa6->sin6_scope_id = conn->self_scope_id;
} else
#endif
- memcpy(&rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in));
+ memcpy(&conn->rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in));
freeaddrinfo(servinfo);
// set up a the record of the remote's timing socket
- memset(&rtp_client_timing_socket, 0, sizeof(rtp_client_timing_socket));
+ memset(&conn->rtp_client_timing_socket, 0, sizeof(conn->rtp_client_timing_socket));
memset(&hints, 0, sizeof hints);
- hints.ai_family = connection_ip_family;
+ hints.ai_family = conn->connection_ip_family;
hints.ai_socktype = SOCK_DGRAM;
snprintf(portstr, 20, "%d", tport);
if (getaddrinfo(conn->client_ip_string, portstr, &hints, &servinfo) != 0)
die("Can't get address of client's timing port");
#ifdef AF_INET6
if (servinfo->ai_family == AF_INET6) {
- memcpy(&rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6));
+ memcpy(&conn->rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6));
// ensure the scope id matches that of remote. this is needed for link-local addresses.
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&rtp_client_timing_socket;
+ struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&conn->rtp_client_timing_socket;
sa6->sin6_scope_id = conn->self_scope_id;
} else
#endif
- memcpy(&rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in));
+ memcpy(&conn->rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in));
freeaddrinfo(servinfo);
// now, we open three sockets -- one for the audio stream, one for the timing and one for the
// control
- *lsport = bind_port(connection_ip_family, conn->self_ip_string, conn->self_scope_id, &audio_socket);
- *lcport = bind_port(connection_ip_family, conn->self_ip_string, conn->self_scope_id, &control_socket);
- *ltport = bind_port(connection_ip_family, conn->self_ip_string, conn->self_scope_id, &timing_socket);
+ *lsport = bind_port(conn->connection_ip_family, conn->self_ip_string, conn->self_scope_id, &conn->audio_socket);
+ *lcport = bind_port(conn->connection_ip_family, conn->self_ip_string, conn->self_scope_id, &conn->control_socket);
+ *ltport = bind_port(conn->connection_ip_family, conn->self_ip_string, conn->self_scope_id, &conn->timing_socket);
debug(2, "listening for audio, control and timing on ports %d, %d, %d.", *lsport, *lcport,
*ltport);
- reference_timestamp = 0;
+ conn->reference_timestamp = 0;
// pthread_create(&rtp_audio_thread, NULL, &rtp_audio_receiver, NULL);
// pthread_create(&rtp_control_thread, NULL, &rtp_control_receiver, NULL);
// pthread_create(&rtp_timing_thread, NULL, &rtp_timing_receiver, NULL);
uint64_t *remote_timestamp_time, rtsp_conn_info *conn) {
// types okay
pthread_mutex_lock(&reference_time_mutex);
- *timestamp = reference_timestamp;
- *timestamp_time = reference_timestamp_time;
- *remote_timestamp_time = remote_reference_timestamp_time;
+ *timestamp = conn->reference_timestamp;
+ *timestamp_time = conn->reference_timestamp_time;
+ *remote_timestamp_time = conn->remote_reference_timestamp_time;
pthread_mutex_unlock(&reference_time_mutex);
}
void clear_reference_timestamp(rtsp_conn_info *conn) {
pthread_mutex_lock(&reference_time_mutex);
- reference_timestamp = 0;
- reference_timestamp_time = 0;
+ conn->reference_timestamp = 0;
+ conn->reference_timestamp_time = 0;
pthread_mutex_unlock(&reference_time_mutex);
}
*(unsigned short *)(req + 6) = htons(count); // count
socklen_t msgsize = sizeof(struct sockaddr_in);
#ifdef AF_INET6
- if (rtp_client_control_socket.SAFAMILY == AF_INET6) {
+ if (conn->rtp_client_control_socket.SAFAMILY == AF_INET6) {
msgsize = sizeof(struct sockaddr_in6);
}
#endif
- if (sendto(audio_socket, req, sizeof(req), 0, (struct sockaddr *)&rtp_client_control_socket,
+ if (sendto(conn->audio_socket, req, sizeof(req), 0, (struct sockaddr *)&conn->rtp_client_control_socket,
msgsize) == -1) {
perror("Error sendto-ing to audio socket");
}
void rtp_request_client_pause(rtsp_conn_info *conn) {
if (conn->rtp_running) {
- if (client_active_remote == 0) {
+ if (conn->client_active_remote == 0) {
debug(1, "Can't request a client pause: no valid active remote.");
} else {
// debug(1,"Send a client pause request to %s:3689 with active remote
sprintf(message,
"GET /ctrl-int/1/pause HTTP/1.1\r\nHost: %s:3689\r\nActive-Remote: %u\r\n\r\n",
- conn->client_ip_string, client_active_remote);
+ conn->client_ip_string, conn->client_active_remote);
// debug(1,"Sending this message: \"%s\".",message);
// Send some data