Go to the documentation of this file.
22 #include <stdatomic.h>
33 #define FIFO_DEFAULT_QUEUE_SIZE 60
34 #define FIFO_DEFAULT_MAX_RECOVERY_ATTEMPTS 0
35 #define FIFO_DEFAULT_RECOVERY_WAIT_TIME_USEC 5000000 // 5 seconds
147 ctx->header_written = 1;
150 if (format_options) {
187 int64_t orig_pts, orig_dts, orig_duration;
192 if (
ctx->drop_until_keyframe) {
194 ctx->drop_until_keyframe = 0;
230 if (!
ctx->header_written)
246 if (!
ctx->header_written) {
306 " timestamp, recovery will be attempted immediately");
315 "Maximal number of %d recovery attempts reached.\n",
338 if (
ctx->header_written) {
340 ctx->header_written = 0;
343 if (!
ctx->recovery_nr) {
360 if (time_since_recovery < fifo->recovery_wait_time)
375 ctx->drop_until_keyframe = 1;
386 ctx->recovery_nr = 0;
432 fifo_thread_ctx.
avf = avf;
438 uint8_t just_flushed = 0;
443 if (ret < 0 || fifo_thread_ctx.recovery_nr > 0) {
486 const char *filename)
525 " only when drop_pkts_on_overflow is also turned on\n");
533 if (fifo->
format && !strcmp(fifo->
format,
"fifo_test")) {
594 uint8_t overflow_set = 0;
608 }
else if (
ret < 0) {
671 #define OFFSET(x) offsetof(FifoContext, x)
673 {
"attempt_recovery",
"Attempt recovery in case of failure",
OFFSET(attempt_recovery),
676 {
"drop_pkts_on_overflow",
"Drop packets on fifo queue overflow not to block encoder",
OFFSET(drop_pkts_on_overflow),
682 {
"format_opts",
"Options to be passed to underlying muxer",
OFFSET(format_options),
685 {
"max_recovery_attempts",
"Maximal number of recovery attempts",
OFFSET(max_recovery_attempts),
688 {
"queue_size",
"Size of fifo queue",
OFFSET(queue_size),
691 {
"recovery_wait_streamtime",
"Use stream time instead of real time while waiting for recovery",
694 {
"recovery_wait_time",
"Waiting time between recovery attempts",
OFFSET(recovery_wait_time),
697 {
"recover_any_error",
"Attempt recovery regardless of type of the error",
OFFSET(recover_any_error),
700 {
"restart_with_keyframe",
"Wait for keyframe when restarting output",
OFFSET(restart_with_keyframe),
703 {
"timeshift",
"Delay fifo output",
OFFSET(timeshift),
720 #if FF_API_ALLOW_FLUSH
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define atomic_store(object, desired)
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
AVThreadMessageQueue * queue
#define AVERROR_EOF
End of file.
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
@ AV_THREAD_MESSAGE_NONBLOCK
Perform non-blocking operation.
AVStream ** streams
A list of all streams in the file.
static void deinit(AVFormatContext *s)
AVDictionary * format_options
#define AV_LOG_VERBOSE
Detailed information.
uint8_t drop_until_keyframe
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
volatile uint8_t overflow_flag
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
int av_thread_message_queue_recv(AVThreadMessageQueue *mq, void *msg, unsigned flags)
Receive a message from the queue.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
int av_thread_message_queue_send(AVThreadMessageQueue *mq, void *msg, unsigned flags)
Send a message on the queue.
void av_thread_message_flush(AVThreadMessageQueue *mq)
Flush the message queue.
pthread_mutex_t overflow_flag_lock
int max_recovery_attempts
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
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int av_usleep(unsigned usec)
Sleep for a period of time.
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 av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
#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.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int write_trailer(AVFormatContext *s1)
Rational number (pair of numerator and denominator).
const char * av_default_item_name(void *ptr)
Return the context name.
AVIOContext * pb
I/O context.
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
#define atomic_fetch_sub_explicit(object, operand, order)
#define atomic_load_explicit(object, order)
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
#define pthread_mutex_unlock(a)
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int64_t last_received_dts
int(* init)(AVBSFContext *ctx)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define FF_OFMT_FLAG_ALLOW_FLUSH
This flag indicates that the muxer stores data internally and supports flushing it.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
int drop_pkts_on_overflow
char * url
input or output URL.
#define atomic_fetch_add_explicit(object, operand, order)
#define AV_NOPTS_VALUE
Undefined timestamp value.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
int recovery_wait_streamtime
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.
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.
atomic_int_least64_t queue_duration
#define AV_LOG_INFO
Standard information.
int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, unsigned nelem, unsigned elsize)
Allocate a new message queue.
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
#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.
const FFOutputFormat ff_fifo_test_muxer
void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, int err)
Set the sending error code.
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
intptr_t atomic_int_least64_t
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int restart_with_keyframe
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
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...
This structure stores compressed data.
void av_thread_message_queue_free(AVThreadMessageQueue **mq)
Free a message queue.
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().
int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
Utility function to open IO stream of output format.
void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, int err)
Set the receiving error code.
void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, void(*free_func)(void *msg))
Set the optional free message callback function which will be called if an operation is removing mess...
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
int64_t recovery_wait_time
#define atomic_init(obj, value)
static void write_header(FFV1Context *f)
int overflow_flag_lock_initialized
void * priv_data
Format private data.
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
#define pthread_mutex_lock(a)
static int ff_thread_setname(const char *name)