int http_persistent;
AVIOContext *m3u8_out;
AVIOContext *sub_m3u8_out;
+ int64_t timeout;
} HLSContext;
static int mkdir_p(const char *path) {
av_dict_set(options, "user_agent", c->user_agent, 0);
if (c->http_persistent)
av_dict_set_int(options, "multiple_requests", 1, 0);
-
+ if (c->timeout >= 0)
+ av_dict_set_int(options, "timeout", c->timeout, 0);
}
static void write_codec_attr(AVStream *st, VariantStream *vs) {
/* Get one video stream to reference for split segments
* so use the first video stream index. */
if ((vs->has_video == 1) && (vs->streams[j]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)) {
- vs->reference_stream_index = j;
+ vs->reference_stream_index = vs->streams[j]->index;
}
vs->has_subtitle += vs->streams[j]->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE;
}
if (hls->segment_type == SEGMENT_TYPE_FMP4) {
if (hls->nb_varstreams > 1)
fmp4_init_filename_len += strlen(POSTFIX_PATTERN);
+ if (hls->flags & HLS_SINGLE_FILE) {
+ vs->fmp4_init_filename = av_strdup(vs->basename);
+ if (!vs->fmp4_init_filename) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ } else {
vs->fmp4_init_filename = av_malloc(fmp4_init_filename_len);
if (!vs->fmp4_init_filename ) {
ret = AVERROR(ENOMEM);
}
av_strlcpy(vs->fmp4_init_filename, hls->fmp4_init_filename,
fmp4_init_filename_len);
-
- if (av_strcasecmp(hls->fmp4_init_filename, "init.mp4")) {
- ret = format_name(vs->fmp4_init_filename, fmp4_init_filename_len, i);
+ if (hls->nb_varstreams > 1) {
+ ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i);
if (ret < 0)
goto fail;
+ }
- fmp4_init_filename_len = strlen(vs->fmp4_init_filename) + 1;
- vs->base_output_dirname = av_malloc(fmp4_init_filename_len);
- if (!vs->base_output_dirname) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
- av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename,
- fmp4_init_filename_len);
- } else {
- if (hls->nb_varstreams > 1) {
- ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i);
- if (ret < 0)
- goto fail;
- }
-
- fmp4_init_filename_len = strlen(vs->m3u8_name) +
- strlen(vs->fmp4_init_filename) + 1;
+ fmp4_init_filename_len = strlen(vs->m3u8_name) +
+ strlen(vs->fmp4_init_filename) + 1;
- vs->base_output_dirname = av_malloc(fmp4_init_filename_len);
- if (!vs->base_output_dirname) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
+ vs->base_output_dirname = av_malloc(fmp4_init_filename_len);
+ if (!vs->base_output_dirname) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
- av_strlcpy(vs->base_output_dirname, vs->m3u8_name,
+ av_strlcpy(vs->base_output_dirname, vs->m3u8_name,
+ fmp4_init_filename_len);
+ p = strrchr(vs->base_output_dirname, '/');
+ if (p) {
+ *(p + 1) = '\0';
+ av_strlcat(vs->base_output_dirname, vs->fmp4_init_filename,
fmp4_init_filename_len);
- p = strrchr(vs->base_output_dirname, '/');
- if (p) {
- *(p + 1) = '\0';
- av_strlcat(vs->base_output_dirname, vs->fmp4_init_filename,
- fmp4_init_filename_len);
- } else {
- av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename,
- fmp4_init_filename_len);
- }
+ } else {
+ av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename,
+ fmp4_init_filename_len);
+ }
}
}
}
}
- if ((hls->flags & HLS_SINGLE_FILE) && (hls->segment_type == SEGMENT_TYPE_FMP4)) {
- vs->fmp4_init_filename = av_strdup(vs->basename);
- if (!vs->fmp4_init_filename) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
- }
if ((ret = hls_mux_init(s, vs)) < 0)
goto fail;
{"master_pl_name", "Create HLS master playlist with this name", OFFSET(master_pl_name), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"master_pl_publish_rate", "Publish master play list every after this many segment intervals", OFFSET(master_publish_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, UINT_MAX, E},
{"http_persistent", "Use persistent HTTP connections", OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
+ {"timeout", "set timeout for socket I/O operations", OFFSET(timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags = E },
{ NULL },
};