typedef struct DASHContext {
const AVClass *class;
char *base_url;
- char *adaptionset_contenttype_val;
- char *adaptionset_par_val;
- char *adaptionset_lang_val;
- char *adaptionset_minbw_val;
- char *adaptionset_maxbw_val;
- char *adaptionset_minwidth_val;
- char *adaptionset_maxwidth_val;
- char *adaptionset_minheight_val;
- char *adaptionset_maxheight_val;
- char *adaptionset_minframerate_val;
- char *adaptionset_maxframerate_val;
- char *adaptionset_segmentalignment_val;
- char *adaptionset_bitstreamswitching_val;
int n_videos;
struct representation **videos;
free_fragment(&pls->init_section);
av_freep(&pls->init_sec_buf);
av_freep(&pls->pb.buffer);
- if (pls->input)
- ff_format_io_close(pls->parent, &pls->input);
+ ff_format_io_close(pls->parent, &pls->input);
if (pls->ctx) {
pls->ctx->pb = NULL;
avformat_close_input(&pls->ctx);
xmlNodePtr period_segmentlist_node)
{
int ret = 0;
- DASHContext *c = s->priv_data;
xmlNodePtr fragment_template_node = NULL;
xmlNodePtr content_component_node = NULL;
xmlNodePtr adaptionset_baseurl_node = NULL;
xmlNodePtr adaptionset_segmentlist_node = NULL;
xmlNodePtr adaptionset_supplementalproperty_node = NULL;
xmlNodePtr node = NULL;
- c->adaptionset_contenttype_val = xmlGetProp(adaptionset_node, "contentType");
- c->adaptionset_par_val = xmlGetProp(adaptionset_node, "par");
- c->adaptionset_lang_val = xmlGetProp(adaptionset_node, "lang");
- c->adaptionset_minbw_val = xmlGetProp(adaptionset_node, "minBandwidth");
- c->adaptionset_maxbw_val = xmlGetProp(adaptionset_node, "maxBandwidth");
- c->adaptionset_minwidth_val = xmlGetProp(adaptionset_node, "minWidth");
- c->adaptionset_maxwidth_val = xmlGetProp(adaptionset_node, "maxWidth");
- c->adaptionset_minheight_val = xmlGetProp(adaptionset_node, "minHeight");
- c->adaptionset_maxheight_val = xmlGetProp(adaptionset_node, "maxHeight");
- c->adaptionset_minframerate_val = xmlGetProp(adaptionset_node, "minFrameRate");
- c->adaptionset_maxframerate_val = xmlGetProp(adaptionset_node, "maxFrameRate");
- c->adaptionset_segmentalignment_val = xmlGetProp(adaptionset_node, "segmentAlignment");
- c->adaptionset_bitstreamswitching_val = xmlGetProp(adaptionset_node, "bitstreamSwitching");
node = xmlFirstElementChild(adaptionset_node);
while (node) {
{
DASHContext *c = s->priv_data;
const char *opts[] = {
- "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", NULL };
+ "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", "icy", NULL };
const char **opt = opts;
uint8_t *buf = NULL;
int ret = 0;
goto fail;
pls->ctx->flags = AVFMT_FLAG_CUSTOM_IO;
- pls->ctx->probesize = 1024 * 4;
- pls->ctx->max_analyze_duration = 4 * AV_TIME_BASE;
+ pls->ctx->probesize = s->probesize > 0 ? s->probesize : 1024 * 4;
+ pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
ret = av_probe_input_buffer(&pls->pb, &in_fmt, "", NULL, 0, 0);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Error when loading first fragment, playlist %d\n", (int)pls->rep_idx);
av_log(s, AV_LOG_INFO, "Now receiving stream_index %d\n", pls->stream_index);
} else if (!needed && pls->ctx) {
close_demux_for_component(pls);
- if (pls->input)
- ff_format_io_close(pls->parent, &pls->input);
+ ff_format_io_close(pls->parent, &pls->input);
av_log(s, AV_LOG_INFO, "No longer receiving stream_index %d\n", pls->stream_index);
}
}
if (cur->is_restart_needed) {
cur->cur_seg_offset = 0;
cur->init_sec_buf_read_offset = 0;
- if (cur->input)
- ff_format_io_close(cur->parent, &cur->input);
+ ff_format_io_close(cur->parent, &cur->input);
ret = reopen_demux_for_component(s, cur);
cur->is_restart_needed = 0;
}
return av_seek_frame(pls->ctx, -1, seek_pos_msec * 1000, flags);
}
- if (pls->input)
- ff_format_io_close(pls->parent, &pls->input);
+ ff_format_io_close(pls->parent, &pls->input);
// find the nearest fragment
if (pls->n_timelines > 0 && pls->fragment_timescale > 0) {
if (av_stristr(p->buf, "dash:profile:isoff-on-demand:2011") ||
av_stristr(p->buf, "dash:profile:isoff-live:2011") ||
av_stristr(p->buf, "dash:profile:isoff-live:2012") ||
- av_stristr(p->buf, "dash:profile:isoff-main:2011")) {
+ av_stristr(p->buf, "dash:profile:isoff-main:2011") ||
+ av_stristr(p->buf, "3GPP:PSS:profile:DASH1")) {
return AVPROBE_SCORE_MAX;
}
if (av_stristr(p->buf, "dash:profile")) {
static const AVOption dash_options[] = {
{"allowed_extensions", "List of file extensions that dash is allowed to access",
OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
- {.str = "aac,m4a,m4s,m4v,mov,mp4,webm"},
+ {.str = "aac,m4a,m4s,m4v,mov,mp4,webm,ts"},
INT_MIN, INT_MAX, FLAGS},
{NULL}
};