input_clear_stats(const char *uuid)
{
tvh_input_instance_t *tii;
+ tvh_input_t *ti;
pthread_mutex_lock(&global_lock);
if ((tii = tvh_input_instance_find_by_uuid(uuid)) != NULL)
if (tii->tii_clear_stats)
tii->tii_clear_stats(tii);
+ if ((ti = tvh_input_find_by_uuid(uuid)) != NULL)
+ if (ti->ti_clear_stats)
+ ti->ti_clear_stats(ti);
pthread_mutex_unlock(&global_lock);
}
tvh_input_list_t tvh_inputs;
tvh_hardware_list_t tvh_hardware;
+const idclass_t tvh_input_class =
+{
+ .ic_class = "tvh_input",
+ .ic_caption = N_("Input Base"),
+ .ic_perm_def = ACCESS_ADMIN
+};
+
const idclass_t tvh_input_instance_class =
{
.ic_class = "tvh_input_instance",
LIST_ENTRY(tvh_input) ti_link;
- void (*ti_get_streams) (struct tvh_input *, tvh_input_stream_list_t*);
+ void (*ti_get_streams) (tvh_input_t *, tvh_input_stream_list_t*);
+ void (*ti_clear_stats) (tvh_input_t *);
};
/*
void tvh_input_stream_destroy ( tvh_input_stream_t *st );
+static inline tvh_input_t *
+tvh_input_find_by_uuid(const char *uuid)
+ { return (tvh_input_t*)idnode_find(uuid, &tvh_input_class, NULL); }
+
static inline tvh_input_instance_t *
tvh_input_instance_find_by_uuid(const char *uuid)
{ return (tvh_input_instance_t*)idnode_find(uuid, &tvh_input_instance_class, NULL); }
void (*mi_stopping_mux) (mpegts_input_t*,mpegts_mux_instance_t*);
void (*mi_stopped_mux) (mpegts_input_t*,mpegts_mux_instance_t*);
int (*mi_has_subscription) (mpegts_input_t*, mpegts_mux_t *mm);
- void (*mi_tuning_error) (mpegts_input_t*,mpegts_mux_t *);
+ void (*mi_tuning_error) (mpegts_input_t*, mpegts_mux_t *);
+ void (*mi_empty_status) (mpegts_input_t*, tvh_input_stream_t *);
idnode_set_t *(*mi_network_list) (mpegts_input_t*);
};
int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, int flags );
+void mpegts_input_empty_status ( mpegts_input_t *mi, tvh_input_stream_t *st );
+
+
/* TODO: exposing these class methods here is a bit of a hack */
const void *mpegts_input_class_network_get ( void *o );
int mpegts_input_class_network_set ( void *o, const void *p );
return r;
}
+
/* **************************************************************************
* Creation/Config
* *************************************************************************/
lfe->mi_network_list = linuxdvb_frontend_network_list;
lfe->mi_update_pids = linuxdvb_frontend_update_pids;
lfe->mi_enabled_updated = linuxdvb_frontend_enabled_updated;
+ lfe->mi_empty_status = mpegts_input_empty_status;
/* Adapter link */
lfe->lfe_adapter = la;
const idclass_t mpegts_input_class =
{
+ .ic_super = &tvh_input_class,
.ic_class = "mpegts_input",
.ic_caption = N_("MPEG-TS Input"),
.ic_event = "mpegts_input",
st->stats.bps = atomic_exchange(&mmi->tii_stats.bps, 0) * 8;
}
+void
+mpegts_input_empty_status
+ ( mpegts_input_t *mi, tvh_input_stream_t *st )
+{
+ char buf[512];
+ tvh_input_instance_t *mmi_;
+ mpegts_mux_instance_t *mmi;
+
+ st->uuid = strdup(idnode_uuid_as_sstr(&mi->ti_id));
+ mi->mi_display_name(mi, buf, sizeof(buf));
+ st->input_name = strdup(buf);
+ LIST_FOREACH(mmi_, &mi->mi_mux_instances, tii_input_link) {
+ mmi = (mpegts_mux_instance_t *)mmi_;
+ st->stats.unc += mmi->tii_stats.unc;
+ st->stats.cc += mmi->tii_stats.cc;
+ st->stats.te += mmi->tii_stats.te;
+ st->stats.ec_block += mmi->tii_stats.ec_block;
+ st->stats.tc_block += mmi->tii_stats.tc_block;
+ }
+}
+
static void
mpegts_input_get_streams
( tvh_input_t *i, tvh_input_stream_list_t *isl )
{
- tvh_input_stream_t *st;
+ tvh_input_stream_t *st = NULL;
mpegts_input_t *mi = (mpegts_input_t*)i;
mpegts_mux_instance_t *mmi;
mpegts_input_stream_status(mmi, st);
LIST_INSERT_HEAD(isl, st, link);
}
+ if (st == NULL && mi->mi_empty_status) {
+ st = calloc(1, sizeof(tvh_input_stream_t));
+ mi->mi_empty_status(mi, st);
+ LIST_INSERT_HEAD(isl, st, link);
+ }
pthread_mutex_unlock(&mi->mi_output_lock);
}
lfe->mi_stop_mux = satip_frontend_stop_mux;
lfe->mi_network_list = satip_frontend_network_list;
lfe->mi_update_pids = satip_frontend_update_pids;
+ lfe->mi_empty_status = mpegts_input_empty_status;
/* Adapter link */
lfe->sf_device = sd;
hfe->mi_stop_mux = tvhdhomerun_frontend_stop_mux;
hfe->mi_network_list = tvhdhomerun_frontend_network_list;
hfe->mi_update_pids = tvhdhomerun_frontend_update_pids;
+ hfe->mi_empty_status = mpegts_input_empty_status;
/* Adapter link */
hfe->hf_device = hd;