Go to the documentation of this file.
33 #include <openssl/rand.h>
48 #if CONFIG_HTTP_PROTOCOL
67 #define LINE_BUFFER_SIZE MAX_URL_SIZE
68 #define HLS_MICROSECOND_UNIT 1000000
69 #define POSTFIX_PATTERN "_%d"
252 #if CONFIG_HTTP_PROTOCOL
272 #if CONFIG_HTTP_PROTOCOL
288 }
else if (http_base_proto) {
294 if (
c->http_persistent)
320 snprintf(attr,
sizeof(attr),
"mp4a.40.33");
322 snprintf(attr,
sizeof(attr),
"mp4a.40.34");
325 snprintf(attr,
sizeof(attr),
"mp4a.40.2");
327 snprintf(attr,
sizeof(attr),
"ac-3");
329 snprintf(attr,
sizeof(attr),
"ec-3");
337 "%s%s", codec_strlen ?
"," :
"", attr);
363 if (
c ==
'%' && *(p+1) ==
'%')
365 else if (
c ==
'%' && *(p+1) == placeholder) {
373 if (addchar_count > 0) {
393 int nd, addchar_count;
404 if (
c ==
'%' && *(p+1) ==
'%')
406 else if (
c ==
'%' && (
av_isdigit(*(p+1)) || *(p+1) == placeholder)) {
410 nd = nd * 10 + *(p + addchar_count) -
'0';
414 if (*(p + addchar_count) == placeholder) {
415 av_bprintf(&
buf,
"%0*"PRId64, (number < 0) ? nd : nd++, number);
416 p += (addchar_count + 1);
474 float playlist_duration = 0.0f;
475 int ret = 0, path_size, sub_path_size;
477 char *dirname =
NULL, *p, *sub_path;
479 char *vtt_dirname =
NULL;
482 const char *proto =
NULL;
497 if (playlist_duration <= -previous_segment->
duration) {
525 char * r_dirname = dirname;
568 }
else if (unlink(path) < 0) {
570 path, strerror(errno));
573 if ((
segment->sub_filename[0] !=
'\0')) {
581 sub_path_size = strlen(
segment->sub_filename) + 1 + strlen(vtt_dirname);
588 av_strlcpy(sub_path, vtt_dirname, sub_path_size);
600 }
else if (unlink(sub_path) < 0) {
602 sub_path, strerror(errno));
623 gcry_randomize(
buf,
len, GCRY_VERY_STRONG_RANDOM);
642 len = strlen(
s->url) + 4 + 1;
665 memcpy(iv, hls->
iv,
sizeof(iv));
821 av_log(
s,
AV_LOG_WARNING,
"http persistent mode is currently unsupported for fragment mp4 in the HLS muxer.\n");
834 if (byterange_mode) {
894 char *filename =
NULL;
897 "Invalid second level segment filename template '%s', "
898 "you can try to remove second_level_segment_size flag\n",
907 char *filename =
NULL;
911 "Invalid second level segment filename template '%s', "
912 "you can try to remove second_level_segment_time flag\n",
930 "second_level_segment_duration hls_flag requires strftime to be true\n");
935 "second_level_segment_size hls_flag requires strfime to be true\n");
940 "second_level_segment_index hls_flag requires strftime to be true\n");
950 int segment_renaming_ok = proto && !strcmp(proto,
"file");
955 "second_level_segment_duration hls_flag works only with file protocol segment names\n");
960 "second_level_segment_size hls_flag works only with file protocol segment names\n");
977 char *filename =
NULL;
985 "you can try to remove second_level_segment_index flag\n",
996 char *filename =
NULL;
999 "you can try to remove second_level_segment_size flag\n",
1007 char *filename =
NULL;
1010 "you can try to remove second_level_segment_time flag\n",
1027 const char *filename;
1046 && !byterange_mode) {
1116 int ret = 0, is_segment = 0;
1117 int64_t new_start_pos;
1123 &
s->interrupt_callback,
NULL,
1124 s->protocol_whitelist,
s->protocol_blacklist)) < 0)
1128 if (strcmp(
line,
"#EXTM3U")) {
1137 int64_t tmp_sequence = strtoll(ptr,
NULL, 10);
1138 if (tmp_sequence < vs->sequence)
1140 "Found playlist sequence number was smaller """
1141 "than specified start sequence number: %"PRId64
" < %"PRId64
", "
1144 av_log(hls,
AV_LOG_DEBUG,
"Found playlist sequence number: %"PRId64
"\n", tmp_sequence);
1156 ptr += strlen(
"URI=\"");
1167 ptr += strlen(
"IV=0x");
1178 }
else if (
line[0]) {
1215 size_t len = strlen(oc->
url);
1219 if (!final_filename)
1221 final_filename[
len-4] =
'\0';
1229 char *rel_url,
int rel_url_buf_size)
1233 p = strrchr(master_url,
'/') ? strrchr(master_url,
'/') :\
1234 strrchr(master_url,
'\\');
1236 base_len =
FFABS(p - master_url);
1242 av_strlcpy(rel_url, &(media_url[base_len + 1]), rel_url_buf_size);
1269 int m3u8_name_size,
ret, bandwidth;
1270 char *m3u8_rel_name =
NULL, *ccgroup;
1273 int is_file_proto = proto && !strcmp(proto,
"file");
1319 m3u8_name_size = strlen(vs->
m3u8_name) + 1;
1320 m3u8_rel_name =
av_malloc(m3u8_name_size);
1321 if (!m3u8_rel_name) {
1327 m3u8_rel_name, m3u8_name_size);
1342 m3u8_name_size = strlen(vs->
m3u8_name) + 1;
1343 m3u8_rel_name =
av_malloc(m3u8_name_size);
1344 if (!m3u8_rel_name) {
1350 m3u8_rel_name, m3u8_name_size);
1365 if (!vid_st && !aud_st) {
1394 bandwidth += bandwidth / 10;
1439 int target_duration = 0;
1445 int is_file_proto = proto && !strcmp(proto,
"file");
1447 static unsigned warned_non_file;
1448 char *key_uri =
NULL;
1449 char *iv_string =
NULL;
1456 if (byterange_mode) {
1470 av_log(
s,
AV_LOG_ERROR,
"Cannot use rename on non file protocol, this may lead to races and temporary partial files\n");
1473 snprintf(temp_filename,
sizeof(temp_filename), use_temp_file ?
"%s.tmp" :
"%s", vs->
m3u8_name);
1481 if (target_duration <= en->
duration)
1525 snprintf(temp_vtt_filename,
sizeof(temp_vtt_filename), use_temp_file ?
"%s.tmp" :
"%s", vs->
vtt_m3u8_name);
1551 if (use_temp_file) {
1569 const char *proto =
NULL;
1570 int use_temp_file = 0;
1571 char *filename, iv_string[
KEYSIZE*2 + 1];
1585 }
else if (
c->max_seg_size > 0) {
1586 char *filename =
NULL;
1599 if (
c->use_localtime) {
1601 struct tm *tm, tmpbuf;
1609 if (!strftime(oc->
url, bufsize, vs->
basename, tm)) {
1619 if (
c->use_localtime_mkdir) {
1626 if (
ff_mkdir_p(dir) == -1 && errno != EEXIST) {
1627 av_log(oc,
AV_LOG_ERROR,
"Could not create directory %s with use_localtime_mkdir\n", dir);
1634 char *filename =
NULL;
1648 char *filename =
NULL;
1667 use_temp_file = proto && !strcmp(proto,
"file") && (
c->flags &
HLS_TEMP_FILE);
1669 if (use_temp_file) {
1676 if (
c->key_info_file ||
c->encrypt) {
1682 if (
c->key_info_file &&
c->encrypt) {
1684 " ignoring -hls_enc\n");
1688 if (
c->key_info_file) {
1695 c->encrypt_started = 1;
1700 err =
av_strlcpy(iv_string,
c->iv_string,
sizeof(iv_string));
1718 if (
c->ignore_io_errors)
1726 if (
c->ignore_io_errors)
1762 time_t t = time(
NULL);
1763 struct tm *p, tmbuf;
1770 return (HAVE_LIBC_MSVCRT || !strftime(
b,
sizeof(
b),
"%s", p) || !strcmp(
b,
"%s")) ?
"-%Y%m%d%H%M%S.m4s" :
"-%s.m4s";
1772 return (HAVE_LIBC_MSVCRT || !strftime(
b,
sizeof(
b),
"%s", p) || !strcmp(
b,
"%s")) ?
"-%Y%m%d%H%M%S.ts" :
"-%s.ts";
1778 char extension[10] = {
'\0'};
1780 p = strrchr(
name,
'.');
1788 if (strlen(extension))
1796 const char *filename, *subdir_name;
1797 char *fn_dup =
NULL;
1816 "either in the filename or in the sub-directory name of file %s\n",
fn);
1823 "in the sub-directory name of file %s, but only in one of them\n",
fn);
1835 const char *proto, *dir;
1836 char *orig_buf_dup =
NULL, *mod_buf_dup =
NULL;
1840 if (!orig_buf_dup) {
1866 if (
av_stristr(dir,
"%v") && proto && !strcmp(proto,
"file")) {
1874 if (
ff_mkdir_p(dir) == -1 && errno != EEXIST) {
1890 unsigned int stream_index, cnt;
1891 if (stream_id < 0 || stream_id >
s->nb_streams - 1)
1894 for (stream_index = 0; stream_index <
s->nb_streams; stream_index++) {
1895 if (
s->streams[stream_index]->codecpar->codec_type !=
codec_type)
1897 if (cnt == stream_id)
1898 return stream_index;
1908 int stream_index,
i, j;
1911 char *p, *q, *saveptr1, *saveptr2, *varstr, *keyval;
1942 while (varstr =
av_strtok(p,
" \t", &saveptr1)) {
1945 if (nb_varstreams < hls->nb_varstreams) {
1954 while (q < varstr + strlen(varstr)) {
1965 while (keyval =
av_strtok(varstr,
",", &saveptr2)) {
2009 if (stream_index >= 0 && nb_streams < vs->
nb_streams) {
2011 if (vs->
streams[
i] ==
s->streams[stream_index]) {
2013 "variant definition #%d\n", nb_varstreams - 1);
2017 for(j = 0; nb_varstreams > 1 && j < nb_varstreams - 1; j++) {
2021 "in two different variant definitions #%d and #%d\n",
2022 j, nb_varstreams - 1);
2044 char *p, *q, *ccstr, *keyval;
2045 char *saveptr1 =
NULL, *saveptr2 =
NULL;
2063 while (ccstr =
av_strtok(p,
" \t", &saveptr1)) {
2066 if (nb_ccstreams < hls->nb_ccstreams)
2071 while (keyval =
av_strtok(ccstr,
",", &saveptr2)) {
2098 if(atoi(
val) < 1 || atoi(
val) > 4) {
2104 if(atoi(
val) < 1 || atoi(
val) > 63) {
2154 for (
i = 0;
i <
s->nb_streams;
i++)
2187 if (dir && strcmp(dir,
"."))
2225 "(%"PRId64
" > %"PRId64
"), the result maybe not be what you want.",
2264 int64_t end_pts = 0;
2266 int ret = 0, can_split = 1,
i, j;
2267 int stream_index = 0;
2268 int range_length = 0;
2269 const char *proto =
NULL;
2270 int use_temp_file = 0;
2274 char *old_filename =
NULL;
2307 end_pts = init_list_dur + after_init_list_dur ;
2320 is_ref_pkt = can_split = 0;
2343 int64_t new_start_pos;
2354 vs->
size = new_start_pos;
2367 if (!byterange_mode) {
2373 if (!byterange_mode) {
2377 if (!byterange_mode) {
2389 if (use_temp_file) {
2401 vs->
size = range_length;
2407 "Failed to open file '%s'\n", vs->
avf->
url);
2424 if (!old_filename) {
2527 char *old_filename =
NULL;
2528 const char *proto =
NULL;
2529 int use_temp_file = 0;
2542 if (!old_filename) {
2546 int range_length = 0;
2549 int range_length, byterange_mode;
2561 if (!byterange_mode) {
2578 vs->
size = range_length;
2602 if (!old_filename) {
2652 const char *pattern =
"%d.ts";
2654 int basename_size = 0;
2656 const char *vtt_pattern =
"%d.vtt";
2658 int vtt_basename_size = 0;
2672 av_log(
s,
AV_LOG_ERROR,
"Periodic re-key not supported when more than one variant streams are present\n");
2712 time_t t = time(
NULL);
2717 struct tm *p, tmbuf;
2720 if (!strftime(
b,
sizeof(
b),
"%Y%m%d%H%M%S", p))
2744 "'split_by_time' and 'independent_segments' cannot be enabled together. "
2745 "Disabling 'independent_segments' flag\n");
2795 basename_size = strlen(vs->
basename) + 1;
2806 basename_size = strlen(vs->
m3u8_name) + strlen(pattern_localtime_fmt) + 1;
2808 basename_size = strlen(vs->
m3u8_name) + strlen(pattern) + 1;
2845 fmp4_init_filename_len);
2857 fmp4_init_filename_len = strlen(vs->
m3u8_name) +
2867 fmp4_init_filename_len);
2872 fmp4_init_filename_len);
2875 fmp4_init_filename_len);
2894 vtt_pattern =
".vtt";
2895 vtt_basename_size = strlen(vs->
m3u8_name) + strlen(vtt_pattern) + 1;
2940 " hls_init_time value will have no effect\n");
2985 #define OFFSET(x) offsetof(HLSContext, x)
2986 #define E AV_OPT_FLAG_ENCODING_PARAM
2990 {
"hls_init_time",
"set segment length in seconds at init list",
OFFSET(init_time),
AV_OPT_TYPE_FLOAT, {.dbl = 0}, 0, FLT_MAX,
E},
2991 {
"hls_list_size",
"set maximum number of playlist entries",
OFFSET(max_nb_segments),
AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX,
E},
2992 {
"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},
2993 {
"hls_ts_options",
"set hls mpegts list of options for the container format used for hls",
OFFSET(format_options_str),
AV_OPT_TYPE_STRING, {.str =
NULL}, 0, 0,
E},
2994 {
"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},
2996 {
"hls_wrap",
"set number after which the index wraps (will be deprecated)",
OFFSET(
wrap),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E},
2998 {
"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},
3001 {
"hls_segment_size",
"maximum size per segment file, (in bytes)",
OFFSET(max_seg_size),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E},
3011 {
"hls_fmp4_init_filename",
"set fragment mp4 file init filename",
OFFSET(fmp4_init_filename),
AV_OPT_TYPE_STRING, {.str =
"init.mp4"}, 0, 0,
E},
3012 {
"hls_flags",
"set flags affecting HLS playlist and media file generation",
OFFSET(
flags),
AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX,
E,
"flags"},
3014 {
"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,
"flags"},
3026 {
"independent_segments",
"add EXT-X-INDEPENDENT-SEGMENTS, whenever applicable", 0,
AV_OPT_TYPE_CONST, { .i64 =
HLS_INDEPENDENT_SEGMENTS }, 0, UINT_MAX,
E,
"flags"},
3027 {
"iframes_only",
"add EXT-X-I-FRAMES-ONLY, whenever applicable", 0,
AV_OPT_TYPE_CONST, { .i64 =
HLS_I_FRAMES_ONLY }, 0, UINT_MAX,
E,
"flags"},
3028 #if FF_API_HLS_USE_LOCALTIME
3029 {
"use_localtime",
"set filename expansion with strftime at segment creation(will be deprecated )",
OFFSET(use_localtime),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3031 {
"strftime",
"set filename expansion with strftime at segment creation",
OFFSET(use_localtime),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3032 #if FF_API_HLS_USE_LOCALTIME
3033 {
"use_localtime_mkdir",
"create last directory component in strftime-generated filename(will be deprecated)",
OFFSET(use_localtime_mkdir),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3035 {
"strftime_mkdir",
"create last directory component in strftime-generated filename",
OFFSET(use_localtime_mkdir),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3048 {
"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},
3049 {
"http_persistent",
"Use persistent HTTP connections",
OFFSET(http_persistent),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
3050 {
"timeout",
"set timeout for socket I/O operations",
OFFSET(timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags =
E },
3051 {
"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 },
3067 .extensions =
"m3u8",
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.
#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 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 av_cold int init(AVCodecContext *avctx)
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
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
enum AVMediaType codec_type
General type of the encoded data.
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)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
char key_file[LINE_BUFFER_SIZE+1]
static void hls_free_variant_streams(struct HLSContext *hls)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
void ff_hls_write_end_list(AVIOContext *out)
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle.
char filename[MAX_URL_SIZE]
#define AVERROR_EOF
End of file.
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
#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)
static av_cold int end(AVCodecContext *avctx)
AVStream ** streams
A list of all streams in the file.
@ HLS_SECOND_LEVEL_SEGMENT_INDEX
#define HLS_MICROSECOND_UNIT
@ HLS_INDEPENDENT_SEGMENTS
#define AV_DICT_APPEND
If the entry already exists, append to it.
#define AV_LOG_VERBOSE
Detailed information.
int ffio_open_whitelist(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist)
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).
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
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.
AVOutputFormat ff_hls_muxer
static int hls_write_trailer(struct AVFormatContext *s)
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)
static void hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename)
char * av_append_path_component(const char *path, const char *component)
Append path component to the existing path.
ff_const59 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...
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)
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 av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
ff_const59 AVOutputFormat * vtt_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
void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, char *filename, char *language, int name_id, int is_default)
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)
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
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)
@ HLS_SECOND_LEVEL_SEGMENT_SIZE
#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.
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
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
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.
int64_t video_keyframe_pos
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.
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)
char sub_filename[MAX_URL_SIZE]
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
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.
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
ff_const59 AVOutputFormat * oformat
AVDictionary * vtt_format_options
static int randomize(uint8_t *buf, int len)
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
ff_const59 struct AVOutputFormat * oformat
The output container format.
@ HLS_START_SEQUENCE_AS_START_NUMBER
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
HLSSegment * old_segments
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)
ClosedCaptionsStream * cc_streams
void ff_hls_write_playlist_version(AVIOContext *out, int version)
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.
uint8_t * av_stream_get_side_data(const AVStream *stream, enum AVPacketSideDataType type, int *size)
Get side information from stream.
static int create_master_playlist(AVFormatContext *s, VariantStream *const input_vs)
uint32_t start_sequence_source_type
char * url
input or output URL.
#define AV_NOPTS_VALUE
Undefined timestamp value.
@ CODEC_ATTRIBUTE_WILL_NOT_BE_WRITTEN
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
const char const char void * val
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.
static int hls_encryption_start(AVFormatContext *s)
int max_bitrate
Maximum bitrate of the stream, in bits per second.
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
static int get_nth_codec_stream_index(AVFormatContext *s, enum AVMediaType codec_type, int stream_id)
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
@ 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)
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
HLSSegment * last_segment
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
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]
#define AV_TIME_BASE
Internal time base represented as integer.
AVIOContext * sub_m3u8_out
static const AVOption options[]
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_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.
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
static const uint8_t start_sequence[]
char * fmp4_init_filename
static int get_relative_url(const char *master_url, const char *media_url, char *rel_url, int rel_url_buf_size)
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
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,...)
char * format_options_str
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
char current_segment_final_filename_fmt[MAX_URL_SIZE]
int index
stream index in AVFormatContext
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
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, char *baseurl, char *filename, double *prog_date_time, int64_t video_keyframe_size, int64_t video_keyframe_pos, int iframe_mode)
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename, AVDictionary **options)
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)
void(* io_close)(struct AVFormatContext *s, AVIOContext *pb)
A callback for closing the streams opened with AVFormatContext.io_open().
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)
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.
unsigned int nb_varstreams
VariantStream * var_streams
int void avio_flush(AVIOContext *s)
Force flushing of buffered data.
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)
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.
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
#define flags(name, subs,...)
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.
static void write_header(FFV1Context *f)
char key_uri[LINE_BUFFER_SIZE+1]
int pts_wrap_bits
number of bits in pts (used for wrapping control)
@ HLS_SECOND_LEVEL_SEGMENT_DURATION
void * priv_data
Format private data.
void ff_hls_write_init_file(AVIOContext *out, char *filename, int byterange_mode, int64_t size, int64_t pos)
static int parse_cc_stream_mapstring(AVFormatContext *s)
URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
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.
void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth, char *filename, char *agroup, char *codecs, char *ccgroup)
static const AVClass hls_class
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.