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/mathematics.h"
32 #include "libavutil/pixfmt.h"
33 #include "avcodec.h"
34 #include "config.h"
35 
36 #if CONFIG_LCMS2
37 # include "fflcms2.h"
38 #endif
39 
40 #define FF_SANE_NB_CHANNELS 512U
41 
42 #if HAVE_SIMD_ALIGN_64
43 # define STRIDE_ALIGN 64 /* AVX-512 */
44 #elif HAVE_SIMD_ALIGN_32
45 # define STRIDE_ALIGN 32
46 #elif HAVE_SIMD_ALIGN_16
47 # define STRIDE_ALIGN 16
48 #else
49 # define STRIDE_ALIGN 8
50 #endif
51 
52 typedef struct AVCodecInternal {
53  /**
54  * When using frame-threaded decoding, this field is set for the first
55  * worker thread (e.g. to decode extradata just once).
56  */
57  int is_copy;
58 
59  /**
60  * An audio frame with less than required samples has been submitted and
61  * padded with silence. Reject all subsequent frames.
62  */
64 
66 
67  void *thread_ctx;
68 
69  /**
70  * This packet is used to hold the packet given to decoders
71  * implementing the .decode API; it is unused by the generic
72  * code for decoders implementing the .receive_frame API and
73  * may be freely used (but not freed) by them with the caveat
74  * that the packet will be unreferenced generically in
75  * avcodec_flush_buffers().
76  */
78  struct AVBSFContext *bsf;
79 
80  /**
81  * Properties (timestamps+side data) extracted from the last packet passed
82  * for decoding.
83  */
85  struct AVFifo *pkt_props;
86 
87  /**
88  * temporary buffer used for encoders to store their bitstream
89  */
90  uint8_t *byte_buffer;
91  unsigned int byte_buffer_size;
92 
93  /**
94  * This is set to AV_PKT_FLAG_KEY for encoders that encode intra-only
95  * formats (i.e. whose codec descriptor has AV_CODEC_PROP_INTRA_ONLY set).
96  * This is used to set said flag generically for said encoders.
97  */
99 
101 
102  /**
103  * The input frame is stored here for encoders implementing the simple
104  * encode API.
105  *
106  * Not allocated in other cases.
107  */
109 
110  /**
111  * When the AV_CODEC_FLAG_RECON_FRAME flag is used. the encoder should store
112  * here the reconstructed frame corresponding to the last returned packet.
113  *
114  * Not allocated in other cases.
115  */
117 
118  /**
119  * If this is set, then FFCodec->close (if existing) needs to be called
120  * for the parent AVCodecContext.
121  */
123 
124  /**
125  * Number of audio samples to skip at the start of the next decoded frame
126  */
128 
129  /**
130  * hwaccel-specific private data
131  */
133 
134  /**
135  * checks API usage: after codec draining, flush is required to resume operation
136  */
137  int draining;
138 
139  /**
140  * buffers for using new encode/decode API through legacy API
141  */
145 
147 
148  /* to prevent infinite loop on errors when draining */
150 
151  /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
156 #if FF_API_OLD_CHANNEL_LAYOUT
157  int initial_channels;
158  uint64_t initial_channel_layout;
159 #endif
161 
162 #if CONFIG_LCMS2
163  FFIccContext icc; /* used to read and write embedded ICC profiles */
164 #endif
166 
167 /**
168  * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
169  * If there is no such matching pair then size is returned.
170  */
171 int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
172 
173 unsigned int ff_toupper4(unsigned int x);
174 
175 void ff_color_frame(AVFrame *frame, const int color[4]);
176 
177 /**
178  * Maximum size in bytes of extradata.
179  * This value was chosen such that every bit of the buffer is
180  * addressable by a 32-bit signed integer as used by get_bits.
181  */
182 #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE)
183 
184 /**
185  * Rescale from sample rate to AVCodecContext.time_base.
186  */
188  int64_t samples)
189 {
190  if(samples == AV_NOPTS_VALUE)
191  return AV_NOPTS_VALUE;
192  return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate },
193  avctx->time_base);
194 }
195 
196 /**
197  * 2^(x) for integer x
198  * @return correctly rounded float
199  */
200 static av_always_inline float ff_exp2fi(int x) {
201  /* Normal range */
202  if (-126 <= x && x <= 128)
203  return av_int2float((x+127) << 23);
204  /* Too large */
205  else if (x > 128)
206  return INFINITY;
207  /* Subnormal numbers */
208  else if (x > -150)
209  return av_int2float(1 << (x+149));
210  /* Negligibly small */
211  else
212  return 0;
213 }
214 
215 /**
216  * Get a buffer for a frame. This is a wrapper around
217  * AVCodecContext.get_buffer() and should be used instead calling get_buffer()
218  * directly.
219  */
220 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
221 
222 #define FF_REGET_BUFFER_FLAG_READONLY 1 ///< the returned buffer does not need to be writable
223 /**
224  * Identical in function to ff_get_buffer(), except it reuses the existing buffer
225  * if available.
226  */
228 
230 
232 
233 /**
234  * Check that the provided frame dimensions are valid and set them on the codec
235  * context.
236  */
238 
239 /**
240  * Check that the provided sample aspect ratio is valid and set it on the codec
241  * context.
242  */
243 int ff_set_sar(AVCodecContext *avctx, AVRational sar);
244 
245 /**
246  * Add or update AV_FRAME_DATA_MATRIXENCODING side data.
247  */
249  enum AVMatrixEncoding matrix_encoding);
250 
251 /**
252  * Select the (possibly hardware accelerated) pixel format.
253  * This is a wrapper around AVCodecContext.get_format() and should be used
254  * instead of calling get_format() directly.
255  *
256  * The list of pixel formats must contain at least one valid entry, and is
257  * terminated with AV_PIX_FMT_NONE. If it is possible to decode to software,
258  * the last entry in the list must be the most accurate software format.
259  * If it is not possible to decode to software, AVCodecContext.sw_pix_fmt
260  * must be set before calling this function.
261  */
262 int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
263 
264 /**
265  * Add a CPB properties side data to an encoding context.
266  */
268 
269 /**
270  * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info
271  *
272  * @param frame Raw frame to get S12M timecode side data from
273  * @param rate The frame rate
274  * @param prefix_len Number of bytes to allocate before SEI message
275  * @param data Pointer to a variable to store allocated memory
276  * Upon return the variable will hold NULL on error or if frame has no S12M timecode info.
277  * Otherwise it will point to prefix_len uninitialized bytes followed by
278  * *sei_size SEI message
279  * @param sei_size Pointer to a variable to store generated SEI message length
280  * @return Zero on success, negative error code on failure
281  */
282 int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len,
283  void **data, size_t *sei_size);
284 
285 /**
286  * Get an estimated video bitrate based on frame size, frame rate and coded
287  * bits per pixel.
288  */
289 int64_t ff_guess_coded_bitrate(AVCodecContext *avctx);
290 
291 /**
292  * Check if a value is in the list. If not, return the default value
293  *
294  * @param ctx Context for the log msg
295  * @param val_name Name of the checked value, for log msg
296  * @param array_valid_values Array of valid int, ended with INT_MAX
297  * @param default_value Value return if checked value is not in the array
298  * @return Value or default_value.
299  */
300 int ff_int_from_list_or_default(void *ctx, const char * val_name, int val,
301  const int * array_valid_values, int default_value);
302 
303 void ff_dvdsub_parse_palette(uint32_t *palette, const char *p);
304 
305 #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:1132
AVCodecInternal::initial_sample_rate
int initial_sample_rate
Definition: internal.h:155
AVCodec
AVCodec.
Definition: codec.h:204
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:1007
color
Definition: vf_paletteuse.c:600
AVCodecInternal::skip_samples
int skip_samples
Number of audio samples to skip at the start of the next decoded frame.
Definition: internal.h:127
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
AVCodecInternal::frame_thread_encoder
void * frame_thread_encoder
Definition: internal.h:100
AVCodecInternal::in_frame
AVFrame * in_frame
The input frame is stored here for encoders implementing the simple encode API.
Definition: internal.h:108
b
#define b
Definition: input.c:34
data
const char data[16]
Definition: mxf.c:143
ff_toupper4
unsigned int ff_toupper4(unsigned int x)
Definition: to_upper4.h:29
mathematics.h
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:1028
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
AVCodecInternal::pool
AVBufferRef * pool
Definition: internal.h:65
AVCodecInternal::is_copy
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
Definition: internal.h:57
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:872
AVCodecInternal::showed_multi_packet_warning
int showed_multi_packet_warning
Definition: internal.h:146
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:77
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:1580
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1462
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:187
ff_exp2fi
static av_always_inline float ff_exp2fi(int x)
2^(x) for integer x
Definition: internal.h:200
ff_color_frame
void ff_color_frame(AVFrame *frame, const int color[4])
Definition: utils.c:414
width
#define width
s
#define s(width, name)
Definition: cbs_vp9.c:256
AVCodecInternal::buffer_pkt
AVPacket * buffer_pkt
buffers for using new encode/decode API through legacy API
Definition: internal.h:142
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
AVCPBProperties
This structure describes the bitrate properties of an encoded bitstream.
Definition: defs.h:104
AVMatrixEncoding
AVMatrixEncoding
Definition: channel_layout.h:234
AVCodecInternal::changed_frames_dropped
int changed_frames_dropped
Definition: internal.h:152
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1159
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCodecInternal::initial_height
int initial_height
Definition: internal.h:154
AVCodecInternal::draining_done
int draining_done
Definition: internal.h:144
AVCodecInternal::last_pkt_props
AVPacket * last_pkt_props
Properties (timestamps+side data) extracted from the last packet passed for decoding.
Definition: internal.h:84
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:521
AVFifo
Definition: fifo.c:35
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:290
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:132
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:1068
AVCodecInternal::initial_format
int initial_format
Definition: internal.h:153
AVCodecInternal::bsf
struct AVBSFContext * bsf
Definition: internal.h:78
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:90
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:52
AVCodecInternal::byte_buffer_size
unsigned int byte_buffer_size
Definition: internal.h:91
AVCodecInternal::pkt_props
struct AVFifo * pkt_props
Definition: internal.h:85
FFIccContext
Definition: fflcms2.h:34
AVCodecInternal::initial_width
int initial_width
Definition: internal.h:154
AVCodecInternal::in_pkt
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition: internal.h:77
av_always_inline
#define av_always_inline
Definition: attributes.h:49
AVCodecInternal::nb_draining_errors
int nb_draining_errors
Definition: internal.h:149
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:63
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::recon_frame
AVFrame * recon_frame
When the AV_CODEC_FLAG_RECON_FRAME flag is used.
Definition: internal.h:116
AVCodecInternal::needs_close
int needs_close
If this is set, then FFCodec->close (if existing) needs to be called for the parent AVCodecContext.
Definition: internal.h:122
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:105
AVCodecContext
main external API structure.
Definition: avcodec.h:398
channel_layout.h
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:143
AVCodecInternal::draining
int draining
checks API usage: after codec draining, flush is required to resume operation
Definition: internal.h:137
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:120
AVCodecInternal::intra_only_flag
int intra_only_flag
This is set to AV_PKT_FLAG_KEY for encoders that encode intra-only formats (i.e.
Definition: internal.h:98
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:90
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVCodecInternal::initial_ch_layout
AVChannelLayout initial_ch_layout
Definition: internal.h:160
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecInternal::thread_ctx
void * thread_ctx
Definition: internal.h:67
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
avpriv_h264_has_num_reorder_frames
int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx)
Definition: h264dec.c:57
avpriv_codec_get_cap_skip_frame_fill_param
int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec)
Definition: utils.c:443
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:1153