Go to the documentation of this file.
27 #include <stdatomic.h>
299 #if FF_API_OLD_CHANNEL_LAYOUT
301 dst->channels =
src->channels;
302 dst->channel_layout =
src->channel_layout;
313 if (
src->hw_frames_ctx) {
366 #if FF_API_AVCTX_FRAME_NUMBER
371 #if FF_API_REORDERED_OPAQUE
373 dst->reordered_opaque =
src->reordered_opaque;
377 if (
src->slice_count &&
src->slice_offset) {
417 memory_order_relaxed);
460 AVFrame *picture,
int *got_picture_ptr,
504 p = &fctx->
threads[finished++];
528 }
while (!avpkt->
size && !*got_picture_ptr && err >= 0 && finished != fctx->
next_finished);
553 p =
f->owner[
field]->internal->thread_ctx;
557 "%p finished %d field %d\n", progress, n,
field);
576 p =
f->owner[
field]->internal->thread_ctx;
580 "thread awaiting %d field %d from %p\n", n,
field, progress);
632 for (
i = 0;
i < thread_count;
i++) {
647 #define OFF(member) offsetof(FrameThreadContext, member)
649 (
OFF(buffer_mutex),
OFF(hwaccel_mutex),
OFF(async_mutex)),
653 #define OFF(member) offsetof(PerThreadContext, member)
656 (
OFF(input_cond),
OFF(progress_cond),
OFF(output_cond)));
667 for (
i = 0;
i < thread_count;
i++) {
734 (*threads_to_free)++;
742 copy->internal->thread_ctx = p;
748 if (!
copy->priv_data)
768 copy->internal->is_copy = 1;
771 if (!
copy->internal->last_pkt_props)
813 if (thread_count <= 1) {
841 for (;
i < thread_count; ) {
910 av_log(avctx,
AV_LOG_ERROR,
"get_buffer() cannot be called after ff_thread_finish_setup()\n");
934 f->owner[0] =
f->owner[1] = avctx;
975 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.
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...
@ NEEDS_CLOSE
FFCodec->close needs to be called.
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 AVColorSpace colorspace
YUV colorspace type.
void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f)
Unref a ThreadFrame.
@ STATE_GET_FORMAT
Set when the codec calls get_format().
int sample_rate
samples per second
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.
uint8_t * data
The data buffer.
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 caps_internal
Internal hwaccel capabilities.
int ff_thread_can_start_frame(AVCodecContext *avctx)
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.
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
int * slice_offset
slice offsets in the frame in bytes
int capabilities
Codec capabilities.
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
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.
int slice_count
slice count
pthread_mutex_t buffer_mutex
Mutex used to protect get/release_buffer().
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
enum AVDiscard skip_idct
Skip IDCT/dequantization for selected frames.
AVCodec p
The public AVCodec.
const struct AVCodec * codec
AVChannelLayout ch_layout
Audio channel layout.
enum AVDiscard skip_frame
Skip decoding for selected frames.
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
unsigned pthread_init_cnt
Number of successfully initialized mutexes/conditions.
int flags
AV_CODEC_FLAG_*.
Context used by codec threads and stored in their AVCodecInternal thread_ctx.
static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx, AVPacket *avpkt)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int(* get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags)
This callback is called at the beginning of each frame to get data buffer(s) for it.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
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.
int has_b_frames
Size of the frame reordering buffer in the decoder.
pthread_cond_t output_cond
Used by the main thread to wait for frames to finish.
int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate.
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.
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
void(* flush)(struct AVCodecContext *)
Flush buffers.
static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
Update the next thread's AVCodecContext with values set by the user.
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(* decode)(struct AVCodecContext *avctx, struct AVFrame *frame, int *got_frame_ptr, struct AVPacket *avpkt)
Decode to an AVFrame.
int(* init)(struct AVCodecContext *)
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int got_frame
The output of got_picture_ptr from the last avcodec_decode_video() call.
Describe the class of an AVClass context structure.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
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.
int slice_flags
slice flags
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.
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...
pthread_mutex_t hwaccel_mutex
This lock is used for ensuring threads run in serial when hwaccel is used.
AVCodecContext * avctx
Context used to decode packets passed to this thread.
void av_opt_free(void *obj)
Free all allocated objects in obj.
int64_t pkt_dts
DTS copied from the AVPacket that triggered returning this frame.
@ STATE_GET_BUFFER
Set when the codec calls get_buffer().
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
#define atomic_load_explicit(object, order)
#define pthread_mutex_unlock(a)
AVPacket * last_pkt_props
Properties (timestamps+side data) extracted from the last packet passed for decoding.
static void async_lock(FrameThreadContext *fctx)
unsigned pthread_init_cnt
Number of successfully initialized mutexes/conditions.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int result
The result of the last codec decode/encode() call.
@ INITIALIZED
Thread has been properly set up.
const AVHWAccel * stash_hwaccel
int flags2
AV_CODEC_FLAG2_*.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int ff_thread_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)
Submit a new frame to a decoding thread.
static void copy(const float *p1, float *p2, const int length)
void * hwaccel_priv_data
hwaccel-specific private data
AVPacket * avpkt
Input packet (for decoding) or output (for encoding).
static void async_unlock(FrameThreadContext *fctx)
enum AVSampleFormat sample_fmt
audio sample format
pthread_cond_t async_cond
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
static const av_always_inline FFCodec * ffcodec(const AVCodec *codec)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
struct FrameThreadContext * parent
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
enum AVDiscard skip_loop_filter
Skip loop filtering for selected frames.
#define FF_THREAD_FRAME
Decode more than one frame at once.
void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
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)
unsigned properties
Properties of the stream that gets decoded.
int hwaccel_flags
Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated decoding (if active).
#define atomic_store_explicit(object, desired, order)
#define HWACCEL_CAP_ASYNC_SAFE
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...
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
const char * name
Name of the codec implementation.
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
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)
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
int64_t frame_num
Frame counter, set by libavcodec.
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)
int ff_frame_thread_init(AVCodecContext *avctx)
void * opaque
Private data of the user, can be used to carry app specific stuff.
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
void(* draw_horiz_band)(struct AVCodecContext *s, const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], int y, int type, int height)
If non NULL, 'draw_horiz_band' is called by the libavcodec decoder to draw a horizontal band.
main external API structure.
int active_thread_type
Which multithreading methods are in use by the codec.
@ UNINITIALIZED
Thread has not been created, AVCodec->close mustn't be called.
AVFrame * frame
Output frame (for decoding) or input (for encoding).
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
#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.
#define FF_DISABLE_DEPRECATION_WARNINGS
int coded_width
Bitstream width / height, may be different from width/height e.g.
int delaying
Set for the first N packets, where N is the number of threads.
@ STATE_INPUT_READY
Set when the thread is awaiting a packet.
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
This structure stores compressed data.
int width
picture width / height.
attribute_deprecated int frame_number
Frame counter, set by libavcodec.
#define flags(name, subs,...)
pthread_mutex_t mutex
Mutex used to protect the contents of the PerThreadContext.
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
#define atomic_init(obj, value)
void * priv_data
Format private data.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
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.
static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src, int for_user)
Update the next thread's AVCodecContext with values from the reference thread's context.
#define pthread_mutex_lock(a)
static int ff_thread_setname(const char *name)