th_transport_t *t;
while((t = LIST_FIRST(&tda->tda_transports)) != NULL)
- dvb_stop_feed(t);
+ transport_stop(t, 1);
}
st->st_demuxer_fd = -1;
}
t->tht_status = TRANSPORT_IDLE;
- transport_flush_subscribers(t);
}
void
-transport_purge(th_transport_t *t)
+transport_stop(th_transport_t *t, int flush_subscriptions)
{
+ th_subscription_t *s;
th_stream_t *st;
th_pkt_t *pkt;
- if(LIST_FIRST(&t->tht_subscriptions))
- return;
+ if(flush_subscriptions) {
+ while((s = LIST_FIRST(&t->tht_subscriptions)) != NULL)
+ subscription_stop(s);
+ } else {
+ if(LIST_FIRST(&t->tht_subscriptions))
+ return;
+ }
t->tht_stop_feed(t);
if(st->st_ctx != NULL)
avcodec_close(st->st_ctx);
+ st->st_parser = NULL;
+ st->st_ctx = NULL;
+
/* Clear reassembly buffer */
free(st->st_buffer);
AVCodec *c;
enum CodecID id;
+ assert(t->tht_status != TRANSPORT_RUNNING);
+
+ if(t->tht_start_feed(t, weight, TRANSPORT_RUNNING))
+ return -1;
+
t->tht_monitor_suspend = 10;
t->tht_dts_start = AV_NOPTS_VALUE;
default: id = CODEC_ID_NONE; break;
}
- st->st_ctx = NULL;
- st->st_parser = NULL;
+ assert(st->st_ctx == NULL);
+ assert(st->st_parser == NULL);
if(id != CODEC_ID_NONE) {
c = avcodec_find_decoder(id);
}
}
}
-
- return t->tht_start_feed(t, weight, TRANSPORT_RUNNING);
+ return 0;
}
unsigned int transport_compute_weight(struct th_transport_list *head);
-void transport_flush_subscribers(th_transport_t *t);
+void transport_stop(th_transport_t *t, int flush_subscriptions);
void transport_monitor_init(th_transport_t *t);
th_transport_t *transport_find(th_channel_t *ch, unsigned int weight);
-void transport_purge(th_transport_t *t);
-
th_stream_t *transport_add_stream(th_transport_t *t, int pid,
tv_streamtype_t type);
-
#endif /* TRANSPORTS_H */
LIST_REMOVE(t, tht_adapter_link);
t->tht_status = TRANSPORT_IDLE;
- transport_flush_subscribers(t);
if(LIST_FIRST(&tva->tva_transports) == NULL)
v4l_stop(tva);