diff --git a/streaming.c b/streaming.c index 4c102efb..58edd3ba 100644 --- a/streaming.c +++ b/streaming.c @@ -30,6 +30,18 @@ streaming_pad_init(streaming_pad_t *sp, pthread_mutex_t *mutex) sp->sp_mutex = mutex; } +/** + * + */ +void +streaming_target_init(streaming_target_t *st) +{ + st->st_status = ST_IDLE; + pthread_mutex_init(&st->st_mutex, NULL); + pthread_cond_init(&st->st_cond, NULL); + TAILQ_INIT(&st->st_queue); +} + /** * */ @@ -43,6 +55,27 @@ streaming_target_connect(streaming_pad_t *sp, streaming_target_t *st) LIST_INSERT_HEAD(&sp->sp_targets, st, st_link); } + +void +streaming_target_disconnect(streaming_target_t *st) +{ + streaming_pad_t *sp = st->st_pad; + + if(sp == NULL) + return; /* Already disconnected */ + + pthread_mutex_lock(sp->sp_mutex); + + sp->sp_ntargets--; + st->st_pad = NULL; + + LIST_REMOVE(st, st_link); + + pthread_mutex_unlock(sp->sp_mutex); + + pktref_clear_queue(&st->st_queue); +} + /** * */ diff --git a/streaming.h b/streaming.h index ee33c275..c3aa0c03 100644 --- a/streaming.h +++ b/streaming.h @@ -25,11 +25,13 @@ /** * */ -void streaming_pad_init(streaming_pad_t *pd, pthread_mutex_t *mutex); +void streaming_pad_init(streaming_pad_t *sp, pthread_mutex_t *mutex); void streaming_target_init(streaming_target_t *st); -void streaming_target_connect(streaming_pad_t *pd, streaming_target_t *st); +void streaming_target_connect(streaming_pad_t *sp, streaming_target_t *st); + +void streaming_target_disconnect(streaming_target_t *st); void streaming_pad_deliver_packet(streaming_pad_t *sp, th_pkt_t *pkt); diff --git a/tvhead.h b/tvhead.h index 222f1af1..e3ddd603 100644 --- a/tvhead.h +++ b/tvhead.h @@ -169,6 +169,14 @@ typedef struct streaming_target { struct th_pktref_queue st_queue; + enum { + ST_IDLE, + ST_RUNNING, + ST_STOP_REQ, + ST_ZOMBIE, + } st_status; + + } streaming_target_t;