FFmpeg
internal.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /**
20  * @file
21  * common internal api header.
22  */
23 
24 #ifndef AVCODEC_INTERNAL_H
25 #define AVCODEC_INTERNAL_H
26 
27 #include <stdint.h>
28 
29 #include "libavutil/buffer.h"
31 #include "libavutil/fifo.h"
32 #include "libavutil/mathematics.h"
33 #include "libavutil/pixfmt.h"
34 #include "avcodec.h"
35 #include "config.h"
36 
37 /**
38  * The codec does not modify any global variables in the init function,
39  * allowing to call the init function without locking any global mutexes.
40  */
41 #define FF_CODEC_CAP_INIT_THREADSAFE (1 << 0)
42 /**
43  * The codec allows calling the close function for deallocation even if
44  * the init function returned a failure. Without this capability flag, a
45  * codec does such cleanup internally when returning failures from the
46  * init function and does not expect the close function to be called at
47  * all.
48  */
49 #define FF_CODEC_CAP_INIT_CLEANUP (1 << 1)
50 /**
51  * Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set
52  * AVFrame.pkt_dts manually. If the flag is set, decode.c won't overwrite
53  * this field. If it's unset, decode.c tries to guess the pkt_dts field
54  * from the input AVPacket.
55  */
56 #define FF_CODEC_CAP_SETS_PKT_DTS (1 << 2)
57 /**
58  * The decoder extracts and fills its parameters even if the frame is
59  * skipped due to the skip_frame setting.
60  */
61 #define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM (1 << 3)
62 /**
63  * The decoder sets the cropping fields in the output frames manually.
64  * If this cap is set, the generic code will initialize output frame
65  * dimensions to coded rather than display values.
66  */
67 #define FF_CODEC_CAP_EXPORTS_CROPPING (1 << 4)
68 /**
69  * Codec initializes slice-based threading with a main function
70  */
71 #define FF_CODEC_CAP_SLICE_THREAD_HAS_MF (1 << 5)
72 /*
73  * The codec supports frame threading and has inter-frame dependencies, so it
74  * uses ff_thread_report/await_progress().
75  */
76 #define FF_CODEC_CAP_ALLOCATE_PROGRESS (1 << 6)
77 /**
78  * Codec handles avctx->thread_count == 0 (auto) internally.
79  */
80 #define FF_CODEC_CAP_AUTO_THREADS (1 << 7)
81 /**
82  * Codec handles output frame properties internally instead of letting the
83  * internal logic derive them from AVCodecInternal.last_pkt_props.
84  */
85 #define FF_CODEC_CAP_SETS_FRAME_PROPS (1 << 8)
86 
87 /**
88  * AVCodec.codec_tags termination value
89  */
90 #define FF_CODEC_TAGS_END -1
91 
92 
93 #ifdef TRACE
94 # define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__)
95 #else
96 # define ff_tlog(ctx, ...) do { } while(0)
97 #endif
98 
99 
100 #define FF_DEFAULT_QUANT_BIAS 999999
101 
102 #define FF_QSCALE_TYPE_MPEG1 0
103 #define FF_QSCALE_TYPE_MPEG2 1
104 #define FF_QSCALE_TYPE_H264 2
105 #define FF_QSCALE_TYPE_VP56 3
106 
107 #define FF_SANE_NB_CHANNELS 512U
108 
109 #define FF_SIGNBIT(x) ((x) >> CHAR_BIT * sizeof(x) - 1)
110 
111 #if HAVE_SIMD_ALIGN_64
112 # define STRIDE_ALIGN 64 /* AVX-512 */
113 #elif HAVE_SIMD_ALIGN_32
114 # define STRIDE_ALIGN 32
115 #elif HAVE_SIMD_ALIGN_16
116 # define STRIDE_ALIGN 16
117 #else
118 # define STRIDE_ALIGN 8
119 #endif
120 
121 typedef struct DecodeSimpleContext {
124 
125 typedef struct EncodeSimpleContext {
128 
129 typedef struct AVCodecInternal {
130  /**
131  * Whether the parent AVCodecContext is a copy of the context which had
132  * init() called on it.
133  * This is used by multithreading - shared tables and picture pointers
134  * should be freed from the original context only.
135  */
136  int is_copy;
137 
138  /**
139  * An audio frame with less than required samples has been submitted and
140  * padded with silence. Reject all subsequent frames.
141  */
143 
145 
146  void *thread_ctx;
147 
150 
151  /**
152  * Properties (timestamps+side data) extracted from the last packet passed
153  * for decoding.
154  */
157 
158  /**
159  * temporary buffer used for encoders to store their bitstream
160  */
161  uint8_t *byte_buffer;
162  unsigned int byte_buffer_size;
163 
165 
167 
168  /**
169  * If this is set, then AVCodec->close (if existing) needs to be called
170  * for the parent AVCodecContext.
171  */
173 
174  /**
175  * Number of audio samples to skip at the start of the next decoded frame
176  */
178 
179  /**
180  * hwaccel-specific private data
181  */
183 
184  /**
185  * checks API usage: after codec draining, flush is required to resume operation
186  */
187  int draining;
188 
189  /**
190  * buffers for using new encode/decode API through legacy API
191  */
195 
197 
199 
200  /* to prevent infinite loop on errors when draining */
202 
203  /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
211 
213  const uint8_t *key;
214  const uint8_t *value;
215 };
216 
217 extern const uint8_t ff_log2_run[41];
218 
219 /**
220  * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
221  * If there is no such matching pair then size is returned.
222  */
223 int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
224 
225 unsigned int avpriv_toupper4(unsigned int x);
226 
227 void ff_color_frame(AVFrame *frame, const int color[4]);
228 
229 /**
230  * Maximum size in bytes of extradata.
231  * This value was chosen such that every bit of the buffer is
232  * addressable by a 32-bit signed integer as used by get_bits.
233  */
234 #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE)
235 
236 /**
237  * Rescale from sample rate to AVCodecContext.time_base.
238  */
240  int64_t samples)
241 {
242  if(samples == AV_NOPTS_VALUE)
243  return AV_NOPTS_VALUE;
244  return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate },
245  avctx->time_base);
246 }
247 
248 /**
249  * 2^(x) for integer x
250  * @return correctly rounded float
251  */
252 static av_always_inline float ff_exp2fi(int x) {
253  /* Normal range */
254  if (-126 <= x && x <= 128)
255  return av_int2float((x+127) << 23);
256  /* Too large */
257  else if (x > 128)
258  return INFINITY;
259  /* Subnormal numbers */
260  else if (x > -150)
261  return av_int2float(1 << (x+149));
262  /* Negligibly small */
263  else
264  return 0;
265 }
266 
267 /**
268  * Get a buffer for a frame. This is a wrapper around
269  * AVCodecContext.get_buffer() and should be used instead calling get_buffer()
270  * directly.
271  */
272 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
273 
274 #define FF_REGET_BUFFER_FLAG_READONLY 1 ///< the returned buffer does not need to be writable
275 /**
276  * Identical in function to ff_get_buffer(), except it reuses the existing buffer
277  * if available.
278  */
280 
282 
284 
285 const uint8_t *avpriv_find_start_code(const uint8_t *p,
286  const uint8_t *end,
287  uint32_t *state);
288 
290 
291 /**
292  * Check that the provided frame dimensions are valid and set them on the codec
293  * context.
294  */
296 
297 /**
298  * Check that the provided sample aspect ratio is valid and set it on the codec
299  * context.
300  */
301 int ff_set_sar(AVCodecContext *avctx, AVRational sar);
302 
303 /**
304  * Add or update AV_FRAME_DATA_MATRIXENCODING side data.
305  */
307  enum AVMatrixEncoding matrix_encoding);
308 
309 /**
310  * Select the (possibly hardware accelerated) pixel format.
311  * This is a wrapper around AVCodecContext.get_format() and should be used
312  * instead of calling get_format() directly.
313  *
314  * The list of pixel formats must contain at least one valid entry, and is
315  * terminated with AV_PIX_FMT_NONE. If it is possible to decode to software,
316  * the last entry in the list must be the most accurate software format.
317  * If it is not possible to decode to software, AVCodecContext.sw_pix_fmt
318  * must be set before calling this function.
319  */
320 int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
321 
322 /**
323  * Add a CPB properties side data to an encoding context.
324  */
326 
327 /**
328  * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info
329  *
330  * @param frame Raw frame to get S12M timecode side data from
331  * @param rate The frame rate
332  * @param prefix_len Number of bytes to allocate before SEI message
333  * @param data Pointer to a variable to store allocated memory
334  * Upon return the variable will hold NULL on error or if frame has no S12M timecode info.
335  * Otherwise it will point to prefix_len uninitialized bytes followed by
336  * *sei_size SEI message
337  * @param sei_size Pointer to a variable to store generated SEI message length
338  * @return Zero on success, negative error code on failure
339  */
340 int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len,
341  void **data, size_t *sei_size);
342 
343 /**
344  * Get an estimated video bitrate based on frame size, frame rate and coded
345  * bits per pixel.
346  */
347 int64_t ff_guess_coded_bitrate(AVCodecContext *avctx);
348 
349 /**
350  * Check if a value is in the list. If not, return the default value
351  *
352  * @param ctx Context for the log msg
353  * @param val_name Name of the checked value, for log msg
354  * @param array_valid_values Array of valid int, ended with INT_MAX
355  * @param default_value Value return if checked value is not in the array
356  * @return Value or default_value.
357  */
358 int ff_int_from_list_or_default(void *ctx, const char * val_name, int val,
359  const int * array_valid_values, int default_value);
360 
361 void ff_dvdsub_parse_palette(uint32_t *palette, const char *p);
362 
363 #if defined(_WIN32) && CONFIG_SHARED && !defined(BUILDING_avcodec)
364 # define av_export_avcodec __declspec(dllimport)
365 #else
366 # define av_export_avcodec
367 #endif
368 
369 #endif /* AVCODEC_INTERNAL_H */
ff_guess_coded_bitrate
int64_t ff_guess_coded_bitrate(AVCodecContext *avctx)
Get an estimated video bitrate based on frame size, frame rate and coded bits per pixel.
Definition: utils.c:1105
AVCodecInternal::initial_sample_rate
int initial_sample_rate
Definition: internal.h:207
AVCodec
AVCodec.
Definition: codec.h:197
AVCodecDefault::value
const uint8_t * value
Definition: internal.h:214
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
INFINITY
#define INFINITY
Definition: mathematics.h:67
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:981
color
Definition: vf_paletteuse.c:583
ff_thread_can_start_frame
int ff_thread_can_start_frame(AVCodecContext *avctx)
Definition: pthread_frame.c:975
AVCodecInternal::es
EncodeSimpleContext es
Definition: internal.h:166
AVCodecInternal::skip_samples
int skip_samples
Number of audio samples to skip at the start of the next decoded frame.
Definition: internal.h:177
state
static struct @321 state
AVCodecDefault::key
const uint8_t * key
Definition: internal.h:213
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:303
avpriv_toupper4
unsigned int avpriv_toupper4(unsigned int x)
Definition: utils.c:869
AVCodecInternal::frame_thread_encoder
void * frame_thread_encoder
Definition: internal.h:164
b
#define b
Definition: input.c:41
data
const char data[16]
Definition: mxf.c:142
mathematics.h
avpriv_find_start_code
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
ff_add_cpb_side_data
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition: utils.c:1001
AVBSFContext
The bitstream filter state.
Definition: bsf.h:49
AVCodecInternal::pool
AVBufferRef * pool
Definition: internal.h:144
AVCodecInternal::initial_channel_layout
uint64_t initial_channel_layout
Definition: internal.h:209
AVFifoBuffer
Definition: fifo.h:31
AVCodecInternal::is_copy
int is_copy
Whether the parent AVCodecContext is a copy of the context which had init() called on it.
Definition: internal.h:136
EncodeSimpleContext::in_frame
AVFrame * in_frame
Definition: internal.h:126
fifo.h
ff_match_2uint16
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
Definition: utils.c:851
AVCodecInternal::showed_multi_packet_warning
int showed_multi_packet_warning
Definition: internal.h:196
av_int2float
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
Definition: intfloat.h:40
tab
static const struct twinvq_data tab
Definition: twinvq_data.h:10345
val
static double val(void *priv, double ch)
Definition: aeval.c:76
ff_reget_buffer
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
Definition: decode.c:1752
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1645
ff_samples_to_time_base
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
Definition: internal.h:239
ff_exp2fi
static av_always_inline float ff_exp2fi(int x)
2^(x) for integer x
Definition: internal.h:252
ff_color_frame
void ff_color_frame(AVFrame *frame, const int color[4])
Definition: utils.c:404
width
#define width
s
#define s(width, name)
Definition: cbs_vp9.c:257
AVCodecInternal::buffer_pkt
AVPacket * buffer_pkt
buffers for using new encode/decode API through legacy API
Definition: internal.h:192
ctx
AVFormatContext * ctx
Definition: movenc.c:48
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AVCodecInternal::ds
DecodeSimpleContext ds
Definition: internal.h:148
AVCPBProperties
This structure describes the bitrate properties of an encoded bitstream.
Definition: defs.h:104
AVCodecDefault
Definition: internal.h:212
AVMatrixEncoding
AVMatrixEncoding
Definition: channel_layout.h:120
AVCodecInternal::changed_frames_dropped
int changed_frames_dropped
Definition: internal.h:204
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1081
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCodecInternal::initial_height
int initial_height
Definition: internal.h:206
AVCodecInternal::skip_samples_multiplier
int skip_samples_multiplier
Definition: internal.h:198
AVCodecInternal::draining_done
int draining_done
Definition: internal.h:194
AVCodecInternal::bsf
AVBSFContext * bsf
Definition: internal.h:149
AVCodecInternal::last_pkt_props
AVPacket * last_pkt_props
Properties (timestamps+side data) extracted from the last packet passed for decoding.
Definition: internal.h:155
AVCodecContext::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avcodec.h:507
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:182
ff_alloc_timecode_sei
int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info.
Definition: utils.c:1041
AVCodecInternal::initial_channels
int initial_channels
Definition: internal.h:208
AVCodecInternal::initial_format
int initial_format
Definition: internal.h:205
ff_dvdsub_parse_palette
void ff_dvdsub_parse_palette(uint32_t *palette, const char *p)
Definition: dvdsub.c:26
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AVCodecInternal::byte_buffer
uint8_t * byte_buffer
temporary buffer used for encoders to store their bitstream
Definition: internal.h:161
DecodeSimpleContext
Definition: internal.h:121
EncodeSimpleContext
Definition: internal.h:125
buffer.h
height
#define height
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AVCodecInternal
Definition: internal.h:129
AVCodecInternal::byte_buffer_size
unsigned int byte_buffer_size
Definition: internal.h:162
AVCodecInternal::initial_width
int initial_width
Definition: internal.h:206
AVCodecInternal::pkt_props
AVFifoBuffer * pkt_props
Definition: internal.h:156
av_always_inline
#define av_always_inline
Definition: attributes.h:49
AVCodecInternal::nb_draining_errors
int nb_draining_errors
Definition: internal.h:201
AVCodecInternal::last_audio_frame
int last_audio_frame
An audio frame with less than required samples has been submitted and padded with silence.
Definition: internal.h:142
avcodec.h
pixfmt.h
frame
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
Definition: filter_design.txt:264
AVCodecInternal::needs_close
int needs_close
If this is set, then AVCodec->close (if existing) needs to be called for the parent AVCodecContext.
Definition: internal.h:172
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:101
AVCodecContext
main external API structure.
Definition: avcodec.h:384
channel_layout.h
ff_log2_run
const uint8_t ff_log2_run[41]
Definition: bitstream.c:39
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
AVCodecInternal::buffer_frame
AVFrame * buffer_frame
Definition: internal.h:193
AVCodecInternal::draining
int draining
checks API usage: after codec draining, flush is required to resume operation
Definition: internal.h:187
ff_side_data_update_matrix_encoding
int ff_side_data_update_matrix_encoding(AVFrame *frame, enum AVMatrixEncoding matrix_encoding)
Add or update AV_FRAME_DATA_MATRIXENCODING side data.
Definition: utils.c:116
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:86
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:84
AVPacket
This structure stores compressed data.
Definition: packet.h:342
AVCodecInternal::thread_ctx
void * thread_ctx
Definition: internal.h:146
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
DecodeSimpleContext::in_pkt
AVPacket * in_pkt
Definition: internal.h:122
avpriv_h264_has_num_reorder_frames
int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx)
Definition: h264dec.c:61
avpriv_codec_get_cap_skip_frame_fill_param
int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec)
Definition: utils.c:444
ff_int_from_list_or_default
int ff_int_from_list_or_default(void *ctx, const char *val_name, int val, const int *array_valid_values, int default_value)
Check if a value is in the list.
Definition: utils.c:1126