Go to the documentation of this file.
24 #include "config_components.h"
48 #if CONFIG_HTTP_PROTOCOL
72 #define LINE_BUFFER_SIZE MAX_URL_SIZE
73 #define HLS_MICROSECOND_UNIT 1000000
74 #define BUFSIZE (16 * 1024)
75 #define POSTFIX_PATTERN "_%d"
272 struct tm *tm, tmpbuf;
299 #if CONFIG_HTTP_PROTOCOL
321 #if CONFIG_HTTP_PROTOCOL
338 }
else if (http_base_proto) {
343 if (
c->http_persistent)
370 else if (
data[0] == 0x01)
375 "avc1.%02x%02x%02x", p[0], p[1], p[2]);
403 if (rbsp_size < 13) {
412 level = rbsp_buf[12];
425 snprintf(attr,
sizeof(attr),
"mp4a.40.33");
427 snprintf(attr,
sizeof(attr),
"mp4a.40.34");
433 snprintf(attr,
sizeof(attr),
"mp4a.40.2");
435 snprintf(attr,
sizeof(attr),
"ac-3");
437 snprintf(attr,
sizeof(attr),
"ec-3");
445 "%s%s", codec_strlen ?
"," :
"", attr);
471 if (
c ==
'%' && *(p+1) ==
'%')
473 else if (
c ==
'%' && *(p+1) == placeholder) {
481 if (addchar_count > 0) {
499 int nd, addchar_count;
511 if (
c ==
'%' && *(p+1) ==
'%')
513 else if (
c ==
'%' && (
av_isdigit(*(p+1)) || *(p+1) == placeholder)) {
517 nd = nd * 10 + *(p + addchar_count) -
'0';
521 if (*(p + addchar_count) == placeholder) {
522 av_bprintf(&buf,
"%0*"PRId64, (number < 0) ? nd : nd++, number);
523 p += (addchar_count + 1);
581 char *path,
const char *proto)
597 }
else if (unlink(path) < 0) {
599 path, strerror(errno));
609 float playlist_duration = 0.0f;
613 const char *dirname =
NULL;
614 char *dirname_r =
NULL;
615 char *dirname_repl =
NULL;
616 const char *vtt_dirname =
NULL;
617 char *vtt_dirname_r =
NULL;
618 const char *proto =
NULL;
635 if (playlist_duration <= -previous_segment->
duration) {
665 dirname = dirname_repl;
684 if ((
segment->sub_filename[0] !=
'\0')) {
723 len = strlen(key_basename_source) + 4 + 1;
740 uint8_t iv[16] = { 0 };
746 memcpy(iv, hls->
iv,
sizeof(iv));
853 int remaining_options;
914 av_log(
s,
AV_LOG_WARNING,
"http persistent mode is currently unsupported for fragment mp4 in the HLS muxer.\n");
927 if (byterange_mode) {
955 if (remaining_options) {
985 char *filename =
NULL;
988 "Invalid second level segment filename template '%s', "
989 "you can try to remove second_level_segment_size flag\n",
997 char *filename =
NULL;
1001 "Invalid second level segment filename template '%s', "
1002 "you can try to remove second_level_segment_duration flag\n",
1019 "second_level_segment_duration hls_flag requires strftime to be true\n");
1024 "second_level_segment_size hls_flag requires strfime to be true\n");
1029 "second_level_segment_index hls_flag requires strftime to be true\n");
1039 int segment_renaming_ok = proto && !strcmp(proto,
"file");
1044 "second_level_segment_duration hls_flag works only with file protocol segment names\n");
1049 "second_level_segment_size hls_flag works only with file protocol segment names\n");
1066 char *filename =
NULL;
1070 "you can try to remove second_level_segment_index flag\n",
1081 char *filename =
NULL;
1084 "you can try to remove second_level_segment_size flag\n",
1092 char *filename =
NULL;
1095 "you can try to remove second_level_segment_duration flag\n",
1112 const char *filename;
1144 && !byterange_mode) {
1209 const char *dot = strrchr(filename,
'.');
1210 const char *num_start = dot - 1;
1212 while (num_start > filename && *num_start >=
'0' && *num_start <=
'9') {
1218 if (num_start == dot)
1221 return atoi(num_start);
1228 int ret = 0, is_segment = 0;
1233 double discont_program_date_time = 0;
1236 &
s->interrupt_callback,
NULL,
1237 s->protocol_whitelist,
s->protocol_blacklist)) < 0)
1241 if (strcmp(
line,
"#EXTM3U")) {
1251 if (tmp_sequence < vs->sequence)
1253 "Found playlist sequence number was smaller """
1254 "than specified start sequence number: %"PRId64
" < %"PRId64
", "
1257 av_log(hls,
AV_LOG_DEBUG,
"Found playlist sequence number: %"PRId64
"\n", tmp_sequence);
1269 ptr += strlen(
"URI=\"");
1280 ptr += strlen(
"IV=0x");
1289 struct tm program_date_time;
1292 if (sscanf(ptr,
"%d-%d-%dT%d:%d:%d.%lf", &y, &
M, &d, &
h, &m, &
s, &ms) != 7) {
1297 program_date_time.tm_year = y - 1900;
1298 program_date_time.tm_mon =
M - 1;
1299 program_date_time.tm_mday = d;
1300 program_date_time.tm_hour =
h;
1301 program_date_time.tm_min = m;
1302 program_date_time.tm_sec =
s;
1303 program_date_time.tm_isdst = -1;
1305 discont_program_date_time = mktime(&program_date_time);
1306 discont_program_date_time += (
double)(ms / 1000);
1309 }
else if (
line[0]) {
1321 int len = strlen(vtt_basename) + 11;
1335 if (discont_program_date_time) {
1337 discont_program_date_time += vs->
duration;
1364 size_t len = strlen(oc->
url);
1368 if (!final_filename)
1370 final_filename[
len-4] =
'\0';
1379 const char *p = strrchr(master_url,
'/');
1380 size_t base_len = 0;
1382 if (!p) p = strrchr(master_url,
'\\');
1385 base_len = p - master_url;
1394 return media_url + base_len + 1;
1423 int ret, bandwidth, avg_bandwidth;
1424 const char *m3u8_rel_name =
NULL;
1425 const char *vtt_m3u8_rel_name =
NULL;
1426 const char *ccgroup;
1427 const char *sgroup =
NULL;
1430 int is_file_proto = proto && !strcmp(proto,
"file");
1478 if (!m3u8_rel_name) {
1496 if (!m3u8_rel_name) {
1510 if (!vid_st && !aud_st) {
1543 bandwidth += bandwidth / 10;
1561 if (vid_st && vs->
sgroup) {
1564 if (!vtt_m3u8_rel_name) {
1597 int target_duration = 0;
1603 int is_file_proto = proto && !strcmp(proto,
"file");
1605 static unsigned warned_non_file;
1606 char *key_uri =
NULL;
1607 char *iv_string =
NULL;
1618 if (byterange_mode) {
1636 av_log(
s,
AV_LOG_ERROR,
"Cannot use rename on non file protocol, this may lead to races and temporary partial files\n");
1639 snprintf(temp_filename,
sizeof(temp_filename), use_temp_file ?
"%s.tmp" :
"%s", vs->
m3u8_name);
1647 if (target_duration <= en->
duration)
1696 snprintf(temp_vtt_filename,
sizeof(temp_vtt_filename), use_temp_file ?
"%s.tmp" :
"%s", vs->
vtt_m3u8_name);
1725 if (use_temp_file) {
1743 const char *proto =
NULL;
1744 int use_temp_file = 0;
1745 char iv_string[
KEYSIZE*2 + 1];
1759 }
else if (
c->max_seg_size > 0) {
1760 char *filename =
NULL;
1769 if (
c->use_localtime) {
1771 char *expanded =
NULL;
1785 if (
c->use_localtime_mkdir) {
1791 if (
ff_mkdir_p(dir) == -1 && errno != EEXIST) {
1792 av_log(oc,
AV_LOG_ERROR,
"Could not create directory %s with use_localtime_mkdir\n", dir);
1799 char *filename =
NULL;
1809 char *filename =
NULL;
1821 use_temp_file = proto && !strcmp(proto,
"file") && (
c->flags &
HLS_TEMP_FILE);
1823 if (use_temp_file) {
1830 if (
c->key_info_file ||
c->encrypt) {
1836 if (
c->key_info_file &&
c->encrypt) {
1838 " ignoring -hls_enc\n");
1842 if (
c->key_info_file) {
1846 if (!
c->encrypt_started) {
1849 c->encrypt_started = 1;
1861 memcpy(vs->
iv_string, iv_string,
sizeof(iv_string));
1869 if (
c->key_info_file ||
c->encrypt) {
1886 if (
c->ignore_io_errors)
1892 if (
c->ignore_io_errors)
1902 if (
c->ignore_io_errors)
1925 #if HAVE_LIBC_MSVCRT
1928 int strftime_s_supported = 0;
1931 time_t t = time(
NULL);
1934 int strftime_s_supported = strftime(
b,
sizeof(
b),
"%s", p) && strcmp(
b,
"%s");
1938 return strftime_s_supported ?
"-%s.m4s" :
"-%Y%m%d%H%M%S.m4s";
1940 return strftime_s_supported ?
"-%s.ts" :
"-%Y%m%d%H%M%S.ts";
1946 char extension[10] = {
'\0'};
1948 p = strrchr(
name,
'.');
1956 if (strlen(extension))
1964 const char *filename, *subdir_name;
1965 char *fn_dup =
NULL;
1979 "either in the filename or in the sub-directory name of file %s\n",
fn);
1986 "in the sub-directory name of file %s, but only in one of them\n",
fn);
1998 const char *proto, *dir;
1999 char *orig_buf_dup =
NULL, *mod_buf_dup =
NULL;
2027 if (
av_stristr(dir,
"%v") && proto && !strcmp(proto,
"file")) {
2030 if (
ff_mkdir_p(dir) == -1 && errno != EEXIST) {
2046 unsigned int stream_index, cnt;
2047 if (stream_id < 0 || stream_id >
s->nb_streams - 1)
2050 for (stream_index = 0; stream_index <
s->nb_streams; stream_index++) {
2051 if (
s->streams[stream_index]->codecpar->codec_type !=
codec_type)
2053 if (cnt == stream_id)
2054 return stream_index;
2064 int stream_index,
i, j;
2067 char *p, *q, *saveptr1, *saveptr2, *varstr, *keyval;
2090 while (
av_strtok(q,
" \t", &saveptr1)) {
2103 while (varstr =
av_strtok(p,
" \t", &saveptr1)) {
2106 if (nb_varstreams < hls->nb_varstreams) {
2129 while (keyval =
av_strtok(varstr,
",", &saveptr2)) {
2168 num = strtoll(
val, &end, 10);
2175 if (stream_index >= 0 && nb_streams < vs->
nb_streams) {
2177 if (vs->
streams[
i] ==
s->streams[stream_index]) {
2179 "variant definition #%d\n", nb_varstreams - 1);
2183 for (j = 0; nb_varstreams > 1 && j < nb_varstreams - 1; j++) {
2187 "in two different variant definitions #%d and #%d\n",
2188 j, nb_varstreams - 1);
2209 int nb_ccstreams = 0;
2210 char *p, *q, *ccstr, *keyval;
2211 char *saveptr1 =
NULL, *saveptr2 =
NULL;
2220 while (
av_strtok(q,
" \t", &saveptr1)) {
2233 while (ccstr =
av_strtok(p,
" \t", &saveptr1)) {
2236 if (nb_ccstreams < hls->nb_ccstreams)
2241 while (keyval =
av_strtok(ccstr,
",", &saveptr2)) {
2262 if (atoi(
val) < 1 || atoi(
val) > 4) {
2268 if (atoi(
val) < 1 || atoi(
val) > 63) {
2315 for (
i = 0;
i <
s->nb_streams;
i++)
2346 if (dir && strcmp(dir,
"."))
2370 int subtitle_streams = 0;
2385 "(%"PRId64
" > %"PRId64
"), the result maybe not be what you want.",
2391 inner_st = vs->
avf->
streams[j - subtitle_streams];
2446 char *filename =
NULL;
2460 if (read_byte > 0) {
2462 total_size += read_byte;
2465 }
while (read_byte > 0);
2480 int stream_index = 0;
2481 int range_length = 0;
2482 const char *proto =
NULL;
2483 int use_temp_file = 0;
2485 char *old_filename =
NULL;
2488 int subtitle_streams = 0;
2500 stream_index = j - subtitle_streams;
2522 end_pts = init_list_dur + after_init_list_dur ;
2555 av_log(
s,
AV_LOG_WARNING,
"Stream %d packet with pts %" PRId64
" has duration 0. The segment duration may not be precise.\n",
2567 double cur_duration;
2576 if (range_length <= 0)
2585 if (!byterange_mode) {
2590 if (!byterange_mode) {
2602 vs->
size = range_length;
2608 use_temp_file = proto && !strcmp(proto,
"file")
2614 char *filename =
NULL;
2636 "Failed to open file '%s'\n", filename);
2650 vs->
size = range_length;
2654 " will retry with a new http session.\n");
2675 if (!old_filename) {
2794 char *old_filename =
NULL;
2795 const char *proto =
NULL;
2796 int use_temp_file = 0;
2801 int range_length, byterange_mode;
2804 char *filename =
NULL;
2811 if (!old_filename) {
2828 int range_length = 0;
2841 if (!byterange_mode) {
2861 vs->
size = range_length;
2898 if (!old_filename) {
2935 const char *pattern;
2941 double initial_program_date_time =
av_gettime() / 1000000.0;
2960 if (!hls->
method && http_base_proto) {
2998 time_t t = time(
NULL);
3005 struct tm *p, tmbuf;
3008 if (!strftime(
b,
sizeof(
b),
"%Y%m%d%H%M%S", p))
3021 "'split_by_time' and 'independent_segments' cannot be "
3022 "enabled together. Disabling 'independent_segments' flag\n");
3087 fmp4_init_filename_len);
3102 char *expanded =
NULL;
3166 " hls_init_time value will have no effect\n");
3180 #define OFFSET(x) offsetof(HLSContext, x)
3181 #define E AV_OPT_FLAG_ENCODING_PARAM
3186 {
"hls_list_size",
"set maximum number of playlist entries",
OFFSET(max_nb_segments),
AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX,
E},
3187 {
"hls_delete_threshold",
"set number of unreferenced segments to keep before deleting",
OFFSET(hls_delete_threshold),
AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX,
E},
3188 {
"hls_vtt_options",
"set hls vtt list of options for the container format used for hls",
OFFSET(vtt_format_options_str),
AV_OPT_TYPE_STRING, {.str =
NULL}, 0, 0,
E},
3189 {
"hls_allow_cache",
"explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments",
OFFSET(allowcache),
AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX,
E},
3192 {
"hls_segment_options",
"set segments files format options of hls",
OFFSET(format_options),
AV_OPT_TYPE_DICT, {.str =
NULL}, 0, 0,
E},
3193 {
"hls_segment_size",
"maximum size per segment file, (in bytes)",
OFFSET(max_seg_size),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E},
3203 {
"hls_fmp4_init_filename",
"set fragment mp4 file init filename",
OFFSET(fmp4_init_filename),
AV_OPT_TYPE_STRING, {.str =
"init.mp4"}, 0, 0,
E},
3204 {
"hls_fmp4_init_resend",
"resend fragment mp4 init file after refresh m3u8 every time",
OFFSET(resend_init_file),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3205 {
"hls_flags",
"set flags affecting HLS playlist and media file generation",
OFFSET(
flags),
AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX,
E, .unit =
"flags"},
3207 {
"temp_file",
"write segment and playlist to temporary file and rename when complete", 0,
AV_OPT_TYPE_CONST, {.i64 =
HLS_TEMP_FILE }, 0, UINT_MAX,
E, .unit =
"flags"},
3219 {
"independent_segments",
"add EXT-X-INDEPENDENT-SEGMENTS, whenever applicable", 0,
AV_OPT_TYPE_CONST, { .i64 =
HLS_INDEPENDENT_SEGMENTS }, 0, UINT_MAX,
E, .unit =
"flags"},
3220 {
"iframes_only",
"add EXT-X-I-FRAMES-ONLY, whenever applicable", 0,
AV_OPT_TYPE_CONST, { .i64 =
HLS_I_FRAMES_ONLY }, 0, UINT_MAX,
E, .unit =
"flags"},
3221 {
"strftime",
"set filename expansion with strftime at segment creation",
OFFSET(use_localtime),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3222 {
"strftime_mkdir",
"create last directory component in strftime-generated filename",
OFFSET(use_localtime_mkdir),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3236 {
"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},
3237 {
"http_persistent",
"Use persistent HTTP connections",
OFFSET(http_persistent),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3238 {
"timeout",
"set timeout for socket I/O operations",
OFFSET(timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags =
E },
3239 {
"ignore_io_errors",
"Ignore IO errors for stable long-duration runs with network output",
OFFSET(ignore_io_errors),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
E },
3255 .p.extensions =
"m3u8",
3259 #if FF_API_ALLOW_FLUSH
int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen)
Same as ff_get_line but strip the white-space characters in the text tail.
AVFormatContext * vtt_avf
static int hls_write_header(AVFormatContext *s)
enum AVCodecID av_codec_get_id(const struct AVCodecTag *const *tags, unsigned int tag)
Get the AVCodecID for the given codec tag tag.
int ffio_open_whitelist(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_BPRINT_SIZE_UNLIMITED
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
static const char * get_relative_url(const char *master_url, const char *media_url)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
static HLSSegment * find_segment_by_filename(HLSSegment *segment, const char *filename)
static int append_postfix(char *name, int name_buf_len, int i)
static int sls_flag_use_localtime_filename(AVFormatContext *oc, HLSContext *c, VariantStream *vs)
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static int strftime_expand(const char *fmt, char **dest)
enum AVMediaType codec_type
General type of the encoded data.
int resend_init_file
resend init file into disk after refresh m3u8
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
char key_file[LINE_BUFFER_SIZE+1]
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
void ff_hls_write_end_list(AVIOContext *out)
static int hls_init_file_resend(AVFormatContext *s, VariantStream *vs)
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
char filename[MAX_URL_SIZE]
#define AVERROR_EOF
End of file.
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
char key_uri[LINE_BUFFER_SIZE+1]
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
char * av_asprintf(const char *fmt,...)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static void write_styp(AVIOContext *pb)
AVStream ** streams
A list of all streams in the file.
static void deinit(AVFormatContext *s)
static int create_master_playlist(AVFormatContext *s, VariantStream *const input_vs, int final)
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
@ HLS_SECOND_LEVEL_SEGMENT_INDEX
int strict_std_compliance
Allow non-standard and experimental extension.
#define HLS_MICROSECOND_UNIT
@ HLS_START_SEQUENCE_AS_MICROSECONDS_SINCE_EPOCH
@ HLS_INDEPENDENT_SEGMENTS
char iv_string[KEYSIZE *2+1]
@ AV_OPT_TYPE_DURATION
Underlying C type is int64_t.
#define AV_DICT_APPEND
If the entry already exists, append to it.
#define AV_LOG_VERBOSE
Detailed information.
unsigned int nb_ccstreams
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
av_warn_unused_result int avformat_init_output(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and initialize the codec, but do not write the header.
static int extract_segment_number(const char *filename)
static int hls_write_trailer(struct AVFormatContext *s)
static int get_nth_codec_stream_index(AVFormatContext *s, enum AVMediaType codec_type, int64_t stream_id)
int nb_channels
Number of channels in this layout.
enum AVMediaType codec_type
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int update_variant_stream_info(AVFormatContext *s)
const char * av_basename(const char *path)
Thread safe basename.
static int sls_flag_check_duration_size(HLSContext *hls, VariantStream *vs)
char * av_append_path_component(const char *path, const char *component)
Append path component to the existing path.
char key_file[LINE_BUFFER_SIZE+1]
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
static int do_encrypt(AVFormatContext *s, VariantStream *vs)
int use_localtime
flag to expand filename with localtime
void ff_hls_write_playlist_header(AVIOContext *out, int version, int allowcache, int target_duration, int64_t sequence, uint32_t playlist_type, int iframe_mode)
const FFOutputFormat ff_hls_muxer
static int sls_flags_filename_process(struct AVFormatContext *s, HLSContext *hls, VariantStream *vs, HLSSegment *en, double duration, int64_t pos, int64_t size)
static int hls_start(AVFormatContext *s, VariantStream *vs)
static int hls_delete_file(HLSContext *hls, AVFormatContext *avf, char *path, const char *proto)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static double val(void *priv, double ch)
const AVOutputFormat * oformat
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
int ff_rename(const char *url_src, const char *url_dst, void *logctx)
Wrap ffurl_move() and log if error happens.
const char * av_dirname(char *path)
Thread safe dirname.
static void sls_flag_file_rename(HLSContext *hls, VariantStream *vs, char *old_filename)
int use_localtime_mkdir
flag to mkdir dirname in timebased filename
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
static int64_t get_stream_bit_rate(AVStream *stream)
#define AV_PROFILE_UNKNOWN
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
static int validate_name(int nb_vs, const char *fn)
static void set_http_options(AVFormatContext *s, AVDictionary **options, HLSContext *c)
@ CODEC_ATTRIBUTE_WRITTEN
const AVOutputFormat * vtt_oformat
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
static int flush_dynbuf(VariantStream *vs, int *range_length)
static void hls_deinit(AVFormatContext *s)
@ HLS_SECOND_LEVEL_SEGMENT_SIZE
@ AV_OPT_TYPE_INT64
Underlying C type is int64_t.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AVIO_FLAG_WRITE
write-only
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int av_stristart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str independent of case.
char key_string[KEYSIZE *2+1]
int nb_coded_side_data
Amount of entries in coded_side_data.
This structure describes the bitrate properties of an encoded bitstream.
av_warn_unused_result int avformat_write_header(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and write the stream header to an output media file.
CodecAttributeStatus attr_status
int reference_stream_index
char * base_output_dirname
static void write_codec_attr(AVStream *st, VariantStream *vs)
int ff_http_do_new_request(URLContext *h, const char *uri)
Send a new HTTP request, reusing the old connection.
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
int64_t video_keyframe_pos
void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup, const char *filename, const char *language, const char *sname, int name_id, int is_default)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
static int replace_str_data_in_filename(char **s, const char *filename, char placeholder, const char *datastring)
Describe the class of an AVClass context structure.
static void reflush_dynbuf(VariantStream *vs, int *range_length)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int write_trailer(AVFormatContext *s1)
const char * subtitle_varname
char sub_filename[MAX_URL_SIZE]
uint8_t * ff_nal_unit_extract_rbsp(const uint8_t *src, uint32_t src_len, uint32_t *dst_len, int header_len)
char iv_string[KEYSIZE *2+1]
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without period
char key_uri[LINE_BUFFER_SIZE+1]
char * vtt_format_options_str
AVIOContext * http_delete
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
const char * av_default_item_name(void *ptr)
Return the context name.
int ffurl_shutdown(URLContext *h, int flags)
Signal the URLContext that we are done reading or writing the stream.
AVIOContext * pb
I/O context.
@ HLS_START_SEQUENCE_LAST
static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, const char *filename, AVDictionary **options)
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
AVDictionary * vtt_format_options
AVChannelLayout ch_layout
Audio only.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
@ HLS_START_SEQUENCE_AS_START_NUMBER
HLSSegment * old_segments
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
int extradata_size
Size of the extradata content in bytes.
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
double initial_prog_date_time
static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, VariantStream *vs, double duration, int64_t pos, int64_t size)
void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth, int avg_bandwidth, const char *filename, const char *agroup, const char *codecs, const char *ccgroup, const char *sgroup)
ClosedCaptionsStream * cc_streams
void ff_hls_write_playlist_version(AVIOContext *out, int version)
int(* init)(AVBSFContext *ctx)
static int hls_rename_temp_file(AVFormatContext *s, AVFormatContext *oc)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
unsigned int av_codec_get_tag(const struct AVCodecTag *const *tags, enum AVCodecID id)
Get the codec tag for the given codec id id.
#define FF_OFMT_FLAG_ALLOW_FLUSH
This flag indicates that the muxer stores data internally and supports flushing it.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
uint32_t start_sequence_source_type
char * url
input or output URL.
#define AV_NOPTS_VALUE
Undefined timestamp value.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
int profile
Codec-specific bitstream restrictions that the stream conforms to.
@ CODEC_ATTRIBUTE_WILL_NOT_BE_WRITTEN
void ff_hls_write_init_file(AVIOContext *out, const char *filename, int byterange_mode, int64_t size, int64_t pos)
double discont_program_date_time
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
static int parse_variant_stream_mapstring(AVFormatContext *s)
static int hls_init(AVFormatContext *s)
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void avio_wb32(AVIOContext *s, unsigned int val)
static av_const int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
int flags
A combination of AV_PKT_FLAG values.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
AVDictionary * format_options
int64_t video_keyframe_size
@ HLS_START_SEQUENCE_AS_FORMATTED_DATETIME
static int parse_playlist(AVFormatContext *s, const char *url, VariantStream *vs)
static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
HLSSegment * last_segment
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
void ff_hls_write_audio_rendition(AVIOContext *out, const char *agroup, const char *filename, const char *language, int name_id, int is_default, int nb_channels)
char iv_string[KEYSIZE *2+1]
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static av_always_inline av_const double round(double x)
#define AVERROR_MUXER_NOT_FOUND
Muxer not found.
char key_string[KEYSIZE *2+1]
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
AVIOContext * sub_m3u8_out
static int hls_encryption_start(AVFormatContext *s, VariantStream *vs)
static const AVOption options[]
static int hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename)
int av_random_bytes(uint8_t *buf, size_t len)
Generate cryptographically secure random data, i.e.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
static const uint8_t start_sequence[]
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
char * fmp4_init_filename
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
int id
Format-specific stream ID.
AVIOContext * out_single_file
int ff_hls_write_file_entry(AVIOContext *out, int insert_discont, int byterange_mode, double duration, int round_duration, int64_t size, int64_t pos, const char *baseurl, const char *filename, double *prog_date_time, int64_t video_keyframe_size, int64_t video_keyframe_pos, int iframe_mode)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
char * fmp4_init_filename
const struct AVOutputFormat * oformat
The output container format.
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
static int replace_int_data_in_filename(char **s, const char *filename, char placeholder, int64_t number)
static int hls_delete_old_segments(AVFormatContext *s, HLSContext *hls, VariantStream *vs)
void av_bprintf(AVBPrint *buf, const char *fmt,...)
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
char current_segment_final_filename_fmt[MAX_URL_SIZE]
int index
stream index in AVFormatContext
static void can_split(const VVCLocalContext *lc, int x0, int y0, int cb_width, int cb_height, int mtt_depth, int depth_offset, int part_idx, VVCSplitMode last_split_mode, VVCTreeType tree_type, VVCModeType mode_type, VVCAllowedSplit *split)
static int format_name(const char *buf, char **s, int index, const char *varname)
static const char * get_default_pattern_localtime_fmt(AVFormatContext *s)
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
@ AV_OPT_TYPE_INT
Underlying C type is int.
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test note that you must have installed it fate list List all fate regression test targets install Install headers
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int update_master_pl_info(AVFormatContext *s)
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
static int sls_flag_check_duration_size_index(HLSContext *hls)
int64_t av_gettime(void)
Get the current time in microseconds.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
#define AVIO_FLAG_READ
read-only
char * av_strdup(const char *s)
Duplicate a string.
const AVOutputFormat * av_guess_format(const char *short_name, const char *filename, const char *mime_type)
Return the output format in the list of registered output formats which best matches the provided par...
unsigned int nb_varstreams
VariantStream * var_streams
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
static void hls_free_segments(HLSSegment *p)
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
static int hls_mux_init(AVFormatContext *s, VariantStream *vs)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
int(* io_close2)(struct AVFormatContext *s, AVIOContext *pb)
A callback for closing the streams opened with AVFormatContext.io_open().
static int64_t append_single_file(AVFormatContext *s, VariantStream *vs)
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
#define flags(name, subs,...)
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
static int hls_window(AVFormatContext *s, int last, VariantStream *vs)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define MKTAG(a, b, c, d)
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
static void write_header(FFV1Context *f)
char key_uri[LINE_BUFFER_SIZE+1]
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
int pts_wrap_bits
Number of bits in timestamps.
@ HLS_SECOND_LEVEL_SEGMENT_DURATION
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
void * priv_data
Format private data.
static int parse_cc_stream_mapstring(AVFormatContext *s)
unsigned int master_publish_rate
@ HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
#define av_fourcc2str(fourcc)
static const AVClass hls_class
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.