/src/ffmpeg/libavcodec/mpegvideoenc.h
Line | Count | Source |
1 | | /* |
2 | | * Generic DCT based hybrid video encoder |
3 | | * Copyright (c) 2000, 2001, 2002 Fabrice Bellard |
4 | | * Copyright (c) 2002-2004 Michael Niedermayer |
5 | | * |
6 | | * This file is part of FFmpeg. |
7 | | * |
8 | | * FFmpeg is free software; you can redistribute it and/or |
9 | | * modify it under the terms of the GNU Lesser General Public |
10 | | * License as published by the Free Software Foundation; either |
11 | | * version 2.1 of the License, or (at your option) any later version. |
12 | | * |
13 | | * FFmpeg is distributed in the hope that it will be useful, |
14 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | | * Lesser General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU Lesser General Public |
19 | | * License along with FFmpeg; if not, write to the Free Software |
20 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | | */ |
22 | | |
23 | | /** |
24 | | * @file |
25 | | * mpegvideo header. |
26 | | */ |
27 | | |
28 | | #ifndef AVCODEC_MPEGVIDEOENC_H |
29 | | #define AVCODEC_MPEGVIDEOENC_H |
30 | | |
31 | | #include <float.h> |
32 | | |
33 | | #include "libavutil/avassert.h" |
34 | | #include "libavutil/mem_internal.h" |
35 | | #include "libavutil/opt.h" |
36 | | #include "fdctdsp.h" |
37 | | #include "motion_est.h" |
38 | | #include "mpegvideo.h" |
39 | | #include "mpegvideoencdsp.h" |
40 | | #include "pixblockdsp.h" |
41 | | #include "put_bits.h" |
42 | | #include "ratecontrol.h" |
43 | | |
44 | 549k | #define MPVENC_MAX_B_FRAMES 16 |
45 | | |
46 | | typedef struct MPVEncContext { |
47 | | MpegEncContext c; ///< the common base context |
48 | | |
49 | | /** bit output */ |
50 | | PutBitContext pb; |
51 | | |
52 | | unsigned int lambda; ///< Lagrange multiplier used in rate distortion |
53 | | unsigned int lambda2; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT |
54 | | int *lambda_table; |
55 | | int adaptive_quant; ///< use adaptive quantization |
56 | | int dquant; ///< qscale difference to prev qscale |
57 | | int skipdct; ///< skip dct and code zero residual |
58 | | |
59 | | int quantizer_noise_shaping; |
60 | | |
61 | | int luma_elim_threshold; |
62 | | int chroma_elim_threshold; |
63 | | |
64 | | int mpv_flags; ///< flags set by private options |
65 | | /// Bitfield containing information which frames to reconstruct. |
66 | | int frame_reconstruction_bitfield; |
67 | | |
68 | | /** |
69 | | * Reference to the source picture. |
70 | | */ |
71 | | AVFrame *new_pic; |
72 | | |
73 | | struct MPVMainEncContext *parent; |
74 | | |
75 | | FDCTDSPContext fdsp; |
76 | | MpegvideoEncDSPContext mpvencdsp; |
77 | | PixblockDSPContext pdsp; |
78 | | MotionEstContext me; |
79 | | |
80 | | int f_code; ///< forward MV resolution |
81 | | int b_code; ///< backward MV resolution for B-frames |
82 | | |
83 | | int16_t (*p_mv_table)[2]; ///< MV table (1MV per MB) P-frame |
84 | | int16_t (*b_forw_mv_table)[2]; ///< MV table (1MV per MB) forward mode B-frame |
85 | | int16_t (*b_back_mv_table)[2]; ///< MV table (1MV per MB) backward mode B-frame |
86 | | int16_t (*b_bidir_forw_mv_table)[2]; ///< MV table (1MV per MB) bidir mode B-frame |
87 | | int16_t (*b_bidir_back_mv_table)[2]; ///< MV table (1MV per MB) bidir mode B-frame |
88 | | int16_t (*b_direct_mv_table)[2]; ///< MV table (1MV per MB) direct mode B-frame |
89 | | int16_t (*b_field_mv_table[2][2][2])[2];///< MV table (4MV per MB) interlaced B-frame |
90 | | uint8_t (*p_field_select_table[2]); ///< Only the first element is allocated |
91 | | uint8_t (*b_field_select_table[2][2]); ///< allocated jointly with p_field_select_table |
92 | | |
93 | | uint16_t *mb_type; ///< Table for candidate MB types |
94 | | uint16_t *mb_var; ///< Table for MB variances |
95 | | uint16_t *mc_mb_var; ///< Table for motion compensated MB variances |
96 | | uint8_t *mb_mean; ///< Table for MB luminance |
97 | | uint64_t encoding_error[MPV_MAX_PLANES]; |
98 | | |
99 | | int intra_quant_bias; ///< bias for the quantizer |
100 | | int inter_quant_bias; ///< bias for the quantizer |
101 | | int min_qcoeff; ///< minimum encodable coefficient |
102 | | int max_qcoeff; ///< maximum encodable coefficient |
103 | | int ac_esc_length; ///< num of bits needed to encode the longest esc |
104 | | const uint8_t *intra_ac_vlc_length; |
105 | | const uint8_t *intra_ac_vlc_last_length; |
106 | | const uint8_t *intra_chroma_ac_vlc_length; |
107 | | const uint8_t *intra_chroma_ac_vlc_last_length; |
108 | | const uint8_t *inter_ac_vlc_length; |
109 | | const uint8_t *inter_ac_vlc_last_length; |
110 | | const uint8_t *luma_dc_vlc_length; |
111 | | |
112 | | int coded_score[12]; |
113 | | |
114 | | int16_t (*block)[64]; ///< points into blocks below |
115 | | |
116 | | /** precomputed matrix (combine qscale and DCT renorm) */ |
117 | | int (*q_intra_matrix)[64]; |
118 | | int (*q_chroma_intra_matrix)[64]; |
119 | | int (*q_inter_matrix)[64]; |
120 | | /** identical to the above but for MMX & these are not permutated, second 64 entries are bias*/ |
121 | | uint16_t (*q_intra_matrix16)[2][64]; |
122 | | uint16_t (*q_chroma_intra_matrix16)[2][64]; |
123 | | uint16_t (*q_inter_matrix16)[2][64]; |
124 | | |
125 | | /* noise reduction */ |
126 | | int (*dct_error_sum)[64]; |
127 | | int dct_count[2]; |
128 | | uint16_t (*dct_offset)[64]; |
129 | | |
130 | | int picture_number; |
131 | | |
132 | | /* statistics, used for 2-pass encoding */ |
133 | | int mv_bits; |
134 | | int i_tex_bits; |
135 | | int p_tex_bits; |
136 | | int i_count; |
137 | | int misc_bits; ///< cbp, mb_type |
138 | | int last_bits; ///< temp var used for calculating the above vars |
139 | | |
140 | | int mb_skip_run; |
141 | | int last_dc[3]; ///< last DC values |
142 | | |
143 | | /* H.263 specific */ |
144 | | int gob_index; |
145 | | int mb_info; ///< interval for outputting info about mb offsets as side data |
146 | | int prev_mb_info, last_mb_info; |
147 | | int mb_info_size; |
148 | | uint8_t *mb_info_ptr; |
149 | | |
150 | | /* H.263+ specific */ |
151 | | int umvplus; ///< == H.263+ && unrestricted_mv |
152 | | int h263_slice_structured; |
153 | | int alt_inter_vlc; ///< alternative inter vlc |
154 | | int modified_quant; |
155 | | int loop_filter; |
156 | | |
157 | | /* MJPEG specific */ |
158 | | struct MJpegContext *mjpeg_ctx; |
159 | | int esc_pos; |
160 | | |
161 | | /* MPEG-1 specific */ |
162 | | int last_mv_dir; ///< last mv_dir, used for B-frame encoding |
163 | | |
164 | | /* MPEG-4 specific */ |
165 | | int data_partitioning; ///< data partitioning flag, set via option |
166 | | int partitioned_frame; ///< is current frame partitioned |
167 | | int mpeg_quant; |
168 | | PutBitContext tex_pb; ///< used for data partitioned VOPs |
169 | | PutBitContext pb2; ///< used for data partitioned VOPs |
170 | | |
171 | | /* MSMPEG4 specific */ |
172 | | int slice_height; ///< in macroblocks |
173 | | int flipflop_rounding; ///< also used for MPEG-4, H.263+ |
174 | | int esc3_level_length; |
175 | | |
176 | | /* RTP specific */ |
177 | | int rtp_mode; |
178 | | int rtp_payload_size; |
179 | | int error_rate; |
180 | | |
181 | | uint8_t *ptr_lastgob; |
182 | | |
183 | | void (*encode_mb)(struct MPVEncContext *s, int16_t block[][64], |
184 | | int motion_x, int motion_y); |
185 | | |
186 | | int (*dct_quantize)(struct MPVEncContext *s, int16_t *block/*align 16*/, int n, int qscale, int *overflow); |
187 | | |
188 | | me_cmp_func ildct_cmp[2]; ///< 0 = intra, 1 = non-intra |
189 | | me_cmp_func n_sse_cmp[2]; ///< either SSE or NSSE cmp func |
190 | | me_cmp_func sad_cmp[2]; |
191 | | me_cmp_func sse_cmp[2]; |
192 | | int (*sum_abs_dctelem)(const int16_t *block); |
193 | | |
194 | | int intra_penalty; |
195 | | |
196 | | DECLARE_ALIGNED_32(int16_t, blocks)[2][12][64]; // for HQ mode we need to keep the best block |
197 | | } MPVEncContext; |
198 | | |
199 | | typedef struct MPVMainEncContext { |
200 | | MPVEncContext s; ///< The main slicecontext |
201 | | |
202 | | int intra_only; ///< if true, only intra pictures are generated |
203 | | int gop_size; |
204 | | int max_b_frames; ///< max number of B-frames |
205 | | int picture_in_gop_number; ///< 0-> first pic in gop, ... |
206 | | int input_picture_number; ///< used to set pic->display_picture_number |
207 | | int coded_picture_number; ///< used to set pic->coded_picture_number |
208 | | |
209 | | MPVPicture *input_picture[MPVENC_MAX_B_FRAMES + 1]; ///< next pictures in display order |
210 | | MPVPicture *reordered_input_picture[MPVENC_MAX_B_FRAMES + 1]; ///< next pictures in coded order |
211 | | |
212 | | int64_t user_specified_pts; ///< last non-zero pts from user-supplied AVFrame |
213 | | /** |
214 | | * pts difference between the first and second input frame, used for |
215 | | * calculating dts of the first frame when there's a delay */ |
216 | | int64_t dts_delta; |
217 | | /** |
218 | | * reordered pts to be used as dts for the next output frame when there's |
219 | | * a delay */ |
220 | | int64_t reordered_pts; |
221 | | |
222 | | /// temporary frames used by b_frame_strategy = 2 |
223 | | AVFrame *tmp_frames[MPVENC_MAX_B_FRAMES + 2]; |
224 | | int b_frame_strategy; |
225 | | int b_sensitivity; |
226 | | int brd_scale; |
227 | | |
228 | | int scenechange_threshold; |
229 | | |
230 | | int noise_reduction; |
231 | | |
232 | | float border_masking; |
233 | | int lmin, lmax; |
234 | | int vbv_ignore_qmax; |
235 | | |
236 | | /* MPEG-1/2 specific */ |
237 | | int vbv_delay_pos; ///< offset of vbv_delay in the bitstream |
238 | | |
239 | | const uint8_t *fcode_tab; ///< smallest fcode needed for each MV |
240 | | |
241 | | /* frame skip options */ |
242 | | int frame_skip_threshold; |
243 | | int frame_skip_factor; |
244 | | int frame_skip_exp; |
245 | | int frame_skip_cmp; |
246 | | me_cmp_func frame_skip_cmp_fn; |
247 | | |
248 | | int (*encode_picture_header)(struct MPVMainEncContext *m); |
249 | | |
250 | | /* bit rate control */ |
251 | | int64_t bit_rate; |
252 | | int64_t total_bits; |
253 | | int frame_bits; ///< bits used for the current frame |
254 | | int header_bits; |
255 | | int stuffing_bits; ///< bits used for stuffing |
256 | | int next_lambda; ///< next lambda used for retrying to encode a frame |
257 | | int fixed_qscale; ///< fixed qscale if non zero |
258 | | int last_lambda_for[5]; ///< last lambda for a specific pict type |
259 | | int last_pict_type; //FIXME removes |
260 | | int last_non_b_pict_type; ///< used for MPEG-4 gmc B-frames & ratecontrol |
261 | | RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c |
262 | | |
263 | | int me_penalty_compensation; |
264 | | int me_pre; ///< prepass for motion estimation |
265 | | |
266 | | int64_t mb_var_sum; ///< sum of MB variance for current frame |
267 | | int64_t mc_mb_var_sum; ///< motion compensated MB variance for current frame |
268 | | |
269 | | char *me_map_base; ///< backs MotionEstContext.(map|score_map) |
270 | | char *dct_error_sum_base; ///< backs dct_error_sum |
271 | | int16_t (*mv_table_base)[2]; |
272 | | } MPVMainEncContext; |
273 | | |
274 | | static inline const MPVMainEncContext *slice_to_mainenc(const MPVEncContext *s) |
275 | 1.49k | { |
276 | | #ifdef NO_SLICE_THREADING_HERE |
277 | 1.49k | av_assert2(s->c.slice_context_count <= 1 && |
278 | | !(s->c.avctx->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS)); |
279 | | return (const MPVMainEncContext*)s; |
280 | | #else |
281 | | return s->parent; |
282 | | #endif |
283 | 1.49k | } Unexecuted instantiation: ituh263enc.c:slice_to_mainenc Unexecuted instantiation: mpegvideo_enc.c:slice_to_mainenc msmpeg4enc.c:slice_to_mainenc Line | Count | Source | 275 | 1.49k | { | 276 | 1.49k | #ifdef NO_SLICE_THREADING_HERE | 277 | 1.49k | av_assert2(s->c.slice_context_count <= 1 && | 278 | 1.49k | !(s->c.avctx->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS)); | 279 | 1.49k | return (const MPVMainEncContext*)s; | 280 | | #else | 281 | | return s->parent; | 282 | | #endif | 283 | 1.49k | } |
Unexecuted instantiation: ratecontrol.c:slice_to_mainenc Unexecuted instantiation: rv10enc.c:slice_to_mainenc Unexecuted instantiation: rv20enc.c:slice_to_mainenc Unexecuted instantiation: speedhqenc.c:slice_to_mainenc Unexecuted instantiation: flvenc.c:slice_to_mainenc Unexecuted instantiation: h261enc.c:slice_to_mainenc Unexecuted instantiation: me_cmp.c:slice_to_mainenc Unexecuted instantiation: mjpegenc.c:slice_to_mainenc Unexecuted instantiation: motion_est.c:slice_to_mainenc Unexecuted instantiation: mpeg12enc.c:slice_to_mainenc Unexecuted instantiation: mpeg4videoenc.c:slice_to_mainenc Unexecuted instantiation: wmv2enc.c:slice_to_mainenc Unexecuted instantiation: svq1enc.c:slice_to_mainenc Unexecuted instantiation: dnxhdenc.c:slice_to_mainenc Unexecuted instantiation: snowenc.c:slice_to_mainenc |
284 | | |
285 | 115 | #define MAX_FCODE 7 |
286 | 27.5M | #define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level)) |
287 | 51.8k | #define INPLACE_OFFSET 16 |
288 | | |
289 | | /* MB types for encoding */ |
290 | 11.3M | #define CANDIDATE_MB_TYPE_INTRA (1 << 0) |
291 | 819k | #define CANDIDATE_MB_TYPE_INTER (1 << 1) |
292 | 381k | #define CANDIDATE_MB_TYPE_INTER4V (1 << 2) |
293 | 0 | #define CANDIDATE_MB_TYPE_SKIPPED (1 << 3) |
294 | | |
295 | 0 | #define CANDIDATE_MB_TYPE_DIRECT (1 << 4) |
296 | 0 | #define CANDIDATE_MB_TYPE_FORWARD (1 << 5) |
297 | 0 | #define CANDIDATE_MB_TYPE_BACKWARD (1 << 6) |
298 | 0 | #define CANDIDATE_MB_TYPE_BIDIR (1 << 7) |
299 | | |
300 | 0 | #define CANDIDATE_MB_TYPE_INTER_I (1 << 8) |
301 | 0 | #define CANDIDATE_MB_TYPE_FORWARD_I (1 << 9) |
302 | 0 | #define CANDIDATE_MB_TYPE_BACKWARD_I (1 << 10) |
303 | 0 | #define CANDIDATE_MB_TYPE_BIDIR_I (1 << 11) |
304 | | |
305 | 0 | #define CANDIDATE_MB_TYPE_DIRECT0 (1 << 12) |
306 | | |
307 | | /* mpegvideo_enc common options */ |
308 | 0 | #define FF_MPV_FLAG_SKIP_RD 0x0001 |
309 | 0 | #define FF_MPV_FLAG_STRICT_GOP 0x0002 |
310 | 8.12M | #define FF_MPV_FLAG_QP_RD 0x0004 |
311 | 4.06M | #define FF_MPV_FLAG_CBP_RD 0x0008 |
312 | 0 | #define FF_MPV_FLAG_NAQ 0x0010 |
313 | 923k | #define FF_MPV_FLAG_MV0 0x0020 |
314 | | |
315 | | #define FF_MPV_OPT_CMP_FUNC \ |
316 | | { "sad", "Sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
317 | | { "sse", "Sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
318 | | { "satd", "Sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
319 | | { "dct", "Sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
320 | | { "psnr", "Sum of squared quantization errors, low quality", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_PSNR }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
321 | | { "bit", "Number of bits needed for the block", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_BIT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
322 | | { "rd", "Rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
323 | | { "zero", "Zero", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
324 | | { "vsad", "Sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
325 | | { "vsse", "Sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
326 | | { "nsse", "Noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
327 | | { "dct264", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT264 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
328 | | { "dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
329 | | { "chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
330 | | { "msad", "Sum of absolute differences, median predicted", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_MEDIAN_SAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" } |
331 | | |
332 | | #define FF_MPV_OFFSET(x) offsetof(MPVEncContext, x) |
333 | | #define FF_MPV_MAIN_OFFSET(x) offsetof(MPVMainEncContext, x) |
334 | | #define FF_RC_OFFSET(x) offsetof(MPVMainEncContext, rc_context.x) |
335 | | #define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) |
336 | | #define FF_MPV_COMMON_OPTS \ |
337 | | FF_MPV_OPT_CMP_FUNC, \ |
338 | | { "mpv_flags", "Flags common for all mpegvideo-based encoders.", FF_MPV_OFFSET(mpv_flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
339 | | { "skip_rd", "RD optimal MB level residual skipping", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_SKIP_RD }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
340 | | { "strict_gop", "Strictly enforce gop size", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_STRICT_GOP }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
341 | | { "qp_rd", "Use rate distortion optimization for qp selection", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_QP_RD }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
342 | | { "cbp_rd", "use rate distortion optimization for CBP", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_CBP_RD }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
343 | | { "naq", "normalize adaptive quantization", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_NAQ }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
344 | | { "luma_elim_threshold", "single coefficient elimination threshold for luminance (negative values also consider dc coefficient)",\ |
345 | | FF_MPV_OFFSET(luma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\ |
346 | | { "chroma_elim_threshold", "single coefficient elimination threshold for chrominance (negative values also consider dc coefficient)",\ |
347 | | FF_MPV_OFFSET(chroma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\ |
348 | | { "quantizer_noise_shaping", NULL, FF_MPV_OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\ |
349 | | { "error_rate", "Simulate errors in the bitstream to test error concealment.", \ |
350 | | FF_MPV_OFFSET(error_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\ |
351 | | {"qsquish", "how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function)", \ |
352 | | FF_RC_OFFSET(qsquish), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, 0, 99, FF_MPV_OPT_FLAGS}, \ |
353 | | {"rc_qmod_amp", "experimental quantizer modulation", FF_RC_OFFSET(qmod_amp), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
354 | | {"rc_qmod_freq", "experimental quantizer modulation", FF_RC_OFFSET(qmod_freq), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS}, \ |
355 | | {"rc_eq", "Set rate control equation. When computing the expression, besides the standard functions " \ |
356 | | "defined in the section 'Expression Evaluation', the following functions are available: " \ |
357 | | "bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv " \ |
358 | | "fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.", \ |
359 | | FF_RC_OFFSET(rc_eq), AV_OPT_TYPE_STRING, .flags = FF_MPV_OPT_FLAGS }, \ |
360 | | {"rc_init_cplx", "initial complexity for 1-pass encoding", FF_RC_OFFSET(initial_cplx), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
361 | | {"rc_buf_aggressivity", "currently useless", FF_RC_OFFSET(buffer_aggressivity), AV_OPT_TYPE_FLOAT, {.dbl = 1.0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
362 | | {"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_MAIN_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
363 | | {"lmin", "minimum Lagrange factor (VBR)", FF_MPV_MAIN_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
364 | | {"lmax", "maximum Lagrange factor (VBR)", FF_MPV_MAIN_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
365 | | {"skip_threshold", "Frame skip threshold", FF_MPV_MAIN_OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
366 | | {"skip_factor", "Frame skip factor", FF_MPV_MAIN_OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
367 | | {"skip_exp", "Frame skip exponent", FF_MPV_MAIN_OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
368 | | {"skip_cmp", "Frame skip compare function", FF_MPV_MAIN_OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
369 | | {"noise_reduction", "Noise reduction", FF_MPV_MAIN_OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
370 | | {"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
371 | | |
372 | | #define FF_MPV_COMMON_BFRAME_OPTS \ |
373 | | {"b_strategy", "Strategy to choose between I/P/B-frames", FF_MPV_MAIN_OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, FF_MPV_OPT_FLAGS }, \ |
374 | | {"b_sensitivity", "Adjust sensitivity of b_frame_strategy 1", FF_MPV_MAIN_OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
375 | | {"brd_scale", "Downscale frames for dynamic B-frame decision", FF_MPV_MAIN_OFFSET(brd_scale), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 3, FF_MPV_OPT_FLAGS }, |
376 | | |
377 | | #define FF_MPV_COMMON_MOTION_EST_OPTS \ |
378 | | { "mv0", "always try a mb with mv=<0,0>", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_MV0 }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\ |
379 | | {"motion_est", "motion estimation algorithm", FF_MPV_OFFSET(me.motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \ |
380 | | { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \ |
381 | | { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \ |
382 | | { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \ |
383 | | {"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)", FF_MPV_MAIN_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
384 | | {"mepre", "pre motion estimation", FF_MPV_MAIN_OFFSET(me_pre), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
385 | | {"intra_penalty", "Penalty for intra blocks in block decision", FF_MPV_OFFSET(intra_penalty), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX/2, FF_MPV_OPT_FLAGS }, \ |
386 | | {"sc_threshold", "Scene change threshold", FF_MPV_MAIN_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
387 | | |
388 | | extern const AVClass ff_mpv_enc_class; |
389 | | |
390 | | int ff_mpv_encode_init(AVCodecContext *avctx); |
391 | | |
392 | | int ff_mpv_encode_end(AVCodecContext *avctx); |
393 | | int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, |
394 | | const AVFrame *frame, int *got_packet); |
395 | | int ff_mpv_reallocate_putbitbuffer(MPVEncContext *s, size_t threshold, size_t size_increase); |
396 | | |
397 | | void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix); |
398 | | |
399 | | void ff_dct_encode_init(MPVEncContext *s); |
400 | | void ff_dct_encode_init_x86(MPVEncContext *s); |
401 | | |
402 | | void ff_convert_matrix(MPVEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[2][64], |
403 | | const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra); |
404 | | |
405 | | void ff_block_permute(int16_t *block, const uint8_t *permutation, |
406 | | const uint8_t *scantable, int last); |
407 | | |
408 | | static inline int get_bits_diff(MPVEncContext *s) |
409 | 4.16M | { |
410 | 4.16M | const int bits = put_bits_count(&s->pb); |
411 | 4.16M | const int last = s->last_bits; |
412 | | |
413 | 4.16M | s->last_bits = bits; |
414 | | |
415 | 4.16M | return bits - last; |
416 | 4.16M | } Unexecuted instantiation: ituh263enc.c:get_bits_diff Unexecuted instantiation: mpegvideo_enc.c:get_bits_diff msmpeg4enc.c:get_bits_diff Line | Count | Source | 409 | 2.36M | { | 410 | 2.36M | const int bits = put_bits_count(&s->pb); | 411 | 2.36M | const int last = s->last_bits; | 412 | | | 413 | 2.36M | s->last_bits = bits; | 414 | | | 415 | 2.36M | return bits - last; | 416 | 2.36M | } |
Unexecuted instantiation: ratecontrol.c:get_bits_diff Unexecuted instantiation: rv10enc.c:get_bits_diff Unexecuted instantiation: rv20enc.c:get_bits_diff speedhqenc.c:get_bits_diff Line | Count | Source | 409 | 77.6k | { | 410 | 77.6k | const int bits = put_bits_count(&s->pb); | 411 | 77.6k | const int last = s->last_bits; | 412 | | | 413 | 77.6k | s->last_bits = bits; | 414 | | | 415 | 77.6k | return bits - last; | 416 | 77.6k | } |
Unexecuted instantiation: flvenc.c:get_bits_diff Unexecuted instantiation: h261enc.c:get_bits_diff Unexecuted instantiation: me_cmp.c:get_bits_diff Line | Count | Source | 409 | 358k | { | 410 | 358k | const int bits = put_bits_count(&s->pb); | 411 | 358k | const int last = s->last_bits; | 412 | | | 413 | 358k | s->last_bits = bits; | 414 | | | 415 | 358k | return bits - last; | 416 | 358k | } |
Unexecuted instantiation: motion_est.c:get_bits_diff mpeg12enc.c:get_bits_diff Line | Count | Source | 409 | 640k | { | 410 | 640k | const int bits = put_bits_count(&s->pb); | 411 | 640k | const int last = s->last_bits; | 412 | | | 413 | 640k | s->last_bits = bits; | 414 | | | 415 | 640k | return bits - last; | 416 | 640k | } |
Unexecuted instantiation: mpeg4videoenc.c:get_bits_diff Line | Count | Source | 409 | 717k | { | 410 | 717k | const int bits = put_bits_count(&s->pb); | 411 | 717k | const int last = s->last_bits; | 412 | | | 413 | 717k | s->last_bits = bits; | 414 | | | 415 | 717k | return bits - last; | 416 | 717k | } |
Unexecuted instantiation: svq1enc.c:get_bits_diff Unexecuted instantiation: dnxhdenc.c:get_bits_diff Unexecuted instantiation: snowenc.c:get_bits_diff |
417 | | |
418 | | #endif |