Go to the documentation of this file.
25 #include <stdatomic.h>
198 if (
df->nb_f ==
df->nb_f_allocated) {
206 if (!
df->f[
df->nb_f])
209 df->nb_f_allocated++;
214 return df->f[
df->nb_f];
221 memmove(
df->f,
df->f + 1, (
df->nb_f - 1) *
sizeof(*
df->f));
222 df->f[--
df->nb_f] = tmp_frame;
227 for (
size_t i = 0;
i <
df->nb_f;
i++)
234 for (
size_t i = 0;
i <
df->nb_f_allocated;
i++)
238 df->nb_f_allocated = 0;
298 else if (ret < 0 && frame->buf[0])
356 dst->time_base =
src->time_base;
357 dst->framerate =
src->framerate;
359 dst->height =
src->height;
360 dst->pix_fmt =
src->pix_fmt;
361 dst->sw_pix_fmt =
src->sw_pix_fmt;
363 dst->coded_width =
src->coded_width;
364 dst->coded_height =
src->coded_height;
366 dst->has_b_frames =
src->has_b_frames;
367 dst->idct_algo =
src->idct_algo;
368 dst->properties =
src->properties;
370 dst->bits_per_coded_sample =
src->bits_per_coded_sample;
371 dst->sample_aspect_ratio =
src->sample_aspect_ratio;
373 dst->profile =
src->profile;
376 dst->bits_per_raw_sample =
src->bits_per_raw_sample;
377 #if FF_API_TICKS_PER_FRAME
379 dst->ticks_per_frame =
src->ticks_per_frame;
382 dst->color_primaries =
src->color_primaries;
384 dst->color_trc =
src->color_trc;
385 dst->colorspace =
src->colorspace;
386 dst->color_range =
src->color_range;
387 dst->chroma_sample_location =
src->chroma_sample_location;
389 dst->sample_rate =
src->sample_rate;
390 dst->sample_fmt =
src->sample_fmt;
395 if (!!
dst->hw_frames_ctx != !!
src->hw_frames_ctx ||
396 (
dst->hw_frames_ctx &&
dst->hw_frames_ctx->data !=
src->hw_frames_ctx->data)) {
399 if (
src->hw_frames_ctx) {
401 if (!
dst->hw_frames_ctx)
406 dst->hwaccel_flags =
src->hwaccel_flags;
427 (!
dst->hwaccel && !
dst->internal->hwaccel_priv_data));
441 dst->internal->hwaccel_priv_data =
443 if (!
dst->internal->hwaccel_priv_data)
446 dst->hwaccel =
src->hwaccel;
450 if (
hwaccel->update_thread_context) {
478 dst->draw_horiz_band=
src->draw_horiz_band;
479 dst->get_buffer2 =
src->get_buffer2;
481 dst->opaque =
src->opaque;
484 dst->slice_flags =
src->slice_flags;
485 dst->flags2 =
src->flags2;
486 dst->export_side_data =
src->export_side_data;
488 dst->skip_loop_filter =
src->skip_loop_filter;
489 dst->skip_idct =
src->skip_idct;
490 dst->skip_frame =
src->skip_frame;
492 dst->frame_num =
src->frame_num;
525 memory_order_relaxed);
636 p =
f->owner[
field]->internal->thread_ctx;
640 "%p finished %d field %d\n", progress, n,
field);
659 p =
f->owner[
field]->internal->thread_ctx;
663 "thread awaiting %d field %d from %p\n", n,
field, progress);
723 for (
i = 0;
i < thread_count;
i++) {
737 #define OFF(member) offsetof(FrameThreadContext, member)
739 (
OFF(buffer_mutex),
OFF(hwaccel_mutex),
OFF(async_mutex)),
743 #define OFF(member) offsetof(PerThreadContext, member)
746 (
OFF(input_cond),
OFF(progress_cond),
OFF(output_cond)));
757 for (
i = 0;
i < thread_count;
i++) {
790 &
ctx->nb_decoded_side_data);
838 copy->nb_decoded_side_data = 0;
842 (*threads_to_free)++;
851 copy->internal->thread_ctx = p;
858 if (!
copy->priv_data)
876 copy->internal->is_frame_mt = 1;
878 copy->internal->is_copy = 1;
881 if (!
copy->internal->in_pkt)
885 if (!
copy->internal->last_pkt_props)
902 for (
int i = 0;
i <
copy->nb_decoded_side_data;
i++) {
905 copy->decoded_side_data[
i], 0);
937 if (thread_count <= 1) {
968 for (;
i < thread_count; ) {
1037 av_log(avctx,
AV_LOG_ERROR,
"get_buffer() cannot be called after ff_thread_finish_setup()\n");
1061 f->owner[0] =
f->owner[1] = avctx;
1081 f->owner[0] =
f->owner[1] =
NULL;
static void error(const char *err)
int(* update_thread_context)(struct AVCodecContext *dst, const struct AVCodecContext *src)
Copy necessary context variables from a previous thread context to the current one.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
#define FF_ENABLE_DEPRECATION_WARNINGS
static void thread_set_name(PerThreadContext *p)
void * hwaccel_context
Legacy hardware accelerator context.
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
#define AV_LOG_WARNING
Something somehow does not look correct.
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
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
pthread_cond_t input_cond
Used to wait for a new packet from the main thread.
#define atomic_store(object, desired)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
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
enum AVPictureType initial_pict_type
static int hwaccel_serial(const AVCodecContext *avctx)
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
atomic_int debug_threads
Set if the FF_DEBUG_THREADS option is set.
const AVClass * priv_class
AVClass for the private context.
int next_decoding
The next context to submit a packet to.
#define AVERROR_EOF
End of file.
void ff_thread_flush(AVCodecContext *avctx)
Wait for decoding threads to finish and reset internal state.
static av_cold int init_thread(PerThreadContext *p, int *threads_to_free, FrameThreadContext *fctx, AVCodecContext *avctx, const FFCodec *codec, int first)
int ff_thread_can_start_frame(AVCodecContext *avctx)
static void decoded_frames_free(DecodedFrames *df)
const struct AVCodecDescriptor * codec_descriptor
AVCodecDescriptor.
@ FF_THREAD_IS_FIRST_THREAD
Context stored in the client AVCodecInternal thread_ctx.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static void park_frame_worker_threads(FrameThreadContext *fctx, int thread_count)
Waits for all threads to finish.
This structure describes decoded (raw) audio or video data.
int capabilities
Codec capabilities.
enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset)
Allows to synchronize objects whose lifetime is the whole decoding process among all frame threads.
@ STATE_SETTING_UP
Set before the codec has called ff_thread_finish_setup().
@ UNINITIALIZED
Thread has not been created, AVCodec->close mustn't be called.
AVPacket * next_pkt
Packet to be submitted to the next thread for decoding.
int ff_thread_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Submit available packets for decoding to worker threads, return a decoded frame if available.
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags)
Add a new side data entry to an array based on existing side data, taking a reference towards the con...
void * stash_hwaccel_context
int die
Set when the thread should exit.
av_cold void ff_pthread_free(void *obj, const unsigned offsets[])
int next_finished
The next context to return output from.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
pthread_mutex_t buffer_mutex
Mutex used to protect get/release_buffer().
void ff_hwaccel_uninit(AVCodecContext *avctx)
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
struct FFRefStructPool * progress_frame_pool
void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
AVCodec p
The public AVCodec.
const struct AVCodec * codec
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
static int update_context_from_user(AVCodecContext *dst, const AVCodecContext *src)
Update the next thread's AVCodecContext with values set by the user.
unsigned pthread_init_cnt
Number of successfully initialized mutexes/conditions.
void av_opt_free(void *obj)
Free all allocated objects in obj.
#define HWACCEL_CAP_THREAD_SAFE
Context used by codec threads and stored in their AVCodecInternal thread_ctx.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
int(* update_thread_context_for_user)(struct AVCodecContext *dst, const struct AVCodecContext *src)
Copy variables back to the user-facing context.
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
pthread_cond_t output_cond
Used by the main thread to wait for frames to finish.
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
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 field
#define atomic_load(object)
static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
PerThreadContext * prev_thread
The last thread submit_packet() was called on.
int(* init)(struct AVCodecContext *)
void ff_decode_internal_sync(struct AVCodecContext *dst, const struct AVCodecContext *src)
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
#define AV_CODEC_PROP_INTRA_ONLY
Codec uses only intra compression.
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Describe the class of an AVClass context structure.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
void ff_thread_await_progress(const ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
static int thread_get_buffer_internal(AVCodecContext *avctx, AVFrame *f, int flags)
static attribute_align_arg void * frame_worker_thread(void *arg)
Codec worker thread.
struct AVCodecInternal * internal
Private context used for internal data.
pthread_mutex_t progress_mutex
Mutex used to protect frame progress values and progress_cond.
@ AV_PICTURE_TYPE_I
Intra.
pthread_mutex_t async_mutex
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
pthread_mutex_t hwaccel_mutex
This lock is used for ensuring threads run in serial when thread-unsafe hwaccel is used.
AVCodecContext * avctx
Context used to decode packets passed to this thread.
static void * ff_refstruct_allocz(size_t size)
Equivalent to ff_refstruct_alloc_ext(size, 0, NULL, NULL)
@ STATE_SETUP_FINISHED
Set after the codec has called ff_thread_finish_setup().
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
#define AVPACKET_IS_EMPTY(pkt)
@ STATE_INPUT_READY
Set when the thread is awaiting a packet.
#define atomic_load_explicit(object, order)
#define pthread_mutex_unlock(a)
DecodedFrames df
Decoded frames from a single decode iteration.
static void async_lock(FrameThreadContext *fctx)
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
unsigned pthread_init_cnt
Number of successfully initialized mutexes/conditions.
#define attribute_align_arg
int result
The result of the last codec decode/encode() call.
const AVHWAccel * stash_hwaccel
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static void copy(const float *p1, float *p2, const int length)
void * hwaccel_priv_data
hwaccel-specific private data
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
int intra_only_flag
The following two fields have the same semantics as the DecodeContext field.
AVPacket * avpkt
Input packet (for decoding) or output (for encoding).
static void async_unlock(FrameThreadContext *fctx)
pthread_cond_t async_cond
static const av_always_inline FFCodec * ffcodec(const AVCodec *codec)
static void decoded_frames_pop(DecodedFrames *df, AVFrame *dst)
@ AV_PICTURE_TYPE_NONE
Undefined.
struct FrameThreadContext * parent
@ NEEDS_CLOSE
FFCodec->close needs to be called.
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
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
@ FF_THREAD_NO_FRAME_THREADING
int ff_thread_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Get a packet for decoding.
int ff_decode_receive_frame_internal(struct AVCodecContext *avctx, AVFrame *frame)
Do the actual decoding and obtain a decoded frame from the decoder, if available.
static void decoded_frames_flush(DecodedFrames *df)
#define FF_THREAD_FRAME
Decode more than one frame at once.
unsigned caps_internal
Internal codec capabilities FF_CODEC_CAP_*.
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
Copy only "properties" fields from src to dst.
#define i(width, name, range_min, range_max)
void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd)
Free all side data entries and their contents, then zeroes out the values which the pointers are poin...
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define atomic_store_explicit(object, desired, order)
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around ff_get_buffer() for frame-multithreaded codecs.
void * av_calloc(size_t nmemb, size_t size)
DEFINE_OFFSET_ARRAY(FrameThreadContext, thread_ctx, pthread_init_cnt,(OFF(buffer_mutex), OFF(hwaccel_mutex), OFF(async_mutex)),(OFF(async_cond)))
#define FFSWAP(type, a, b)
void avcodec_flush_buffers(AVCodecContext *avctx)
Reset the internal codec state / flush internal buffers.
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
int ff_frame_thread_init(AVCodecContext *avctx)
struct AVCodecInternal * ff_decode_internal_alloc(void)
static AVFrame * decoded_frames_get_free(DecodedFrames *df)
static const char * hwaccel
void ff_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
main external API structure.
int active_thread_type
Which multithreading methods are in use by the codec.
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx, AVPacket *in_pkt)
static int ref[MAX_W *MAX_W]
@ INITIALIZED
Thread has been properly set up.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
int(* close)(struct AVCodecContext *)
av_cold int ff_pthread_init(void *obj, const unsigned offsets[])
Initialize/destroy a list of mutexes/conditions contained in a structure.
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
int draining
decoding: AVERROR_EOF has been returned from ff_decode_get_packet(); must not be used by decoders tha...
#define FF_DISABLE_DEPRECATION_WARNINGS
enum AVMediaType codec_type
This structure stores compressed data.
#define flags(name, subs,...)
pthread_mutex_t mutex
Mutex used to protect the contents of the PerThreadContext.
void ff_decode_internal_uninit(struct AVCodecContext *avctx)
static int update_context_from_thread(AVCodecContext *dst, const AVCodecContext *src, int for_user)
Update the next thread's AVCodecContext with values from the reference thread's context.
#define atomic_init(obj, value)
int caps_internal
Internal hwaccel capabilities.
void * priv_data
Format private data.
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
void * stash_hwaccel_priv
pthread_cond_t progress_cond
Used by child threads to wait for progress to change.
PerThreadContext * threads
The contexts for each thread.
#define pthread_mutex_lock(a)
static int ff_thread_setname(const char *name)