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 | * Audio encoders can set this flag during init to indicate that they | ||
61 | * want the small last frame to be padded to a multiple of pad_samples. | ||
62 | */ | ||
63 | int pad_samples; | ||
64 | |||
65 | AVBufferRef *pool; | ||
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 | */ | ||
77 | AVPacket *in_pkt; | ||
78 | struct AVBSFContext *bsf; | ||
79 | |||
80 | /** | ||
81 | * Properties (timestamps+side data) extracted from the last packet passed | ||
82 | * for decoding. | ||
83 | */ | ||
84 | AVPacket *last_pkt_props; | ||
85 | |||
86 | /** | ||
87 | * temporary buffer used for encoders to store their bitstream | ||
88 | */ | ||
89 | uint8_t *byte_buffer; | ||
90 | unsigned int byte_buffer_size; | ||
91 | |||
92 | void *frame_thread_encoder; | ||
93 | |||
94 | /** | ||
95 | * The input frame is stored here for encoders implementing the simple | ||
96 | * encode API. | ||
97 | * | ||
98 | * Not allocated in other cases. | ||
99 | */ | ||
100 | AVFrame *in_frame; | ||
101 | |||
102 | /** | ||
103 | * When the AV_CODEC_FLAG_RECON_FRAME flag is used. the encoder should store | ||
104 | * here the reconstructed frame corresponding to the last returned packet. | ||
105 | * | ||
106 | * Not allocated in other cases. | ||
107 | */ | ||
108 | AVFrame *recon_frame; | ||
109 | |||
110 | /** | ||
111 | * If this is set, then FFCodec->close (if existing) needs to be called | ||
112 | * for the parent AVCodecContext. | ||
113 | */ | ||
114 | int needs_close; | ||
115 | |||
116 | /** | ||
117 | * Number of audio samples to skip at the start of the next decoded frame | ||
118 | */ | ||
119 | int skip_samples; | ||
120 | |||
121 | /** | ||
122 | * hwaccel-specific private data | ||
123 | */ | ||
124 | void *hwaccel_priv_data; | ||
125 | |||
126 | /** | ||
127 | * checks API usage: after codec draining, flush is required to resume operation | ||
128 | */ | ||
129 | int draining; | ||
130 | |||
131 | /** | ||
132 | * Temporary buffers for newly received or not yet output packets/frames. | ||
133 | */ | ||
134 | AVPacket *buffer_pkt; | ||
135 | AVFrame *buffer_frame; | ||
136 | int draining_done; | ||
137 | |||
138 | #if FF_API_DROPCHANGED | ||
139 | /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */ | ||
140 | int changed_frames_dropped; | ||
141 | int initial_format; | ||
142 | int initial_width, initial_height; | ||
143 | int initial_sample_rate; | ||
144 | AVChannelLayout initial_ch_layout; | ||
145 | #endif | ||
146 | |||
147 | #if CONFIG_LCMS2 | ||
148 | FFIccContext icc; /* used to read and write embedded ICC profiles */ | ||
149 | #endif | ||
150 | } AVCodecInternal; | ||
151 | |||
152 | /** | ||
153 | * Return the index into tab at which {a,b} match elements {[0],[1]} of tab. | ||
154 | * If there is no such matching pair then size is returned. | ||
155 | */ | ||
156 | int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b); | ||
157 | |||
158 | unsigned int ff_toupper4(unsigned int x); | ||
159 | |||
160 | /** | ||
161 | * 2^(x) for integer x | ||
162 | * @return correctly rounded float | ||
163 | */ | ||
164 | 178768 | static av_always_inline float ff_exp2fi(int x) { | |
165 | /* Normal range */ | ||
166 |
2/4✓ Branch 0 taken 178768 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 178768 times.
✗ Branch 3 not taken.
|
178768 | if (-126 <= x && x <= 128) |
167 | 178768 | return av_int2float((x+127) << 23); | |
168 | /* Too large */ | ||
169 | ✗ | else if (x > 128) | |
170 | ✗ | return INFINITY; | |
171 | /* Subnormal numbers */ | ||
172 | ✗ | else if (x > -150) | |
173 | ✗ | return av_int2float(1 << (x+149)); | |
174 | /* Negligibly small */ | ||
175 | else | ||
176 | ✗ | return 0; | |
177 | } | ||
178 | |||
179 | int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx); | ||
180 | |||
181 | int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec); | ||
182 | |||
183 | /** | ||
184 | * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info | ||
185 | * | ||
186 | * @param frame Raw frame to get S12M timecode side data from | ||
187 | * @param rate The frame rate | ||
188 | * @param prefix_len Number of bytes to allocate before SEI message | ||
189 | * @param data Pointer to a variable to store allocated memory | ||
190 | * Upon return the variable will hold NULL on error or if frame has no S12M timecode info. | ||
191 | * Otherwise it will point to prefix_len uninitialized bytes followed by | ||
192 | * *sei_size SEI message | ||
193 | * @param sei_size Pointer to a variable to store generated SEI message length | ||
194 | * @return Zero on success, negative error code on failure | ||
195 | */ | ||
196 | int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, | ||
197 | void **data, size_t *sei_size); | ||
198 | |||
199 | /** | ||
200 | * Get an estimated video bitrate based on frame size, frame rate and coded | ||
201 | * bits per pixel. | ||
202 | */ | ||
203 | int64_t ff_guess_coded_bitrate(AVCodecContext *avctx); | ||
204 | |||
205 | #endif /* AVCODEC_INTERNAL_H */ | ||
206 |