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 | #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 | * potentially padded with silence). Reject all subsequent frames. | ||
62 | */ | ||
63 | int last_audio_frame; | ||
64 | |||
65 | /** | ||
66 | * Audio encoders can set this flag during init to indicate that they | ||
67 | * want the small last frame to be padded to a multiple of pad_samples. | ||
68 | */ | ||
69 | int pad_samples; | ||
70 | |||
71 | AVBufferRef *pool; | ||
72 | |||
73 | void *thread_ctx; | ||
74 | |||
75 | /** | ||
76 | * This packet is used to hold the packet given to decoders | ||
77 | * implementing the .decode API; it is unused by the generic | ||
78 | * code for decoders implementing the .receive_frame API and | ||
79 | * may be freely used (but not freed) by them with the caveat | ||
80 | * that the packet will be unreferenced generically in | ||
81 | * avcodec_flush_buffers(). | ||
82 | */ | ||
83 | AVPacket *in_pkt; | ||
84 | struct AVBSFContext *bsf; | ||
85 | |||
86 | /** | ||
87 | * Properties (timestamps+side data) extracted from the last packet passed | ||
88 | * for decoding. | ||
89 | */ | ||
90 | AVPacket *last_pkt_props; | ||
91 | |||
92 | /** | ||
93 | * temporary buffer used for encoders to store their bitstream | ||
94 | */ | ||
95 | uint8_t *byte_buffer; | ||
96 | unsigned int byte_buffer_size; | ||
97 | |||
98 | /** | ||
99 | * This is set to AV_PKT_FLAG_KEY for encoders that encode intra-only | ||
100 | * formats (i.e. whose codec descriptor has AV_CODEC_PROP_INTRA_ONLY set). | ||
101 | * This is used to set said flag generically for said encoders. | ||
102 | */ | ||
103 | int intra_only_flag; | ||
104 | |||
105 | void *frame_thread_encoder; | ||
106 | |||
107 | /** | ||
108 | * The input frame is stored here for encoders implementing the simple | ||
109 | * encode API. | ||
110 | * | ||
111 | * Not allocated in other cases. | ||
112 | */ | ||
113 | AVFrame *in_frame; | ||
114 | |||
115 | /** | ||
116 | * When the AV_CODEC_FLAG_RECON_FRAME flag is used. the encoder should store | ||
117 | * here the reconstructed frame corresponding to the last returned packet. | ||
118 | * | ||
119 | * Not allocated in other cases. | ||
120 | */ | ||
121 | AVFrame *recon_frame; | ||
122 | |||
123 | /** | ||
124 | * If this is set, then FFCodec->close (if existing) needs to be called | ||
125 | * for the parent AVCodecContext. | ||
126 | */ | ||
127 | int needs_close; | ||
128 | |||
129 | /** | ||
130 | * Number of audio samples to skip at the start of the next decoded frame | ||
131 | */ | ||
132 | int skip_samples; | ||
133 | |||
134 | /** | ||
135 | * hwaccel-specific private data | ||
136 | */ | ||
137 | void *hwaccel_priv_data; | ||
138 | |||
139 | /** | ||
140 | * checks API usage: after codec draining, flush is required to resume operation | ||
141 | */ | ||
142 | int draining; | ||
143 | |||
144 | /** | ||
145 | * Temporary buffers for newly received or not yet output packets/frames. | ||
146 | */ | ||
147 | AVPacket *buffer_pkt; | ||
148 | AVFrame *buffer_frame; | ||
149 | int draining_done; | ||
150 | |||
151 | int showed_multi_packet_warning; | ||
152 | |||
153 | /* to prevent infinite loop on errors when draining */ | ||
154 | int nb_draining_errors; | ||
155 | |||
156 | /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */ | ||
157 | int changed_frames_dropped; | ||
158 | int initial_format; | ||
159 | int initial_width, initial_height; | ||
160 | int initial_sample_rate; | ||
161 | AVChannelLayout initial_ch_layout; | ||
162 | |||
163 | #if CONFIG_LCMS2 | ||
164 | FFIccContext icc; /* used to read and write embedded ICC profiles */ | ||
165 | #endif | ||
166 | } AVCodecInternal; | ||
167 | |||
168 | /** | ||
169 | * Return the index into tab at which {a,b} match elements {[0],[1]} of tab. | ||
170 | * If there is no such matching pair then size is returned. | ||
171 | */ | ||
172 | int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b); | ||
173 | |||
174 | unsigned int ff_toupper4(unsigned int x); | ||
175 | |||
176 | void ff_color_frame(AVFrame *frame, const int color[4]); | ||
177 | |||
178 | /** | ||
179 | * Maximum size in bytes of extradata. | ||
180 | * This value was chosen such that every bit of the buffer is | ||
181 | * addressable by a 32-bit signed integer as used by get_bits. | ||
182 | */ | ||
183 | #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE) | ||
184 | |||
185 | /** | ||
186 | * 2^(x) for integer x | ||
187 | * @return correctly rounded float | ||
188 | */ | ||
189 | 178647 | static av_always_inline float ff_exp2fi(int x) { | |
190 | /* Normal range */ | ||
191 |
2/4✓ Branch 0 taken 178647 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 178647 times.
✗ Branch 3 not taken.
|
178647 | if (-126 <= x && x <= 128) |
192 | 178647 | return av_int2float((x+127) << 23); | |
193 | /* Too large */ | ||
194 | ✗ | else if (x > 128) | |
195 | ✗ | return INFINITY; | |
196 | /* Subnormal numbers */ | ||
197 | ✗ | else if (x > -150) | |
198 | ✗ | return av_int2float(1 << (x+149)); | |
199 | /* Negligibly small */ | ||
200 | else | ||
201 | ✗ | return 0; | |
202 | } | ||
203 | |||
204 | int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx); | ||
205 | |||
206 | int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec); | ||
207 | |||
208 | /** | ||
209 | * Add a CPB properties side data to an encoding context. | ||
210 | */ | ||
211 | AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx); | ||
212 | |||
213 | /** | ||
214 | * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info | ||
215 | * | ||
216 | * @param frame Raw frame to get S12M timecode side data from | ||
217 | * @param rate The frame rate | ||
218 | * @param prefix_len Number of bytes to allocate before SEI message | ||
219 | * @param data Pointer to a variable to store allocated memory | ||
220 | * Upon return the variable will hold NULL on error or if frame has no S12M timecode info. | ||
221 | * Otherwise it will point to prefix_len uninitialized bytes followed by | ||
222 | * *sei_size SEI message | ||
223 | * @param sei_size Pointer to a variable to store generated SEI message length | ||
224 | * @return Zero on success, negative error code on failure | ||
225 | */ | ||
226 | int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, | ||
227 | void **data, size_t *sei_size); | ||
228 | |||
229 | /** | ||
230 | * Get an estimated video bitrate based on frame size, frame rate and coded | ||
231 | * bits per pixel. | ||
232 | */ | ||
233 | int64_t ff_guess_coded_bitrate(AVCodecContext *avctx); | ||
234 | |||
235 | /** | ||
236 | * Check if a value is in the list. If not, return the default value | ||
237 | * | ||
238 | * @param ctx Context for the log msg | ||
239 | * @param val_name Name of the checked value, for log msg | ||
240 | * @param array_valid_values Array of valid int, ended with INT_MAX | ||
241 | * @param default_value Value return if checked value is not in the array | ||
242 | * @return Value or default_value. | ||
243 | */ | ||
244 | int ff_int_from_list_or_default(void *ctx, const char * val_name, int val, | ||
245 | const int * array_valid_values, int default_value); | ||
246 | |||
247 | #endif /* AVCODEC_INTERNAL_H */ | ||
248 |