36 #define DEFAULT_SLAVE_FAILURE_POLICY ON_SLAVE_FAILURE_ABORT 65 #define OFFSET(x) offsetof(TeeContext, x) 67 {
"use_fifo",
"Use fifo pseudo-muxer to separate actual muxers from encoder",
106 if (
av_match_name(use_fifo,
"true,y,yes,enable,enabled,on,1")) {
108 }
else if (
av_match_name(use_fifo,
"false,n,no,disable,disabled,off,0")) {
127 avf = tee_slave->
avf;
134 if (tee_slave->
bsfs) {
170 char *subselect =
NULL, *next_subselect =
NULL, *first_subselect =
NULL, *tmp_select =
NULL;
175 #define STEAL_OPTION(option, field) do { \ 176 if ((entry = av_dict_get(options, option, NULL, 0))) { \ 177 field = entry->value; \ 178 entry->value = NULL; \ 179 av_dict_set(&options, option, NULL, 0); \ 198 "Invalid onfail option value, valid options are 'abort' and 'ignore'\n");
211 char *format_options_str =
NULL;
234 tee_slave->
use_fifo ?
"fifo" :format, filename);
237 tee_slave->
avf = avf2;
262 first_subselect = tmp_select;
263 next_subselect =
NULL;
265 first_subselect =
NULL;
270 "Invalid stream specifier '%s' for output '%s'\n",
313 if (!tee_slave->
bsfs) {
320 const char *spec = entry->
key;
324 "Specifier separator in '%s' is '%c', but only characters '%s' " 336 "Invalid stream specifier '%s' in bsfs option '%s' for slave " 337 "output '%s'\n", spec, entry->
key, filename);
343 "output '%s'\n", spec, entry->
value, i, filename);
344 if (tee_slave->
bsfs[i]) {
346 "Duplicate bsfs specification associated to stream %d of slave " 347 "output '%s', filters will be ignored\n", i, filename);
353 "Error parsing bitstream filter sequence '%s' associated to " 354 "stream %d of slave output '%s'\n", entry->
value, i, filename);
365 if (target_stream < 0)
368 if (!tee_slave->
bsfs[target_stream]) {
373 "Failed to create pass-through bitstream filter: %s\n",
388 "Failed to initialize bitstream filter(s): %s\n",
415 av_log(log_ctx, log_level,
"filename:'%s' format:%s\n",
420 const char *bsf_name;
422 av_log(log_ctx, log_level,
" stream:%d codec:%s type:%s",
428 av_log(log_ctx, log_level,
" bsfs: %s\n", bsf_name);
448 av_log(avf,
AV_LOG_ERROR,
"Slave muxer #%u failed: %s, continuing with %u/%u slaves.\n",
458 const char *filename = avf->
url;
507 "to any slave.\n",
i);
523 int ret_all = 0,
ret;
529 if (!ret_all &&
ret < 0)
543 int ret_all = 0,
ret;
556 if (!ret_all &&
ret < 0)
580 if (!ret_all &&
ret < 0)
589 }
else if (
ret < 0) {
602 if (!ret_all &&
ret < 0)
616 .priv_class = &tee_muxer_class,
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
const AVClass * priv_class
A class for the private data, used to declare bitstream filter private AVOptions. ...
int av_bsf_get_null_filter(AVBSFContext **bsf)
Get null/pass-through bitstream filter.
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file ensuring correct interleaving.
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
static int parse_slave_fifo_options(const char *use_fifo, const char *fifo_options, TeeSlave *tee_slave)
static int tee_write_trailer(AVFormatContext *avf)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
const struct AVBitStreamFilter * filter
The bitstream filter this context is an instance of.
The bitstream filter state.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_dict_get_string(const AVDictionary *m, char **buffer, const char key_val_sep, const char pairs_sep)
Get dictionary entries as a string.
static const char *const slave_bsfs_spec_sep
Convenience header that includes libavutil's core.
static void log_slave(TeeSlave *slave, void *log_ctx, int log_level)
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
SlaveFailurePolicy on_fail
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 int tee_process_slave_failure(AVFormatContext *avf, unsigned slave_idx, int err_n)
int strict_std_compliance
Allow non-standard and experimental extension.
static const char *const slave_delim
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
AVOutputFormat ff_tee_muxer
static int close_slave(TeeSlave *tee_slave)
const char *(* item_name)(void *ctx)
A pointer to a function which returns the name of a context instance ctx associated with the class...
static void close_slaves(AVFormatContext *avf)
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.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
A list of all streams in the file.
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.
#define AV_LOG_VERBOSE
Detailed information.
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave)
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
static const char *const slave_select_sep
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
Convert valid timing fields (timestamps / durations) in a packet from one timebase to another...
#define DEFAULT_SLAVE_FAILURE_POLICY
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
char * url
input or output URL.
AVBSFContext ** bsfs
bitstream filters per stream
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int * stream_map
map from input to output streams indexes, disabled output streams are set to -1
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
enum AVMediaType codec_type
General type of the encoded data.
AVRational time_base_in
The timebase used for the timestamps of the input packets.
int av_match_name(const char *name, const char *names)
Match instances of a name in a comma-separated list of names.
AVDictionary * fifo_options
AVDictionary * fifo_options
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
int ff_tee_parse_slave_options(void *log, char *slave, AVDictionary **options, char **filename)
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.
static const AVClass tee_muxer_class
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
AVRational time_base_out
The timebase used for the timestamps of the output packets.
static int write_trailer(AVFormatContext *s1)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
static const AVOption options[]
ff_const59 struct AVOutputFormat * oformat
The output container format.
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.
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
char * av_strdup(const char *s)
Duplicate a string.
AVIOContext * pb
I/O context.
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
void(* io_close)(struct AVFormatContext *s, AVIOContext *pb)
A callback for closing the streams opened with AVFormatContext.io_open().
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Describe the class of an AVClass context structure.
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
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.
#define flags(name, subs,...)
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()...
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
#define AVERROR_OPTION_NOT_FOUND
Option not found.
void * priv_data
Format private data.
static void write_header(FFV1Context *f)
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key, ignoring the suffix of the found key string.
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
AVCodecParameters * codecpar
Codec parameters associated with this stream.
static int parse_slave_failure_policy_option(const char *opt, TeeSlave *tee_slave)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
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
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
This structure stores compressed data.
AVCodecParameters * par_in
Parameters of the input stream.
static int tee_write_header(AVFormatContext *avf)
#define STEAL_OPTION(option, field)
void * av_mallocz_array(size_t nmemb, size_t size)