pthread_mutex_unlock(&refmutex);
}
+/**
+ *
+ */
+void
+pkt_ref_inc_poly(th_pkt_t *pkt, int n)
+{
+ pthread_mutex_lock(&refmutex);
+ pkt->pkt_refcount += n;
+ pthread_mutex_unlock(&refmutex);
+}
/**
int pkt_duration;
int pkt_refcount;
- uint8_t pkt_streamindex;
+ uint8_t pkt_componentindex;
uint8_t pkt_frametype;
uint8_t pkt_commercial;
void pkt_ref_inc(th_pkt_t *pkt);
+void pkt_ref_inc_poly(th_pkt_t *pkt, int n);
+
void pktref_clear_queue(struct th_pktref_queue *q);
th_pkt_t *pkt_alloc(void *data, size_t datalen, int64_t pts, int64_t dts);
#include "bitstream.h"
#include "packet.h"
#include "transports.h"
+#include "streaming.h"
static const AVRational mpeg_tc = {1, 90000};
*/
transport_signal_status(t, SUBSCRIPTION_VALID_PACKETS);
- /* Alert all muxers tied to us that a new packet has arrived */
-
- lock_assert(&t->tht_stream_mutex);
-#if 0
- LIST_FOREACH(tm, &t->tht_muxers, tm_transport_link)
- tm->tm_new_pkt(tm, st, pkt);
-#endif
- /* Unref (and possibly free) the packet, downstream code is supposed
- to increase refcount or copy packet if they need anything */
+ /* Forward packet */
+ pkt->pkt_componentindex = st->st_sc.sc_index;
+ streaming_pad_deliver_packet(&t->tht_streaming_pad, pkt);
+ /* Decrease our own reference to the packet */
pkt_ref_dec(pkt);
}
#include "tvhead.h"
#include "streaming.h"
+#include "packet.h"
void
streaming_pad_init(streaming_pad_t *sp, pthread_mutex_t *mutex)
LIST_INIT(&sp->sp_components);
sp->sp_mutex = mutex;
}
+
+/**
+ *
+ */
+void
+streaming_target_connect(streaming_pad_t *sp, streaming_target_t *st)
+{
+ lock_assert(sp->sp_mutex);
+
+ sp->sp_ntargets++;
+ st->st_pad = sp;
+ LIST_INSERT_HEAD(&sp->sp_targets, st, st_link);
+}
+
+/**
+ *
+ */
+void
+streaming_pad_deliver_packet(streaming_pad_t *sp, th_pkt_t *pkt)
+{
+ streaming_target_t *st;
+ th_pktref_t *pr;
+
+ lock_assert(sp->sp_mutex);
+
+ if(sp->sp_ntargets == 0)
+ return;
+
+ /* Increase multiple refcounts at once */
+ pkt_ref_inc_poly(pkt, sp->sp_ntargets);
+
+ LIST_FOREACH(st, &sp->sp_targets, st_link) {
+
+ pr = malloc(sizeof(th_pktref_t));
+ pr->pr_pkt = pkt;
+
+ pthread_mutex_lock(&st->st_mutex);
+ TAILQ_INSERT_TAIL(&st->st_queue, pr, pr_link);
+ pthread_cond_signal(&st->st_cond);
+ pthread_mutex_unlock(&st->st_mutex);
+ }
+}
#define STREAMING_H_
#include "tvhead.h"
-
+#include "packet.h"
/**
*
void streaming_target_connect(streaming_pad_t *pd, streaming_target_t *st);
+void streaming_pad_deliver_packet(streaming_pad_t *sp, th_pkt_t *pkt);
+
#endif /* STREAMING_H_ */
*/
typedef struct streaming_pad {
struct streaming_target_list sp_targets;
+ int sp_ntargets;
struct streaming_component_list sp_components;
pthread_mutex_t *sp_mutex; /* Mutex for protecting modification of