Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
profile: added htsp profile for the htsp protocol
- also added alternate default lookups for profiles (not defined) for
  * DVR               : 'dvr'
  * Channel streaming : 'channel'
  * Service streaming : 'service'
  • Loading branch information
perexg committed Oct 16, 2014
1 parent b72ad69 commit b1edb29
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 23 deletions.
6 changes: 3 additions & 3 deletions src/dvr/dvr_config.c
Expand Up @@ -171,7 +171,7 @@ dvr_config_create(const char *name, const char *uuid, htsmsg_t *conf)
tvhinfo("dvr", "Creating new configuration '%s'", cfg->dvr_config_name);

if (cfg->dvr_profile == NULL) {
cfg->dvr_profile = profile_find_by_name(NULL);
cfg->dvr_profile = profile_find_by_name("dvr", NULL);
assert(cfg->dvr_profile);
LIST_INSERT_HEAD(&cfg->dvr_profile->pro_dvr_configs, cfg, profile_link);
}
Expand Down Expand Up @@ -343,7 +343,7 @@ dvr_config_class_profile_set(void *o, const void *v)
profile_t *pro;

pro = v ? profile_find_by_uuid(v) : NULL;
pro = pro ?: profile_find_by_name(v);
pro = pro ?: profile_find_by_name(v, "dvr");
if (pro == NULL) {
if (cfg->dvr_profile) {
LIST_REMOVE(cfg, profile_link);
Expand Down Expand Up @@ -707,7 +707,7 @@ dvr_config_destroy_by_profile(profile_t *pro, int delconf)

while((cfg = LIST_FIRST(&pro->pro_dvr_configs)) != NULL) {
LIST_REMOVE(cfg, profile_link);
cfg->dvr_profile = profile_find_by_name(NULL);
cfg->dvr_profile = profile_find_by_name(NULL, "dvr");
}
}

Expand Down
15 changes: 10 additions & 5 deletions src/htsp_server.c
Expand Up @@ -1785,17 +1785,22 @@ htsp_method_subscribe(htsp_connection_t *htsp, htsmsg_t *in)

#if ENABLE_LIBAV
const char *profile_id = htsmsg_get_str(in, "profile");
profile_t *pro = profile_find_by_uuid(profile_id) ?: profile_find_by_name(profile_id);
profile_t *pro = NULL;
if (profile_id) {
pro = profile_find_by_uuid(profile_id);
if (pro == NULL)
pro = profile_find_by_name(profile_id, "htsp");
}

#else
profile_t *pro = profile_find_by_name("htsp", NULL);
#endif

hs->hs_work = profile_work(pro, st, &hs->hs_work_destroy);
if (hs->hs_work) {
st = hs->hs_work;
normts = 1;
}
#else
profile_t *pro = NULL;
#endif

if(normts)
st = hs->hs_tsfix = tsfix_create(st);

Expand Down
89 changes: 77 additions & 12 deletions src/profile.c
Expand Up @@ -293,12 +293,17 @@ profile_get_name(profile_t *pro)
*
*/
profile_t *
profile_find_by_name(const char *name)
profile_find_by_name(const char *name, const char *alt)
{
profile_t *pro;

lock_assert(&global_lock);

if (!name && alt) {
name = alt;
alt = NULL;
}

if (!name)
return profile_default;

Expand All @@ -307,6 +312,13 @@ profile_find_by_name(const char *name)
return pro;
}

if (alt) {
TAILQ_FOREACH(pro, &profiles, pro_link) {
if (!strcmp(pro->pro_name, alt))
return pro;
}
}

return profile_default;
}

Expand Down Expand Up @@ -401,6 +413,35 @@ profile_chain_close(profile_chain_t *prch)
streaming_queue_deinit(&prch->prch_sq);
}

/*
* HTSP Profile Class
*/
const idclass_t profile_htsp_class =
{
.ic_super = &profile_class,
.ic_class = "profile-htsp",
.ic_caption = "HTSP Stream Profile",
.ic_properties = (const property_t[]){
/* Ready for future extensions */
{ }
}
};

static muxer_container_type_t
profile_htsp_get_mc(profile_t *_pro)
{
return MC_UNKNOWN;
}

static profile_t *
profile_htsp_builder(void)
{
profile_t *pro = calloc(1, sizeof(*pro));
pro->pro_open = NULL;
pro->pro_get_mc = profile_htsp_get_mc;
return pro;
}

