FFmpeg
thread.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008 Alexander Strange <astrange@ithinksw.com>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * Multithreading support functions
24  * @author Alexander Strange <astrange@ithinksw.com>
25  */
26 
27 #ifndef AVCODEC_THREAD_H
28 #define AVCODEC_THREAD_H
29 
30 #include "libavutil/buffer.h"
31 
32 #include "avcodec.h"
33 
34 typedef struct ThreadFrame {
37  // progress->data is an array of 2 ints holding progress for top/bottom
38  // fields
40 } ThreadFrame;
41 
42 /**
43  * Wait for decoding threads to finish and reset internal state.
44  * Called by avcodec_flush_buffers().
45  *
46  * @param avctx The context.
47  */
48 void ff_thread_flush(AVCodecContext *avctx);
49 
50 /**
51  * Submit a new frame to a decoding thread.
52  * Returns the next available frame in picture. *got_picture_ptr
53  * will be 0 if none is available.
54  * The return value on success is the size of the consumed packet for
55  * compatibility with avcodec_decode_video2(). This means the decoder
56  * has to consume the full packet.
57  *
58  * Parameters are the same as avcodec_decode_video2().
59  */
60 int ff_thread_decode_frame(AVCodecContext *avctx, AVFrame *picture,
61  int *got_picture_ptr, AVPacket *avpkt);
62 
63 /**
64  * If the codec defines update_thread_context(), call this
65  * when they are ready for the next thread to start decoding
66  * the next frame. After calling it, do not change any variables
67  * read by the update_thread_context() method, or call ff_thread_get_buffer().
68  *
69  * @param avctx The context.
70  */
72 
73 /**
74  * Notify later decoding threads when part of their reference picture is ready.
75  * Call this when some part of the picture is finished decoding.
76  * Later calls with lower values of progress have no effect.
77  *
78  * @param f The picture being decoded.
79  * @param progress Value, in arbitrary units, of how much of the picture has decoded.
80  * @param field The field being decoded, for field-picture codecs.
81  * 0 for top field or frame pictures, 1 for bottom field.
82  */
83 void ff_thread_report_progress(ThreadFrame *f, int progress, int field);
84 
85 /**
86  * Wait for earlier decoding threads to finish reference pictures.
87  * Call this before accessing some part of a picture, with a given
88  * value for progress, and it will return after the responsible decoding
89  * thread calls ff_thread_report_progress() with the same or
90  * higher value for progress.
91  *
92  * @param f The picture being referenced.
93  * @param progress Value, in arbitrary units, to wait for.
94  * @param field The field being referenced, for field-picture codecs.
95  * 0 for top field or frame pictures, 1 for bottom field.
96  */
97 void ff_thread_await_progress(ThreadFrame *f, int progress, int field);
98 
99 #if FF_API_THREAD_SAFE_CALLBACKS
100 /**
101  * Wrapper around get_format() for frame-multithreaded codecs.
102  * Call this function instead of avctx->get_format().
103  * Cannot be called after the codec has called ff_thread_finish_setup().
104  *
105  * @param avctx The current context.
106  * @param fmt The list of available formats.
107  */
108 enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
109 #else
110 #define ff_thread_get_format ff_get_format
111 #endif
112 
113 /**
114  * Wrapper around get_buffer() for frame-multithreaded codecs.
115  * Call this function instead of ff_get_buffer(f).
116  * Cannot be called after the codec has called ff_thread_finish_setup().
117  *
118  * @param avctx The current context.
119  * @param f The frame to write into.
120  */
122 
123 /**
124  * Wrapper around release_buffer() frame-for multithreaded codecs.
125  * Call this function instead of avctx->release_buffer(f).
126  * The AVFrame will be copied and the actual release_buffer() call
127  * will be performed later. The contents of data pointed to by the
128  * AVFrame should not be changed until ff_thread_get_buffer() is called
129  * on it.
130  *
131  * @param avctx The current context.
132  * @param f The picture being released.
133  */
135 
137 
140  int (*action_func2)(AVCodecContext *c, void *arg, int jobnr, int threadnr),
141  int (*main_func)(AVCodecContext *c), void *arg, int *ret, int job_count);
143 int ff_alloc_entries(AVCodecContext *avctx, int count);
144 void ff_reset_entries(AVCodecContext *avctx);
145 void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n);
146 void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift);
147 
148 #endif /* AVCODEC_THREAD_H */
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
ff_thread_ref_frame
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
Definition: utils.c:934
ff_thread_init
int ff_thread_init(AVCodecContext *s)
Definition: pthread.c:70
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
ThreadFrame::f
AVFrame * f
Definition: thread.h:35
ff_reset_entries
void ff_reset_entries(AVCodecContext *avctx)
Definition: pthread_slice.c:238
ThreadFrame::owner
AVCodecContext * owner[2]
Definition: thread.h:36
ff_thread_decode_frame
int ff_thread_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)
Submit a new frame to a decoding thread.
Definition: pthread_frame.c:505
s
#define s(width, name)
Definition: cbs_vp9.c:257
field
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
Definition: writing_filters.txt:78
f
#define f(width, name)
Definition: cbs_vp9.c:255
arg
const char * arg
Definition: jacosubdec.c:66
ThreadFrame::progress
AVBufferRef * progress
Definition: thread.h:39
src
#define src
Definition: vp8dsp.c:255
ff_thread_await_progress2
void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift)
Definition: pthread_slice.c:185
ff_alloc_entries
int ff_alloc_entries(AVCodecContext *avctx, int count)
Definition: pthread_slice.c:201
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_thread_flush
void ff_thread_flush(AVCodecContext *avctx)
Wait for decoding threads to finish and reset internal state.
Definition: pthread_frame.c:950
ff_thread_free
void ff_thread_free(AVCodecContext *s)
Definition: pthread.c:82
ff_thread_get_format
enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Wrapper around get_format() for frame-multithreaded codecs.
Definition: pthread_frame.c:1068
buffer.h
ff_thread_release_buffer
void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.
Definition: pthread_frame.c:1104
ff_thread_report_progress
void ff_thread_report_progress(ThreadFrame *f, int progress, int field)
Notify later decoding threads when part of their reference picture is ready.
Definition: pthread_frame.c:590
main_func
int() main_func(AVCodecContext *c)
Definition: pthread_slice.c:41
avcodec.h
ret
ret
Definition: filter_design.txt:187
action_func2
int() action_func2(AVCodecContext *c, void *arg, int jobnr, int threadnr)
Definition: pthread_slice.c:40
AVCodecContext
main external API structure.
Definition: avcodec.h:536
ThreadFrame
Definition: thread.h:34
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1096
ff_thread_report_progress2
void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n)
Definition: pthread_slice.c:174
shift
static int shift(int a, int b)
Definition: sonic.c:82
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:84
ff_thread_finish_setup
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...
Definition: pthread_frame.c:634
ff_slice_thread_execute_with_mainfunc
int ff_slice_thread_execute_with_mainfunc(AVCodecContext *avctx, int(*action_func2)(AVCodecContext *c, void *arg, int jobnr, int threadnr), int(*main_func)(AVCodecContext *c), void *arg, int *ret, int job_count)
AVPacket
This structure stores compressed data.
Definition: packet.h:346
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
ff_thread_await_progress
void ff_thread_await_progress(ThreadFrame *f, int progress, int field)
Wait for earlier decoding threads to finish reference pictures.
Definition: pthread_frame.c:613