1
0
mirror of https://github.com/DigitalDevices/octonet.git synced 2023-10-10 13:36:52 +02:00

stop multicast stream if all non stream owning sessions stopped

This commit is contained in:
Ralph Metzler 2016-04-06 06:32:17 +02:00
parent 3959f336f1
commit b6d23ec557
2 changed files with 59 additions and 12 deletions

View File

@ -26,6 +26,7 @@ uint32_t flags;
uint32_t conform = 0; uint32_t conform = 0;
#define FLAGS_TRANSPORT 1 #define FLAGS_TRANSPORT 1
static uint32_t session_is_playing(struct ossess *sess);
uint64_t mtime_nano(void) uint64_t mtime_nano(void)
{ {
@ -358,6 +359,11 @@ static void *_release_session(struct ossess *oss)
} }
oss->playing = 0; oss->playing = 0;
oss->state = 0; oss->state = 0;
if (oss->trans.mcast && conform) {
dbgprintf(DEBUG_SYS, "check mc owner\n");
if (!session_is_playing(oss))
ioctl(oss->stream->session->nsfd, NS_STOP);
}
} }
static void *release_stream(struct osstrm *str) static void *release_stream(struct osstrm *str)
@ -450,6 +456,29 @@ static void *release_no_sessions(struct ossess *oss)
pthread_mutex_unlock(&os->lock); pthread_mutex_unlock(&os->lock);
} }
static uint32_t session_is_playing(struct ossess *sess)
{
struct osstrm *str = sess->stream;
struct octoserve *os = sess->os;
int i;
uint32_t playing = 0;
if (!(sess->trans.mcast && conform))
return sess->playing;
pthread_mutex_lock(&os->lock);
for (i = 0; i < MAX_SESSION; i++)
if (os->session[i].state &&
(os->session[i].stream == str)) {
playing |= os->session[i].playing;
dbgprintf(DEBUG_DEBUG, "playing[%u] = %u\n",
i, os->session[i].playing);
}
pthread_mutex_unlock(&os->lock);
dbgprintf(DEBUG_DEBUG, "playing = %u\n", playing);
return playing;
}
static struct ossess *get_session(struct octoserve *os, uint32_t id) static struct ossess *get_session(struct octoserve *os, uint32_t id)
{ {
int i; int i;
@ -1436,7 +1465,10 @@ static int setup_session(struct oscon *con, int newtrans)
return -500; return -500;
pidchange = merge_pids(sp, p); pidchange = merge_pids(sp, p);
dbgprintf(DEBUG_DEBUG, "stream setup newtrans=%u pidchange=%u\n",
newtrans, pidchange);
if (owner) { /* stream owner */ if (owner) { /* stream owner */
dbgprintf(DEBUG_DEBUG, "stream owner setup\n");
merge_params(sp, p); merge_params(sp, p);
if (str->fe && (sp->set & (1UL << PARAM_FE)) && if (str->fe && (sp->set & (1UL << PARAM_FE)) &&
@ -1465,6 +1497,7 @@ static int setup_session(struct oscon *con, int newtrans)
dvb_tune(str->fe, sp); dvb_tune(str->fe, sp);
} }
} else { } else {
dbgprintf(DEBUG_DEBUG, "non stream owner setup\n");
if (pidchange && conform) { if (pidchange && conform) {
/* non-owner tried to change pids, /* non-owner tried to change pids,
copy back owner pids and return error */ copy back owner pids and return error */
@ -1473,15 +1506,21 @@ static int setup_session(struct oscon *con, int newtrans)
} }
} }
if (sess->nsfd < 0) { if (sess->nsfd < 0) {
dbgprintf(DEBUG_DEBUG, "no fd, conform=%u owner=%u mc=%u\n",
conform, owner, sess->trans.mcast);
if (conform && !owner && sess->trans.mcast) { if (conform && !owner && sess->trans.mcast) {
dbgprintf(DEBUG_DEBUG, "conform non-owner MCAST owner MC=%u\n",
ownsess->trans.mcast);
if (!ownsess->trans.mcast) if (!ownsess->trans.mcast)
return -455; return -455;
} else } else {
dbgprintf(DEBUG_DEBUG, "owner or unicast get fd\n");
#ifndef IGNORE_NS #ifndef IGNORE_NS
if (get_ns(sess) < 0) if (get_ns(sess) < 0)
return -455; return -455;
#endif #endif
newtrans |= 256; newtrans |= 256;
}
} }
if (newtrans) { if (newtrans) {
if (sess->trans.mcast && conform) { if (sess->trans.mcast && conform) {
@ -1533,10 +1572,10 @@ static int setup_session(struct oscon *con, int newtrans)
static int stop_session(struct ossess *sess) static int stop_session(struct ossess *sess)
{ {
if (!sess->playing) if (!session_is_playing(sess))
return 0; return 0;
sess->playing &= ~1; sess->playing &= ~1;
if (sess->playing) if (session_is_playing(sess))
return 0; return 0;
printf("stopping session %d\n", sess->nr); printf("stopping session %d\n", sess->nr);
if (sess->nsfd >= 0) if (sess->nsfd >= 0)
@ -1546,7 +1585,7 @@ static int stop_session(struct ossess *sess)
static int start_session(struct ossess *sess) static int start_session(struct ossess *sess)
{ {
if (sess->playing) { if (session_is_playing(sess)) {
sess->playing |= 1; sess->playing |= 1;
return 0; return 0;
} }
@ -1576,16 +1615,22 @@ static int play_session(struct oscon *con)
if (res < 0) if (res < 0)
return res; return res;
} }
dbgprintf(DEBUG_SYS, "%s fd %d\n", __FUNCTION__, sess->nsfd);
if (sess->trans.mcast && conform) pthread_mutex_lock(&os->lock);
sess = str->session; /* for strict multicast there is only the stream owners stream */
if (sess->trans.mcast && conform) {
#ifndef IGNORE_NS
if (str->session->nsfd < 0)
return -455;
#endif
start_session(str->session);
} else {
#ifndef IGNORE_NS #ifndef IGNORE_NS
if (sess->nsfd < 0) if (sess->nsfd < 0)
return -455; return -455;
#endif #endif
dbgprintf(DEBUG_SYS, "%s fd %d\n", __FUNCTION__, sess->nsfd); start_session(sess);
pthread_mutex_lock(&os->lock); }
start_session(sess);
sess->playing |= 2; sess->playing |= 2;
pthread_mutex_unlock(&os->lock); pthread_mutex_unlock(&os->lock);
return 0; return 0;
@ -1710,7 +1755,7 @@ void mc_join(struct octoserve *os, uint8_t *ip, uint8_t *mac, uint8_t *group)
if (os->has_switch) if (os->has_switch)
update_switch_vec(sess); update_switch_vec(sess);
} }
if (!sess->playing) if (!session_is_playing(sess))
start_session(sess); start_session(sess);
out: out:
pthread_mutex_unlock(&os->lock); pthread_mutex_unlock(&os->lock);
@ -1992,6 +2037,7 @@ static int proc_setup(struct oscon *con)
send_error(con, 400); send_error(con, 400);
return -1; return -1;
} }
#if 0 #if 0
if (con->session && con->session != str->session) { if (con->session && con->session != str->session) {
/* if we already have a session ID we /* if we already have a session ID we

View File

@ -72,6 +72,7 @@
#define DEBUG_DVB 16 #define DEBUG_DVB 16
#define DEBUG_IGMP 32 #define DEBUG_IGMP 32
#define DEBUG_SWITCH 64 #define DEBUG_SWITCH 64
#define DEBUG_DEBUG 256
#if 0 #if 0
#define dbgprintf(_mask_, ...) \ #define dbgprintf(_mask_, ...) \