HTSP: Add subscriptionFilterStream command
This commit is contained in:
parent
29f715f685
commit
535fc25fcc
1 changed files with 75 additions and 0 deletions
|
@ -193,6 +193,10 @@ streaming_target_t *hs_transcoder;
|
|||
|
||||
int hs_queue_depth;
|
||||
|
||||
#define NUM_FILTERED_STREAMS (32*16)
|
||||
|
||||
uint32_t hs_filtered_streams[16]; // one bit per stream
|
||||
|
||||
} htsp_subscription_t;
|
||||
|
||||
|
||||
|
@ -214,6 +218,31 @@ typedef struct htsp_file {
|
|||
* Support routines
|
||||
* *************************************************************************/
|
||||
|
||||
static void
|
||||
htsp_disable_stream(htsp_subscription_t *hs, unsigned int id)
|
||||
{
|
||||
if(id < NUM_FILTERED_STREAMS)
|
||||
hs->hs_filtered_streams[id / 32] |= 1 << (id & 31);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
htsp_enable_stream(htsp_subscription_t *hs, unsigned int id)
|
||||
{
|
||||
if(id < NUM_FILTERED_STREAMS)
|
||||
hs->hs_filtered_streams[id / 32] &= ~(1 << (id & 31));
|
||||
}
|
||||
|
||||
|
||||
static inline int
|
||||
htsp_is_stream_enabled(htsp_subscription_t *hs, unsigned int id)
|
||||
{
|
||||
if(id < NUM_FILTERED_STREAMS)
|
||||
return !(hs->hs_filtered_streams[id / 32] & (1 << (id & 31)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -664,6 +693,8 @@ htsp_build_event
|
|||
htsmsg_add_s64(out, "stop", e->stop);
|
||||
if ((str = epg_broadcast_get_title(e, lang)))
|
||||
htsmsg_add_str(out, "title", str);
|
||||
if ((str = epg_broadcast_get_subtitle(e, lang)))
|
||||
htsmsg_add_str(out, "subtitle", str);
|
||||
if ((str = epg_broadcast_get_description(e, lang))) {
|
||||
htsmsg_add_str(out, "description", str);
|
||||
if ((str = epg_broadcast_get_summary(e, lang)))
|
||||
|
@ -1532,6 +1563,44 @@ htsp_method_live(htsp_connection_t *htsp, htsmsg_t *in)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change filters for a subscription
|
||||
*/
|
||||
static htsmsg_t *
|
||||
htsp_method_filter_stream(htsp_connection_t *htsp, htsmsg_t *in)
|
||||
{
|
||||
htsp_subscription_t *hs;
|
||||
uint32_t sid;
|
||||
htsmsg_t *l;
|
||||
if(htsmsg_get_u32(in, "subscriptionId", &sid))
|
||||
return htsp_error("Missing argument 'subscriptionId'");
|
||||
|
||||
LIST_FOREACH(hs, &htsp->htsp_subscriptions, hs_link)
|
||||
if(hs->hs_sid == sid)
|
||||
break;
|
||||
|
||||
if(hs == NULL)
|
||||
return htsp_error("Requested subscription does not exist");
|
||||
|
||||
if((l = htsmsg_get_list(in, "enable")) != NULL) {
|
||||
htsmsg_field_t *f;
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if(f->hmf_type == HMF_S64)
|
||||
htsp_enable_stream(hs, f->hmf_s64);
|
||||
}
|
||||
}
|
||||
|
||||
if((l = htsmsg_get_list(in, "disable")) != NULL) {
|
||||
htsmsg_field_t *f;
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if(f->hmf_type == HMF_S64)
|
||||
htsp_disable_stream(hs, f->hmf_s64);
|
||||
}
|
||||
}
|
||||
return htsmsg_create_map();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open file
|
||||
*/
|
||||
|
@ -1733,6 +1802,7 @@ struct {
|
|||
{ "subscriptionSkip", htsp_method_skip, ACCESS_STREAMING},
|
||||
{ "subscriptionSpeed", htsp_method_speed, ACCESS_STREAMING},
|
||||
{ "subscriptionLive", htsp_method_live, ACCESS_STREAMING},
|
||||
{ "subscriptionFilterStream", htsp_method_filter_stream, ACCESS_STREAMING},
|
||||
#if ENABLE_LIBAV
|
||||
{ "getCodecs", htsp_method_getCodecs, ACCESS_STREAMING},
|
||||
#endif
|
||||
|
@ -2280,6 +2350,11 @@ htsp_stream_deliver(htsp_subscription_t *hs, th_pkt_t *pkt)
|
|||
int64_t ts;
|
||||
int qlen = hs->hs_q.hmq_payload;
|
||||
|
||||
if(!htsp_is_stream_enabled(hs, pkt->pkt_componentindex)) {
|
||||
pkt_ref_dec(pkt);
|
||||
return;
|
||||
}
|
||||
|
||||
if((qlen > hs->hs_queue_depth && pkt->pkt_frametype == PKT_B_FRAME) ||
|
||||
(qlen > hs->hs_queue_depth * 2 && pkt->pkt_frametype == PKT_P_FRAME) ||
|
||||
(qlen > hs->hs_queue_depth * 3)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue