summaryrefslogtreecommitdiff
path: root/mcast/client/.svn/text-base/recv_tv.c.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'mcast/client/.svn/text-base/recv_tv.c.svn-base')
-rw-r--r--mcast/client/.svn/text-base/recv_tv.c.svn-base905
1 files changed, 0 insertions, 905 deletions
diff --git a/mcast/client/.svn/text-base/recv_tv.c.svn-base b/mcast/client/.svn/text-base/recv_tv.c.svn-base
deleted file mode 100644
index f453ed4..0000000
--- a/mcast/client/.svn/text-base/recv_tv.c.svn-base
+++ /dev/null
@@ -1,905 +0,0 @@
-/*
- * (c) BayCom GmbH, http://www.baycom.de, info@baycom.de
- *
- * See the COPYING file for copyright information and
- * how to reach the author.
- *
- * modified by Reel Multimedia, http://www.reel-multimedia.com, info@reel-multimedia.com
- * 01042010 DL: use a single thread for reading from network layer (uses less resources)
- *
- */
-
-//#define DEBUG 1
-#include "headers.h"
-#if ! defined WIN32 || defined __CYGWIN__
-#define RT
-#endif
-
-#define RE 1
-
-#if defined(RE)
-int set_redirected(recv_info_t *r, int sid);
-int check_if_already_redirected(recv_info_t *r, int sid);
-#endif
-
-recv_info_t receivers;
-pthread_mutex_t lock;
-
-int mld_start=0;
-
-int port=23000;
-char iface[IFNAMSIZ];
-
-static pthread_t recv_tra_thread;
-static pthread_t recv_tca_thread;
-
-#if ! defined WIN32 || defined __CYGWIN__
-static void sig_handler (int signal)
-{
- dbg ("Signal: %d\n", signal);
-
- switch (signal) {
- case SIGUSR1:
- recv_show_all_pids (&receivers);
- break;
- }
-}
-#endif
-
-#ifdef MULTI_THREAD_RECEIVER
-static void clean_recv_ts_thread (void *arg)
-{
- pid_info_t *p = (pid_info_t *) arg;
-#ifdef DEBUG
- dbg ("Stop stream receiving for pid %d\n", p->pid.pid);
-#endif
-
- if (p->s) {
- udp_close (p->s);
- }
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-static void *recv_ts (void *arg)
-{
- unsigned char buf[32712];
- unsigned char *ptr;
- int n, res;
- int cont_old = -1;
-
- pid_info_t *p = (pid_info_t *) arg;
- recv_info_t *r = p->recv;
-
-#ifdef RT
-#if 1
- if (setpriority (PRIO_PROCESS, 0, -15) == -1)
-#else
- if (pthread_setschedprio (p->recv_ts_thread, -15))
-#endif
- {
- dbg ("Cannot raise priority to -15\n");
- }
-#endif
-
- pthread_cleanup_push (clean_recv_ts_thread, p);
-#ifdef DEBUG
- char addr_str[INET6_ADDRSTRLEN];
- inet_ntop (AF_INET6, p->mcg.s6_addr, addr_str, INET6_ADDRSTRLEN);
- dbg ("Start stream receiving for %s on port %d %s\n", addr_str, port, iface);
-#endif
- p->s = client_udp_open (&p->mcg, port, iface);
- if (!p->s) {
- warn ("client_udp_open error !\n");
- } else {
- p->run = 1;
- }
- while (p->run>0) {
- n = udp_read (p->s, buf, sizeof (buf), 1000, NULL);
- if (n >0 ) {
- ptr = buf;
- if (n % 188) {
- warn ("Received %d bytes is not multiple of 188!\n", n);
- }
- int i;
- for (i = 0; i < (n / 188); i++) {
- unsigned char *ts = buf + (i * 188);
- int adaption_field = (ts[3] >> 4) & 3;
- int cont = ts[3] & 0xf;
- int pid = ((ts[1] << 8) | ts[2]) & 0x1fff;
- int transport_error_indicator = ts[1]&0x80;
-
- if (pid != 8191 && (adaption_field & 1) && (((cont_old + 1) & 0xf) != cont) && cont_old >= 0) {
- warn ("Discontinuity on receiver %p for pid %d: %d->%d at pos %d/%d\n", r, pid, cont_old, cont, i, n / 188);
- }
- if (transport_error_indicator) {
- warn ("Transport error indicator set on receiver %p for pid %d: %d->%d at pos %d/%d\n", r, pid, cont_old, cont, i, n / 188);
- }
- cont_old = cont;
- }
- if(r->handle_ts) {
- while (n) {
- res = r->handle_ts (ptr, n, r->handle_ts_context);
- if (res != n) {
- warn ("Not same amount of data written: res:%d<=n:%d\n", res, n);
- }
- if (res < 0) {
- warn ("write of %d bytes returned %d\n", n, res);
- perror ("Write failed");
- break;
- } else {
- ptr += res;
- n -= res;
- }
- }
- }
- }
- pthread_testcancel();
- }
- pthread_cleanup_pop (1);
-
- return NULL;
- }
-
-#else
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-static void recv_ts_func (unsigned char *buf, int n, void *arg) {
- if (n >0 ) {
- pid_info_t *p = (pid_info_t *) arg;
- recv_info_t *r = p->recv;
- int i;
- for (i = 0; i < n; i += 188) {
- unsigned char *ts = buf + i;
- int adaption_field = (ts[3] >> 4) & 3;
- int cont = ts[3] & 0xf;
- int pid = ((ts[1] << 8) | ts[2]) & 0x1fff;
- int transport_error_indicator = ts[1]&0x80;
-
- if (pid != 8191 && (adaption_field & 1) && (((p->cont_old + 1) & 0xf) != cont) && p->cont_old >= 0) {
- warn ("Discontinuity on receiver %p for pid %d: %d->%d at pos %d/%d\n", r, pid, p->cont_old, cont, i / 188, n / 188);
- }
- if (transport_error_indicator) {
- warn ("Transport error indicator set on receiver %p for pid %d: %d->%d at pos %d/%d\n", r, pid, p->cont_old, cont, i / 188, n / 188);
- }
- p->cont_old = cont;
- }
- if (i != n) {
- warn ("Received %d bytes is not multiple of 188!\n", n);
- }
- if(r->handle_ts) {
- while (n) {
- int res = r->handle_ts (buf, n, r->handle_ts_context);
- if (res != n) {
- warn ("Not same amount of data written: res:%d<=n:%d\n", res, n);
- }
- if (res < 0) {
- warn ("write of %d bytes returned %d\n", n, res);
- perror ("Write failed");
- break;
- } else {
- buf += res;
- n -= res;
- }
- }
- }
- }
-}
-#endif
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int register_ts_handler (recv_info_t * r, int (*p)(unsigned char *, size_t, void *), void *c)
-{
- r->handle_ts=(int (*)(unsigned char *buffer, size_t len, void *context))p;
- r->handle_ts_context=c;
- return 0;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static pid_info_t *find_slot_by_pid (recv_info_t * r, int pid, int id)
-{
- pid_info_t *slot;
- DVBMC_LIST_FOR_EACH_ENTRY (slot, &r->slots.list, pid_info_t, list) {
- if (slot->run && slot->pid.pid == pid && (id == -1 || slot->pid.id == id)) {
- return slot;
- }
- }
-
- return NULL;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static pid_info_t *find_slot_by_mcg (recv_info_t * r, struct in6_addr *mcg)
-{
- pid_info_t *slot;
-
- DVBMC_LIST_FOR_EACH_ENTRY (slot, &r->slots.list, pid_info_t, list) {
- if (slot->run && !memcmp (&slot->mcg, mcg, sizeof (struct in6_addr))) {
- return slot;
- }
- }
- return NULL;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int find_any_slot_by_mcg (recv_info_t * receivers, struct in6_addr *mcg)
-{
- recv_info_t *r;
- int ret=0;
-
- DVBMC_LIST_FOR_EACH_ENTRY (r, &receivers->head->list, recv_info_t, list) {
- pid_info_t *slot = find_slot_by_mcg (r, mcg);
- if(slot) {
- ret++;
- }
- }
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int count_receivers(recv_info_t *receivers)
-{
- int ret=0;
- struct list *pos;
-
- DVBMC_LIST_FOR_EACH (pos, &receivers->list) {
- ret++;
- }
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static int count_pids(recv_info_t *r)
-{
- int ret=0;
- struct list *pos;
-
- DVBMC_LIST_FOR_EACH (pos, &r->slots.list) {
- ret++;
- }
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int count_all_pids (recv_info_t * receivers)
-{
- int ret=0;
- recv_info_t *r;
-
- DVBMC_LIST_FOR_EACH_ENTRY (r, &receivers->head->list, recv_info_t, list) {
- ret += count_pids(r);
- }
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-void recv_show_pids(recv_info_t *r)
-{
- pid_info_t *slot;
- char addr_str[INET6_ADDRSTRLEN];
- inet_ntop (AF_INET6, r->mcg.s6_addr, addr_str, INET6_ADDRSTRLEN);
-
- info("pids on receiver %p (%s):\n",r, addr_str);
- DVBMC_LIST_FOR_EACH_ENTRY (slot, &r->slots.list, pid_info_t, list) {
- info("%d,", slot->pid.pid);
- }
- info("\n");
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_show_all_pids (recv_info_t * receivers)
-{
- int ret=0;
- recv_info_t *r;
- DVBMC_LIST_FOR_EACH_ENTRY (r, &receivers->head->list, recv_info_t, list) {
- recv_show_pids(r);
- }
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static void deallocate_slot (recv_info_t * r, pid_info_t *p)
-{
- int nodrop=0;
-
-#ifdef MULTI_THREAD_RECEIVER
- if (pthread_exist(p->recv_ts_thread)) {
-#else
- if (p->run) {
-
-#endif //info ("Deallocating PID %d from slot %p\n", p->pid.pid, p);
- p->run = 0;
-
- //Do not leave multicast group if there is another dvb adapter using the same group
- if (find_any_slot_by_mcg (r, &p->mcg)) {
- dbg ("MCG is still in use not dropping\n");
- p->s->is_multicast = 0;
- nodrop=1;
- }
-
-#ifdef MULTI_THREAD_RECEIVER
- pthread_join (p->recv_ts_thread, NULL);
-#else
- udp_close_buff(p->s);
-#endif
- p->dropped = MAX_DROP_NUM;
- }
- //printf("NO DROP: %d\n",nodrop);
- if(!mld_start || nodrop) {
- dvbmc_list_remove(&p->list);
- free(p);
- }
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static pid_info_t *allocate_slot (recv_info_t * r, struct in6_addr *mcg, dvb_pid_t *pid)
-{
- pid_info_t *p = (pid_info_t *)malloc(sizeof(pid_info_t));
- if(!p) {
- err ("Cannot get memory for pid\n");
- }
-
- dbg ("Allocating new PID %d to Slot %p\n", pid->pid, p);
-
- memset(p, 0, sizeof(pid_info_t));
-
- p->cont_old = -1;
- p->mcg = *mcg;
- mcg_set_pid (&p->mcg, pid->pid);
-#if defined(RE)
- if (!check_if_already_redirected(r, pid->id)) {
- //printf("PID %d not red. ===> SETTING ID to %d\n",pid->pid,pid->id);
- mcg_set_id (&p->mcg, pid->id);
- mcg_set_priority(&p->mcg, pid->priority);
- } else {
- set_redirected(r, pid->id);
- //printf("send pid %d to noid mcg !\n",pid->pid);
- mcg_set_id(&p->mcg, 0);
- mcg_set_priority(&p->mcg, 0);
- }
- //mcg_set_id(&p->mcg,pid->id);
-#else
- mcg_set_id (&p->mcg, pid->id);
- mcg_set_priority(&p->mcg, pid->priority);
-#endif
-
-
-#ifdef DEBUG
- print_mcg (&p->mcg);
-#endif
- p->pid = *pid;
- p->recv = r;
-#ifdef MULTI_THREAD_RECEIVER
- int ret = pthread_create (&p->recv_ts_thread, NULL, recv_ts, p);
- while (!ret && !p->run) {
- usleep (10000);
- }
- if (ret) {
- err ("pthread_create failed with %d\n", ret);
-#else
- p->cont_old=-1;
- p->s = client_udp_open_cb (&p->mcg, port, iface, recv_ts_func, p);
- if (!p->s) {
- warn ("client_udp_open error !\n");
- return 0;
-#endif
- } else {
- p->run = 1;
- dvbmc_list_add_head (&r->slots.list, &p->list);
- }
-
- return p;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static void stop_ten_receive (recv_info_t * r)
-{
- dbg ("->>>>>>>>>>>>>>>>>stop_ten_receive on receiver %p\n",r);
- if (pthread_exist(r->recv_ten_thread) && r->ten_run) {
- dbg ("cancel TEN receiver %p %p\n", r, r->recv_ten_thread);
-
- r->ten_run=0;
- pthread_mutex_unlock (&lock);
- do {
- dbg ("wait TEN stop receiver %p %p\n", r, r->recv_ten_thread);
- usleep(10000);
- } while (!r->ten_run);
- pthread_mutex_lock (&lock);
- r->ten_run=0;
- dbg ("cancel TEN done receiver %p\n", r);
- pthread_detach (r->recv_ten_thread);
- pthread_null(r->recv_ten_thread);
- }
-}
-
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static void start_ten_receive (recv_info_t * r)
-{
- if (r->pidsnum && !pthread_exist(r->recv_ten_thread)) {
-#ifdef DEBUG
- char host[INET6_ADDRSTRLEN];
- inet_ntop (AF_INET6, &r->mcg, (char *) host, INET6_ADDRSTRLEN);
-
- dbg ("Start TEN for receiver %p %s\n", r, host);
-#endif
- r->ten_run = 0;
-
- int ret = pthread_create (&r->recv_ten_thread, NULL, recv_ten, r);
- while (!ret && !r->ten_run) {
- dbg ("wait TEN startup receiver %p %p\n", r, r->recv_ten_thread);
- usleep (10000);
- }
- if (ret) {
- err ("pthread_create failed with %d\n", ret);
- }
- }
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static int cmppids(const void *p1, const void *p2)
-{
- dvb_pid_t *pid1=(dvb_pid_t *)p1;
- dvb_pid_t *pid2=(dvb_pid_t *)p2;
-
- if(pid1->pid == pid2->pid) {
- return pid1->id < pid2->id;
- }
- return pid1->pid < pid2->pid;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static void update_mcg (recv_info_t * r, int handle_ten)
-{
- int i;
- pid_info_t *p;
- pid_info_t *ptmp;
-
- if(handle_ten) {
- if(r->pidsnum) {
- start_ten_receive(r);
- } else {
- stop_ten_receive(r);
- }
- }
- dbg("update_mcg(%p, %d)\n", r, handle_ten);
- qsort(r->pids, r->pidsnum, sizeof(dvb_pid_t), cmppids);
-
- DVBMC_LIST_FOR_EACH_ENTRY_SAFE (p, ptmp, &r->slots.list, pid_info_t, list) {
- //dbg ("DVBMC_LIST_FOR_EACH_ENTRY_SAFE: %p\n", p);
- if(p->run) {
- int found_pid = 0;
- for (i = 0; i < r->pidsnum; i++) {
- // pid already there without id but now also with id required
- if (r->pids[i].pid == p->pid.pid && r->pids[i].id && !p->pid.id) {
- found_pid = 0;
- break;
- }
- if (r->pids[i].pid == p->pid.pid && r->pids[i].id == p->pid.id) {
- found_pid = 1;
- }
- }
- if (!found_pid) {
- deallocate_slot (r, p);
- }
- }
- }
-
- for (i = 0; i < r->pidsnum; i++) {
- unsigned int pid = r->pids[i].pid;
- if (!find_slot_by_pid (r, pid, -1)) { //pid with any id there?
- allocate_slot (r, &r->mcg, r->pids+i);
- }
- }
-
-
-}
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-static void stop_receive (recv_info_t * r, int mode)
-{
- dbg ("stop_receive on receiver %p mode %d\n",r, mode);
- int pidsnum=r->pidsnum;
- //Remove all PIDs
- r->pidsnum = 0;
- update_mcg (r, mode);
- r->pidsnum=pidsnum;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-#ifdef RE
-#if 0
-static int find_redirected_sid (recv_info_t * r, int id)
-{
- pid_info_t *slot;
- DVBMC_LIST_FOR_EACH_ENTRY (slot, &r->slots.list, pid_info_t, list) {
- if (slot->pid.id == id && slot->pid.re) {
- return 1;
- }
- }
-
- return 0;
-}
-#endif
-
-int check_if_already_redirected(recv_info_t *r, int sid)
-{
- int i;
- for (i = 0; i < r->pidsnum; i++) {
- //printf("PID %d SID %d RE %d\n",r->pids[i].pid, r->pids[i].id, r->pids[i].re);
- if (r->pids[i].re && r->pids[i].id == sid) {
- return 1;
- }
- }
-
- return 0;
-}
-
-int check_if_sid_in(recv_info_t *r, int sid)
-{
- int i;
- for (i = 0; i < r->pidsnum; i++) {
- //printf("PID %d SID %d RE %d\n",r->pids[i].pid, r->pids[i].id, r->pids[i].re);
- if (r->pids[i].id == sid) {
-// printf("%s: SID in %d!\n",__func__,sid);
- return 1;
- }
- }
-
- return 0;
-}
-
-int set_redirected(recv_info_t *r, int sid)
-{
- int i;
- for (i = 0; i < r->pidsnum; i++) {
- if (r->pids[i].id == sid)
- r->pids[i].re=1;
- }
-
- return 0;
-}
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-int stop_sid_mcgs(recv_info_t *r, int sid)
-{
- pid_info_t *p;
- pid_info_t *ptmp;
-
- DVBMC_LIST_FOR_EACH_ENTRY_SAFE (p, ptmp, &r->slots.list, pid_info_t, list) {
- if(p->run) {
- if (p->pid.pid && p->pid.id == sid) {
- //info ("Deallocating PID %d ID %d RE %d from slot %p\n", p->pid.pid,p->pid.id,p->pid.re, p);
- deallocate_slot (r, p);
- }
- }
- }
-
- return 0;
-}
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-int rejoin_mcgs(recv_info_t *r, int sid)
-{
-
- int i;
- for (i = 0; i < r->pidsnum; i++) {
- unsigned int pid = r->pids[i].pid;
- unsigned int id = r->pids[i].id;
- if (!find_slot_by_pid (r, pid, id) && id == sid) {
- char addr_str[INET6_ADDRSTRLEN];
- inet_ntop (AF_INET6, &r->mcg, addr_str, INET6_ADDRSTRLEN);
- //info ("Rejoin mcg %s with no ID (PID %d ID %d RE %d)...\n", addr_str, pid, id, r->pids[i].re);
- allocate_slot (r, &r->mcg, r->pids+i);
- }
- }
-
- return 0;
-}
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-#endif
-int recv_redirect (recv_info_t * r, struct in6_addr mcg)
-{
- int ret = 0;
-
- pthread_mutex_lock (&lock);
- dbg ("\n+++++++++++++\nIn redirect for receiver %p\n", r);
-#if 0
- char addr_str[INET6_ADDRSTRLEN];
- inet_ntop (AF_INET6, &r->mcg, addr_str, INET6_ADDRSTRLEN);
- info ("Redirect to ===> %s\n",addr_str);
-#endif
- int sid;
- mcg_get_id(&mcg,&sid);
- mcg_set_id(&mcg,0);
-
- //printf("SID in: %d\n",sid);
-
- if (!sid || ( !check_if_already_redirected(r, sid) && check_if_sid_in(r, sid)) ) {
- if (sid == 0) {
- stop_receive (r, 0);
- r->mcg = mcg;
- update_mcg (r, 0);
- ret = 1;
- } else {
- //stop sid mcgs
- stop_sid_mcgs(r, sid);
- set_redirected(r, sid);
- //start new mcgs with no sid
- rejoin_mcgs(r, sid);
- }
- }
-
- dbg ("Redirect done for receiver %p\n", r);
- pthread_mutex_unlock (&lock);
-
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_stop (recv_info_t * r)
-{
- pthread_mutex_lock (&lock);
- stop_receive (r, 1);
- pthread_mutex_unlock (&lock);
- return 0;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_count_pids(recv_info_t * r)
-{
- int i;
- for (i=0; r->pids[i].pid!=-1; i++);
- return i;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-static int recv_copy_pids(dvb_pid_t *dst, dvb_pid_t *src)
-{
- int i;
- for (i=0; (src[i].pid!=-1) && (i<(RECV_MAX_PIDS-1)); i++) {
- dst[i]=src[i];
- }
- if(i==(RECV_MAX_PIDS-1)) {
- warn("Cannot receive more than %d pids\n", RECV_MAX_PIDS-1);
- }
- return i;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_pids (recv_info_t *r, dvb_pid_t *pids)
-{
- pthread_mutex_lock (&lock);
- if(pids) {
- r->pidsnum=recv_copy_pids(r->pids, pids);
- }
- update_mcg(r, 1);
- pthread_mutex_unlock (&lock);
- return 0;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_pids_get (recv_info_t *r, dvb_pid_t *pids)
-{
- pthread_mutex_lock (&lock);
- if(pids) {
- memcpy(pids, r->pids, sizeof(dvb_pid_t)*r->pidsnum);
- pids[r->pidsnum].pid=-1;
- }
- pthread_mutex_unlock (&lock);
- return r->pidsnum;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_pid_add (recv_info_t * r, dvb_pid_t *pid)
-{
- int ret=0;
-
- pthread_mutex_lock (&lock);
- pid_info_t *p=find_slot_by_pid (r, pid->pid, pid->id);
- if(!p && (r->pidsnum < (RECV_MAX_PIDS-2))) {
-#if defined(RE)
- r->pids[r->pidsnum].re = 0;
-#endif
- r->pids[r->pidsnum]=*pid;
- r->pids[++r->pidsnum].pid=-1;
- update_mcg(r, 1);
- ret = 1;
- }
- pthread_mutex_unlock (&lock);
-
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_pid_del (recv_info_t * r, int pid)
-{
- int i;
- int ret=0;
-
- pthread_mutex_lock (&lock);
- if(pid>=0) {
- for (i = 0; i < r->pidsnum; i++) {
- if(r->pids[i].pid==pid || ret) {
- r->pids[i]=r->pids[i+1];
- ret=1;
- }
- }
- if(ret) {
- r->pidsnum--;
- update_mcg(r, 1);
- }
- } else {
- r->pids[0].pid=-1;
- r->pidsnum=0;
- update_mcg(r, 1);
- }
- pthread_mutex_unlock (&lock);
-
- return ret;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_tune (recv_info_t * r, fe_type_t type, int satpos, recv_sec_t *sec, struct dvb_frontend_parameters *fe_parms, dvb_pid_t *pids)
-{
- pthread_mutex_lock (&lock);
- dbg ("kick_tune receiver %p\n", r);
-
- stop_receive (r, 1);
- if(fe_parms) {
- r->fe_parms=*fe_parms;
- }
- if(sec) {
- r->sec=*sec;
- }
- if(pids) {
- r->pidsnum=recv_copy_pids(r->pids, pids);
- }
-
- fe_parms_to_mcg (&r->mcg, STREAMING_PID, type, &r->sec, &r->fe_parms, 0);
- mcg_set_satpos (&r->mcg, satpos);
-
- update_mcg (r, 1);
-
- pthread_mutex_unlock (&lock);
- dbg ("kick_tune done receiver %p\n", r);
- return 0;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-recv_info_t *recv_add (void)
-{
- recv_info_t *r=(recv_info_t *)malloc(sizeof(recv_info_t));
- if(!r) {
- err ("Cannot get memory for receiver\n");
- }
- memset (r, 0, sizeof (recv_info_t));
- r->head=&receivers;
- dvbmc_list_init (&r->slots.list);
- pthread_mutex_lock (&lock);
- dvbmc_list_add_head(&receivers.list, &r->list);
- pthread_mutex_unlock (&lock);
- return r;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-void recv_del (recv_info_t *r)
-{
- pthread_mutex_lock (&lock);
- stop_receive (r, 1);
- dvbmc_list_remove(&r->list);
- pthread_mutex_unlock (&lock);
- free(r);
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_init(char *intf, int p)
-{
- LIBXML_TEST_VERSION;
-#ifdef WIN32
- WSADATA wsaData;
- if (WSAStartup (MAKEWORD (2, 2), &wsaData) != 0) {
- err ("WSAStartup failed\n");
- }
-#endif
-
- if(intf) {
- strcpy(iface, intf);
- } else {
- iface[0]=0;
- }
- if(p) {
- port=p;
- }
-
- g_conf = (struct conf*) malloc (sizeof (struct conf));
- if (!g_conf) {
- err ("Cannot get memory for configuration\n");
- exit (-1);
- }
-
- memset (g_conf, 0, sizeof (struct conf));
- update_interfaces (NULL);
-
- if (!strlen (iface)) {
- struct intnode *intn = int_find_first ();
- if (intn) {
- strcpy (iface, intn->name);
- } else {
- warn ("Cannot find any usable network interface\n");
- if(g_conf->ints) {
- free (g_conf->ints);
- }
- #ifdef PTW32_STATIC_LIB
- pthread_win32_process_detach_np();
- #endif
- free(g_conf);
- return -1;
- }
- }
-
- dvbmc_list_init (&receivers.list);
- pthread_mutex_init (&lock, NULL);
- receivers.head=&receivers;
-#if ! defined WIN32 || defined __CYGWIN__
- signal (SIGUSR1, &sig_handler);
-#endif
-#ifdef PTW32_STATIC_LIB
- pthread_win32_process_attach_np();
-#endif
- pthread_create (&recv_tra_thread, NULL, recv_tra, NULL);
- pthread_create (&recv_tca_thread, NULL, recv_tca, NULL);
-
- return 0;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-int recv_exit(void)
-{
- recv_info_t *r;
- recv_info_t *rtmp;
- if(pthread_exist(recv_tra_thread) && !pthread_cancel (recv_tra_thread)) {
- pthread_join (recv_tra_thread, NULL);
- }
- if(pthread_exist(recv_tca_thread) && !pthread_cancel (recv_tca_thread)) {
- pthread_join (recv_tca_thread, NULL);
- }
- DVBMC_LIST_FOR_EACH_ENTRY_SAFE (r, rtmp, &receivers.head->list, recv_info_t, list) {
- recv_del(r);
- }
-#if ! defined WIN32 || defined __CYGWIN__
- signal (SIGUSR1, NULL);
-#endif
- g_conf->maxinterfaces=0;
- if(g_conf->ints) {
- free (g_conf->ints);
- }
-#ifdef PTW32_STATIC_LIB
- pthread_win32_process_detach_np();
-#endif
- free(g_conf);
- xmlCleanupParser ();
- xmlMemoryDump ();
- return 0;
-}