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