/*
* MPEG-TS passthrough muxer
*/
Expand All @@ -412,7 +453,7 @@ typedef struct profile_mpegts {

const idclass_t profile_mpegts_pass_class =
{
.ic_super = &profile_class,
.ic_super = &profile_class,
.ic_class = "profile-mpegts",
.ic_caption = "MPEG-TS Pass-through",
.ic_properties = (const property_t[]){
Expand Down Expand Up @@ -483,7 +524,7 @@ typedef struct profile_matroska {

const idclass_t profile_matroska_class =
{
.ic_super = &profile_class,
.ic_super = &profile_class,
.ic_class = "profile-matroska",
.ic_caption = "Matroska (mkv)",
.ic_properties = (const property_t[]){
Expand Down Expand Up @@ -705,7 +746,7 @@ profile_class_scodec_list(void *o)

const idclass_t profile_transcode_class =
{
.ic_super = &profile_class,
.ic_super = &profile_class,
.ic_class = "profile-transcode",
.ic_caption = "Transcode",
.ic_properties = (const property_t[]){
Expand Down Expand Up @@ -878,12 +919,15 @@ profile_init(void)
{
htsmsg_t *c, *e;
htsmsg_field_t *f;
profile_t *pro;
const char *name;

LIST_INIT(&profile_builders);
TAILQ_INIT(&profiles);

profile_register(&profile_mpegts_pass_class, profile_mpegts_pass_builder);
profile_register(&profile_matroska_class, profile_matroska_builder);
profile_register(&profile_htsp_class, profile_htsp_builder);
#if ENABLE_LIBAV
profile_transcode_experimental_codecs =
getenv("TVHEADEND_LIBAV_NO_EXPERIMENTAL_CODECS") ? 0 : 1;
Expand All @@ -899,37 +943,58 @@ profile_init(void)
htsmsg_destroy(c);
}

if (TAILQ_EMPTY(&profiles)) {
name = "pass";
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

conf = htsmsg_create_map();
htsmsg_add_str (conf, "class", "profile-mpegts");
htsmsg_add_bool(conf, "enabled", 1);
htsmsg_add_bool(conf, "default", 1);
htsmsg_add_str (conf, "name", "pass");
htsmsg_add_str (conf, "name", name);
htsmsg_add_str (conf, "comment", "MPEG-TS Pass-through");
htsmsg_add_bool(conf, "rewrite_pmt", 1);
htsmsg_add_bool(conf, "rewrite_pat", 1);
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);
htsmsg_destroy(conf);
}

name = "matroska";
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

conf = htsmsg_create_map();
htsmsg_add_str (conf, "class", "profile-matroska");
htsmsg_add_bool(conf, "enabled", 1);
htsmsg_add_str (conf, "name", "matroska");
htsmsg_add_str (conf, "name", name);
htsmsg_add_str (conf, "comment", "Matroska");
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);
htsmsg_destroy(conf);
}

name = "htsp";
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

conf = htsmsg_create_map();
htsmsg_add_str (conf, "class", "profile-htsp");
htsmsg_add_bool(conf, "enabled", 1);
htsmsg_add_str (conf, "name", name);
htsmsg_add_str (conf, "comment", "HTSP Default Stream Settings");
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);
htsmsg_destroy(conf);
}

#if ENABLE_LIBAV
profile_t *pro;
const char *name;

name = "webtv-vp8-vorbis-webm";
pro = profile_find_by_name(name);
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

Expand All @@ -948,7 +1013,7 @@ profile_init(void)
htsmsg_destroy(conf);
}
name = "webtv-h264-aac-mpegts";
pro = profile_find_by_name(name);
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

Expand All @@ -967,7 +1032,7 @@ profile_init(void)
htsmsg_destroy(conf);
}
name = "webtv-h264-aac-matroska";
pro = profile_find_by_name(name);
pro = profile_find_by_name(name, NULL);
if (pro == NULL || strcmp(pro->pro_name, name)) {
htsmsg_t *conf;

Expand Down
2 changes: 1 addition & 1 deletion src/profile.h
Expand Up @@ -103,7 +103,7 @@ void profile_chain_close(profile_chain_t *prch);

static inline profile_t *profile_find_by_uuid(const char *uuid)
{ return (profile_t*)idnode_find(uuid, &profile_class, NULL); }
profile_t *profile_find_by_name(const char *name);
profile_t *profile_find_by_name(const char *name, const char *alt);

htsmsg_t * profile_class_get_list(void *o);

Expand Down
4 changes: 2 additions & 2 deletions src/webui/webui.c
Expand Up @@ -719,7 +719,7 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight)
if(http_access_verify(hc, ACCESS_ADVANCED_STREAMING))
return HTTP_STATUS_UNAUTHORIZED;

if(!(pro = profile_find_by_name(http_arg_get(&hc->hc_req_args, "profile"))))
if(!(pro = profile_find_by_name(http_arg_get(&hc->hc_req_args, "profile"), "service")))
return HTTP_STATUS_NOT_ALLOWED;

if((tcp_id = http_stream_preop(hc)) == NULL)
Expand Down Expand Up @@ -831,7 +831,7 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight)
if (http_access_verify_channel(hc, ACCESS_STREAMING, ch, 1))
return HTTP_STATUS_UNAUTHORIZED;

if(!(pro = profile_find_by_name(http_arg_get(&hc->hc_req_args, "profile"))))
if(!(pro = profile_find_by_name(http_arg_get(&hc->hc_req_args, "profile"), "channel")))
return HTTP_STATUS_NOT_ALLOWED;

if((tcp_id = http_stream_preop(hc)) == NULL)
Expand Down

0 comments on commit b1edb29

Please sign in to comment.