Go to the documentation of this file.
66 #define SEGMENT_LIST_FLAG_CACHE 1
67 #define SEGMENT_LIST_FLAG_LIVE 2
131 int needs_quoting = !!str[strcspn(str,
"\",\n\r")];
136 for (; *str; str++) {
165 for (
i = 0;
i <
s->nb_streams;
i++) {
171 ipar =
s->streams[
i]->codecpar;
184 #if FF_API_LAVF_AVCTX
186 if (
s->streams[
i]->codecpar->codec_tag ==
MKTAG(
't',
'm',
'c',
'd'))
187 st->codec->
time_base =
s->streams[
i]->codec->time_base;
209 struct tm *tm, tmpbuf;
212 if (!strftime(
buf,
sizeof(
buf),
s->url, tm)) {
299 double max_duration = 0;
312 avio_printf(seg->
list_pb,
"#EXT-X-TARGETDURATION:%"PRId64
"\n", (int64_t)ceil(max_duration));
343 "Error writing list entry '%s' in list file\n", list_entry->
filename);
387 memcpy(entry, &seg->
cur_entry,
sizeof(*entry));
426 for (
i = 0;
i <
s->nb_streams;
i++) {
428 rate =
s->streams[
i]->avg_frame_rate;
431 av_log(
s,
AV_LOG_WARNING,
"Could not increment global timecode, error occurred during timecode creation.\n");
441 av_log(
s,
AV_LOG_WARNING,
"Could not increment global timecode, no global timecode metadata found.\n");
443 for (
i = 0;
i <
s->nb_streams;
i++) {
451 av_log(
s,
AV_LOG_WARNING,
"Could not increment stream %d timecode, error occurred during timecode creation.\n",
i);
467 static int parse_times(
void *log_ctx, int64_t **times,
int *nb_times,
468 const char *times_str)
473 char *saveptr =
NULL;
478 #define FAIL(err) ret = err; goto end
481 for (p = times_str1; *p; p++)
492 for (
i = 0;
i < *nb_times;
i++) {
494 char *tstr =
av_strtok(p,
",", &saveptr);
497 if (!tstr || !tstr[0]) {
506 "Invalid time duration specification '%s' in times list %s\n", tstr, times_str);
512 if (
i && (*times)[
i-1] > (*times)[
i]) {
514 "Specified time %f is greater than the following time %f\n",
515 (
float)((*times)[
i])/1000000, (
float)((*times)[
i-1])/1000000);
526 const char *frames_str)
530 char *frames_str1 =
av_strdup(frames_str);
531 char *saveptr =
NULL;
536 #define FAIL(err) ret = err; goto end
539 for (p = frames_str1; *p; p++)
550 for (
i = 0;
i < *nb_frames;
i++) {
553 char *fstr =
av_strtok(p,
",", &saveptr);
561 f = strtol(fstr, &tailptr, 10);
562 if (*tailptr || f <= 0 || f >= INT_MAX) {
564 "Invalid argument '%s', must be a positive integer <= INT64_MAX\n",
573 "Specified frame %d is greater than the following frame %d\n",
586 int buf_size = 32768;
613 static const enum AVMediaType type_priority_list[] = {
623 type_index_map[
i] = -1;
626 for (
i = 0;
i <
s->nb_streams;
i++) {
627 type =
s->streams[
i]->codecpar->codec_type;
631 type_index_map[
type] =
i;
635 type = type_priority_list[
i];
640 for (
i = 0;
i <
s->nb_streams;
i++) {
688 "you can use output_ts_offset instead of it\n");
693 "segment_time, segment_times, and segment_frames options "
694 "are mutually exclusive, select just one of them\n");
710 "Invalid time duration specification '%s' for segment_time option\n",
715 if (seg->
time <= 0) {
716 av_log(
s,
AV_LOG_ERROR,
"Invalid negative segment_time with segment_atclocktime option set\n");
745 seg->
use_rename = proto && !strcmp(proto,
"file");
776 if ((
ret =
s->io_open(
s, &oc->
pb,
794 "Some of the provided format options in '%s' are not recognized\n", seg->
format_options_str);
814 for (
i = 0;
i <
s->nb_streams;
i++) {
821 s->avoid_negative_ts = 1;
833 for (
i = 0;
i <
s->nb_streams;
i++) {
837 ipar =
s->streams[
i]->codecpar;
875 int64_t end_pts = INT64_MAX,
offset;
876 int start_frame = INT_MAX;
886 int pkt_extradata_size = 0;
888 if (pkt_extradata && pkt_extradata_size > 0) {
909 time_t sec = avgt / 1000000;
911 usecs = (int64_t)(ti.tm_hour * 3600 + ti.tm_min * 60 + ti.tm_sec) * 1000000 + (avgt % 1000000);
913 if (wrapped_val < seg->last_val && wrapped_val < seg->clocktime_wrap_duration)
921 ff_dlog(
s,
"packet stream:%d pts:%s pts_time:%s duration_time:%s is_key:%d frame:%d\n",
967 av_log(
s,
AV_LOG_DEBUG,
"stream:%d start_pts_time:%s pts:%s pts_time:%s dts:%s dts_time:%s",
1058 #define OFFSET(x) offsetof(SegmentContext, x)
1059 #define E AV_OPT_FLAG_ENCODING_PARAM
1061 {
"reference_stream",
"set reference stream",
OFFSET(reference_stream_specifier),
AV_OPT_TYPE_STRING, {.str =
"auto"}, CHAR_MIN, CHAR_MAX,
E },
1063 {
"segment_format_options",
"set list of options for the container format used for the segments",
OFFSET(format_options_str),
AV_OPT_TYPE_STRING, {.str =
NULL}, 0, 0,
E },
1065 {
"segment_header_filename",
"write a single file containing the header",
OFFSET(header_filename),
AV_OPT_TYPE_STRING, {.str =
NULL}, 0, 0,
E },
1071 {
"segment_list_size",
"set the maximum number of playlist entries",
OFFSET(list_size),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E },
1081 {
"segment_atclocktime",
"set segment to be cut at clocktime",
OFFSET(use_clocktime),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
E},
1082 {
"segment_clocktime_offset",
"set segment clocktime offset",
OFFSET(clocktime_offset),
AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 86400000000LL,
E},
1083 {
"segment_clocktime_wrap_duration",
"set segment clocktime wrapping duration",
OFFSET(clocktime_wrap_duration),
AV_OPT_TYPE_DURATION, {.i64 = INT64_MAX}, 0, INT64_MAX,
E},
1085 {
"segment_time_delta",
"set approximation value used for the segment times",
OFFSET(time_delta),
AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_MAX,
E },
1088 {
"segment_wrap",
"set number after which the index wraps",
OFFSET(segment_idx_wrap),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E },
1090 {
"segment_start_number",
"set the sequence number of the first segment",
OFFSET(segment_idx),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E },
1091 {
"segment_wrap_number",
"set the number of wrap before the first segment",
OFFSET(segment_idx_wrap_nb),
AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX,
E },
1092 {
"strftime",
"set filename expansion with strftime at segment creation",
OFFSET(use_strftime),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
1093 {
"increment_tc",
"increment timecode between each segment",
OFFSET(increment_tc),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
E },
1094 {
"break_non_keyframes",
"allow breaking segments on non-keyframes",
OFFSET(break_non_keyframes),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
E },
1096 {
"individual_header_trailer",
"write header/trailer to each segment",
OFFSET(individual_header_trailer),
AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1,
E },
1097 {
"write_header_trailer",
"write a header to the first segment and a trailer to the last one",
OFFSET(write_header_trailer),
AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1,
E },
1098 {
"reset_timestamps",
"reset timestamps at the beginning of each segment",
OFFSET(reset_timestamps),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
E },
1099 {
"initial_offset",
"set initial timestamp offset",
OFFSET(initial_offset),
AV_OPT_TYPE_DURATION, {.i64 = 0}, -INT64_MAX, INT64_MAX,
E },
1100 {
"write_empty_segments",
"allow writing empty 'filler' segments",
OFFSET(write_empty),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
E },
1104 #if CONFIG_SEGMENT_MUXER
1105 static const AVClass seg_class = {
1123 .priv_class = &seg_class,
1127 #if CONFIG_STREAM_SEGMENT_MUXER
1128 static const AVClass sseg_class = {
1136 .
name =
"stream_segment,ssegment",
1146 .priv_class = &sseg_class,
#define SEGMENT_LIST_FLAG_LIVE
int write_header_trailer
Set by a private option.
#define FF_ENABLE_DEPRECATION_WARNINGS
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_TIMECODE_STR_SIZE
int64_t clocktime_wrap_duration
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
static av_cold int init(AVCodecContext *avctx)
#define AVSTREAM_INIT_IN_WRITE_HEADER
stream parameters initialized in avformat_write_header
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.
AVIOContext * list_pb
list file put-byte context
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.
This struct describes the properties of an encoded stream.
static int segment_start(AVFormatContext *s, int write_header)
#define MKTAG(a, b, c, d)
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
int use_clocktime
flag to cut segments at regular clock time
void avio_context_free(AVIOContext **s)
Free the supplied IO context and everything associated with it.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
int list_type
set the list type
static av_cold int end(AVCodecContext *avctx)
int nb_frames
number of elments in the frames array
int segment_idx_wrap
number after which the index wraps
AVStream ** streams
A list of all streams in the file.
static int segment_mux_init(AVFormatContext *s)
AVStreamInternal * internal
An opaque field for libavformat internal usage.
int segment_count
number of segment files already written
AVRational avg_frame_rate
Average framerate.
char * times_str
segment times specification string
char * frames_str
segment frame numbers specification string
#define AV_LOG_VERBOSE
Detailed information.
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.
SegmentListEntry cur_entry
static int seg_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
char * list
filename for the segment list file
int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
struct SegmentListEntry * next
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
const char * av_basename(const char *path)
Thread safe basename.
int64_t time
segment duration
char temp_list_filename[1024]
static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
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.
int nb_times
number of elments in the times array
static int parse_frames(void *log_ctx, int **frames, int *nb_frames, const char *frames_str)
static int seg_write_header(AVFormatContext *s)
int av_escape(char **dst, const char *src, const char *special_chars, enum AVEscapeMode mode, int flags)
Escape string in src, and put the escaped string in an allocated string in *dst, which must be freed ...
if it could not because there are no more frames
int reference_stream_index
int start
timecode frame start (first base frame number)
char * av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum)
Load timecode string in buf.
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 type
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
static void close_null_ctxp(AVIOContext **pb)
#define AV_ESCAPE_FLAG_WHITESPACE
Consider spaces special and escape them even in the middle of the string.
static int select_reference_stream(AVFormatContext *s)
int use_strftime
flag to expand filename with strftime
int reset_timestamps
reset timestamps at the beginning of each segment
int frame_count
total number of reference frames
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
char * format
format to use for output segment files
static int seg_write_trailer(struct AVFormatContext *s)
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
int flags
Flags modifying the (de)muxer behaviour.
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
static double av_q2d(AVRational a)
Convert an AVRational to a double.
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().
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
#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.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
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.
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
static int seg_init(AVFormatContext *s)
AVBSFContext ** bsfcs
bitstream filters to run on stream
AVDictionary * format_options
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
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.
static int write_trailer(AVFormatContext *s1)
Rational number (pair of numerator and denominator).
@ LIST_TYPE_EXT
deprecated
int * frames
list of frame number specification
const char * av_default_item_name(void *ptr)
Return the context name.
AVIOContext * pb
I/O context.
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 list
char * time_str
segment duration specification string
void av_opt_free(void *obj)
Free all allocated objects in obj.
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
void avio_w8(AVIOContext *s, int b)
static int set_segment_filename(AVFormatContext *s)
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
@ AV_ESCAPE_MODE_AUTO
Use auto-selected escaping mode.
static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
static int segment_list_open(AVFormatContext *s)
ff_const59 struct AVOutputFormat * oformat
The output container format.
int extradata_size
Size of the extradata content in bytes.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
char * entry_prefix
prefix to add to list entry filenames
int increment_tc
flag to increment timecode if found
static void print_csv_escaped_str(AVIOContext *ctx, const char *str)
SegmentListEntry * segment_list_entries_end
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
char * format_options_str
format options to use for output segment files
int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the stream st contained in s is matched by the stream specifier spec.
#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.
ff_const59 AVOutputFormat * oformat
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
char * url
input or output URL.
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
#define AV_NOPTS_VALUE
Undefined timestamp value.
static void seg_free(AVFormatContext *s)
int header_written
whether we've already called avformat_write_header
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
int segment_frame_count
number of reference frames in the segment
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 offset
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 segment_idx_wrap_nb
number of time the index has wraped
int64_t last_val
remember last time for wrap around detection
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
int segment_idx
index of the segment file to write, starting from 0
char * reference_stream_specifier
reference stream specifier
#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...
#define AVERROR_MUXER_NOT_FOUND
Muxer not found.
#define av_malloc_array(a, b)
int avoid_negative_ts
Avoid negative timestamps during muxing.
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int list_size
number of entries for the segment list file
SegmentListEntry * segment_list_entries
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define FF_ARRAY_ELEMS(a)
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
static const AVOption options[]
static void segment_list_print_entry(AVIOContext *list_ioctx, ListType list_type, const SegmentListEntry *list_entry, void *log_ctx)
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.
char * header_filename
filename to write the output header to
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.
int individual_header_trailer
Set by a private option.
int list_flags
flags affecting list generation
int64_t * times
list of segment interval specification
int64_t av_gettime(void)
Get the current time in microseconds.
#define FF_DISABLE_DEPRECATION_WARNINGS
char * av_strdup(const char *s)
Duplicate a string.
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.
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.
#define SEGMENT_LIST_FLAG_CACHE
static int parse_times(void *log_ctx, int64_t **times, int *nb_times, const char *times_str)
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,...)
int64_t initial_offset
initial timestamps offset, expressed in microseconds
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx)
Parse timecode representation (hh:mm:ss[:;.
static void write_header(FFV1Context *f)
int pts_wrap_bits
number of bits in pts (used for wrapping control)
void * priv_data
Format private data.
static int open_null_ctx(AVIOContext **ctx)
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.