Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
SAT>IP Server: Finish service descrambling
  • Loading branch information
perexg committed Mar 13, 2015
1 parent 385c416 commit 0138a37
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 29 deletions.
14 changes: 13 additions & 1 deletion src/descrambler/descrambler.c
Expand Up @@ -21,6 +21,7 @@
#include "caclient.h"
#include "ffdecsa/FFdecsa.h"
#include "input.h"
#include "input/mpegts/tsdemux.h"

struct caid_tab {
const char *name;
Expand Down Expand Up @@ -375,8 +376,19 @@ descrambler_descramble ( service_t *t,

lock_assert(&t->s_stream_mutex);

if (dr == NULL)
if (dr == NULL) {
if ((tsb[3] & 0x80) == 0) {
ts_recv_packet2((mpegts_service_t *)t, tsb);
return 1;
}
return -1;
}

if (dr->dr_csa.csa_type == DESCRAMBLER_NONE && dr->dr_buf.sb_ptr == 0)
if ((tsb[3] & 0x80) == 0) {
ts_recv_packet2((mpegts_service_t *)t, tsb);
return 1;
}

count = failed = resolved = 0;
LIST_FOREACH(td, &t->s_descramblers, td_service_link) {
Expand Down
4 changes: 3 additions & 1 deletion src/idnode.c
Expand Up @@ -1011,7 +1011,7 @@ idnode_set_find_index
return -1;
}

void
int
idnode_set_remove
( idnode_set_t *is, idnode_t *in )
{
Expand All @@ -1020,7 +1020,9 @@ idnode_set_remove
memmove(&is->is_array[i], &is->is_array[i+1],
(is->is_count - i - 1) * sizeof(idnode_t *));
is->is_count--;
return 1;
}
return 0;
}

void
Expand Down
2 changes: 1 addition & 1 deletion src/idnode.h
Expand Up @@ -203,7 +203,7 @@ static inline idnode_set_t * idnode_set_create(int sorted)
is->is_sorted = sorted; return is; }
void idnode_set_add
( idnode_set_t *is, idnode_t *in, idnode_filter_t *filt );
void idnode_set_remove ( idnode_set_t *is, idnode_t *in );
int idnode_set_remove ( idnode_set_t *is, idnode_t *in );
ssize_t idnode_set_find_index( idnode_set_t *is, idnode_t *in );
static inline int idnode_set_exists ( idnode_set_t *is, idnode_t *in )
{ return idnode_set_find_index(is, in) >= 0; }
Expand Down
3 changes: 3 additions & 0 deletions src/input/mpegts.h
Expand Up @@ -977,6 +977,9 @@ mpegts_service_t *mpegts_service_create_raw(mpegts_mux_t *mm);
mpegts_service_t *mpegts_service_find
( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid, int create, int *save );

mpegts_service_t *
mpegts_service_find_by_pid ( mpegts_mux_t *mm, int pid );

static inline mpegts_service_t *mpegts_service_find_by_uuid(const char *uuid)
{ return idnode_find(uuid, &mpegts_service_class, NULL); }

Expand Down
27 changes: 25 additions & 2 deletions src/input/mpegts/mpegts_service.c
Expand Up @@ -633,6 +633,31 @@ mpegts_service_find
return s;
}

/*
* Find PID
*/
mpegts_service_t *
mpegts_service_find_by_pid ( mpegts_mux_t *mm, int pid )
{
mpegts_service_t *s;

lock_assert(&global_lock);

/* Find existing service */
LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) {
pthread_mutex_lock(&s->s_stream_mutex);
if (pid == s->s_pmt_pid || pid == s->s_pcr_pid)
goto ok;
if (service_stream_find((service_t *)s, pid))
goto ok;
pthread_mutex_unlock(&s->s_stream_mutex);
}
return NULL;
ok:
pthread_mutex_unlock(&s->s_stream_mutex);
return s;
}

/*
* Raw MPEGTS Service
*/
Expand Down Expand Up @@ -713,7 +738,6 @@ static int
mpegts_service_link ( mpegts_service_t *master, mpegts_service_t *slave )
{
pthread_mutex_lock(&master->s_stream_mutex);
assert(slave->s_status == SERVICE_IDLE);
LIST_INSERT_HEAD(&slave->s_masters, master, s_masters_link);
LIST_INSERT_HEAD(&master->s_slaves, slave, s_slaves_link);
pthread_mutex_unlock(&master->s_stream_mutex);
Expand All @@ -724,7 +748,6 @@ static int
mpegts_service_unlink ( mpegts_service_t *master, mpegts_service_t *slave )
{
pthread_mutex_lock(&master->s_stream_mutex);
assert(slave->s_status == SERVICE_IDLE);
LIST_SAFE_REMOVE(master, s_masters_link);
LIST_SAFE_REMOVE(slave, s_slaves_link);
pthread_mutex_unlock(&master->s_stream_mutex);
Expand Down
31 changes: 12 additions & 19 deletions src/input/mpegts/tsdemux.c
Expand Up @@ -86,32 +86,25 @@ ts_recv_packet0
ts_remux(t, tsb, error);

LIST_FOREACH(m, &t->s_masters, s_masters_link) {
pthread_mutex_lock(&t->s_stream_mutex);
if(streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS))
ts_remux(t, tsb, error);
pthread_mutex_unlock(&t->s_stream_mutex);
pthread_mutex_lock(&m->s_stream_mutex);
if(streaming_pad_probe_type(&m->s_streaming_pad, SMT_MPEGTS))
ts_remux(m, tsb, error);
pthread_mutex_unlock(&m->s_stream_mutex);
}

off = tsb[3] & 0x20 ? tsb[4] + 5 : 4;

switch(st->es_type) {

case SCT_CA:
break;
if (st->es_type == SCT_CA)
return;

default:
if(!streaming_pad_probe_type(&t->s_streaming_pad, SMT_PACKET))
break;
if(!streaming_pad_probe_type(&t->s_streaming_pad, SMT_PACKET))
return;

if(st->es_type == SCT_TELETEXT)
teletext_input(t, st, tsb);
if(off > 188)
break;
if(st->es_type == SCT_TELETEXT)
teletext_input(t, st, tsb);

if(t->s_status == SERVICE_RUNNING)
parse_mpeg_ts((service_t*)t, st, tsb + off, 188 - off, pusi, error);
break;
}
if(off <= 188 && t->s_status == SERVICE_RUNNING)
parse_mpeg_ts((service_t*)t, st, tsb + off, 188 - off, pusi, error);
}

/**
Expand Down
11 changes: 9 additions & 2 deletions src/queue.h
Expand Up @@ -11,6 +11,11 @@
* Complete missing LIST-ops
*/

#ifndef LIST_ENTRY_INIT
#define LIST_ENTRY_INIT(elm, field) \
(elm)->field.le_next = NULL, (elm)->field.le_prev = NULL
#endif

#ifndef LIST_FOREACH
#define LIST_FOREACH(var, head, field) \
for ((var) = ((head)->lh_first); \
Expand All @@ -32,8 +37,10 @@

#ifndef LIST_SAFE_REMOVE
#define LIST_SAFE_REMOVE(elm, field) \
if ((elm)->field.le_next != NULL || (elm)->field.le_prev != NULL) \
LIST_REMOVE(elm, field)
if ((elm)->field.le_next != NULL || (elm)->field.le_prev != NULL) { \
LIST_REMOVE(elm, field); \
LIST_ENTRY_INIT(elm, field); \
}
#endif

#ifndef LIST_INSERT_BEFORE
Expand Down

0 comments on commit 0138a37

Please sign in to comment.