2001-07-22 17:18:56 +03:00
/*
* Generic DCT based hybrid video encoder
2009-01-19 17:46:40 +02:00
* Copyright ( c ) 2000 , 2001 , 2002 Fabrice Bellard
2004-01-10 18:04:55 +02:00
* Copyright ( c ) 2002 - 2004 Michael Niedermayer
2001-07-22 17:18:56 +03:00
*
2006-10-07 18:30:46 +03:00
* This file is part of FFmpeg .
*
* FFmpeg is free software ; you can redistribute it and / or
2002-05-26 01:45:33 +03:00
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
2006-10-07 18:30:46 +03:00
* version 2.1 of the License , or ( at your option ) any later version .
2001-07-22 17:18:56 +03:00
*
2006-10-07 18:30:46 +03:00
* FFmpeg is distributed in the hope that it will be useful ,
2001-07-22 17:18:56 +03:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2002-05-26 01:45:33 +03:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
2001-07-22 17:18:56 +03:00
*
2002-05-26 01:45:33 +03:00
* You should have received a copy of the GNU Lesser General Public
2006-10-07 18:30:46 +03:00
* License along with FFmpeg ; if not , write to the Free Software
2006-01-13 00:43:26 +02:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-07-22 17:18:56 +03:00
*/
2003-03-06 13:32:04 +02:00
/**
2010-04-20 17:45:34 +03:00
* @ file
2003-03-06 13:32:04 +02:00
* mpegvideo header .
*/
2005-12-17 20:14:38 +02:00
2008-08-31 10:39:47 +03:00
# ifndef AVCODEC_MPEGVIDEO_H
# define AVCODEC_MPEGVIDEO_H
2002-05-27 19:42:14 +03:00
2013-10-27 15:51:16 +03:00
# include <float.h>
2011-07-06 21:08:30 +03:00
# include "avcodec.h"
2014-01-14 12:33:47 +03:00
# include "blockdsp.h"
2013-02-02 22:42:07 +03:00
# include "error_resilience.h"
2014-02-03 21:09:45 +03:00
# include "fdctdsp.h"
2009-04-13 19:20:26 +03:00
# include "get_bits.h"
2013-02-07 15:09:35 +03:00
# include "h264chroma.h"
2013-11-05 10:11:47 +03:00
# include "h263dsp.h"
2013-03-10 23:55:07 +03:00
# include "hpeldsp.h"
2014-01-24 13:55:16 +03:00
# include "idctdsp.h"
2015-07-20 19:24:19 +02:00
# include "internal.h"
2014-02-08 04:59:58 +03:00
# include "me_cmp.h"
2015-05-29 20:44:05 +02:00
# include "motion_est.h"
2015-06-08 14:00:49 +02:00
# include "mpegpicture.h"
2014-01-24 12:41:12 +03:00
# include "mpegvideodsp.h"
2013-12-30 21:19:39 +03:00
# include "mpegvideoencdsp.h"
2017-12-29 17:42:14 +02:00
# include "mpegvideodata.h"
2014-02-04 01:29:09 +03:00
# include "pixblockdsp.h"
2009-04-12 11:35:26 +03:00
# include "put_bits.h"
2006-09-29 22:39:19 +03:00
# include "ratecontrol.h"
2021-09-12 19:51:36 +02:00
# if FF_API_FLAG_TRUNCATED
2006-11-06 12:43:49 +02:00
# include "parser.h"
2021-09-12 19:51:36 +02:00
# endif
2015-05-31 15:49:55 +02:00
# include "mpegutils.h"
2008-03-05 02:06:09 +02:00
# include "mpeg12data.h"
2014-01-08 16:00:10 +03:00
# include "qpeldsp.h"
2012-11-21 23:34:46 +03:00
# include "thread.h"
2012-12-15 20:46:02 +03:00
# include "videodsp.h"
2003-02-10 11:35:32 +02:00
2012-02-27 14:12:19 +03:00
# include "libavutil/opt.h"
2012-12-21 19:18:43 +03:00
# include "libavutil/timecode.h"
2012-02-27 14:12:19 +03:00
2012-05-07 21:08:56 +03:00
# define MAX_THREADS 32
2002-03-22 04:21:17 +02:00
2013-10-27 18:46:01 +03:00
# define MAX_B_FRAMES 16
2003-03-06 16:37:37 +02:00
/**
* MpegEncContext .
*/
2001-07-22 17:18:56 +03:00
typedef struct MpegEncContext {
2011-08-27 09:26:14 +03:00
AVClass * class ;
2013-12-05 23:14:40 +03:00
int y_dc_scale , c_dc_scale ;
int ac_pred ;
int block_last_index [ 12 ] ; ///< last non zero coefficient in block
2016-04-27 19:45:23 +02:00
int h263_aic ; ///< Advanced INTRA Coding (AIC)
2013-12-05 23:14:40 +03:00
/* scantables */
2016-04-27 19:45:23 +02:00
ScanTable inter_scantable ; ///< if inter == intra then intra should be used to reduce the cache usage
2013-12-05 23:14:40 +03:00
ScanTable intra_scantable ;
ScanTable intra_h_scantable ;
ScanTable intra_v_scantable ;
/* WARNING: changes above this line require updates to hardcoded
2016-04-27 19:45:23 +02:00
* offsets used in ASM . */
2013-12-05 23:14:40 +03:00
2001-08-15 16:12:23 +03:00
struct AVCodecContext * avctx ;
2001-07-22 17:18:56 +03:00
/* the following parameters must be initialized before encoding */
2005-12-17 20:14:38 +02:00
int width , height ; ///< picture size. must be a multiple of 16
2001-07-22 17:18:56 +03:00
int gop_size ;
2005-12-17 20:14:38 +02:00
int intra_only ; ///< if true, only intra pictures are generated
2015-09-02 21:02:31 +02:00
int64_t bit_rate ; ///< wanted bit rate
2005-12-17 20:14:38 +02:00
enum OutputFormat out_format ; ///< output format
2016-04-27 19:45:23 +02:00
int h263_pred ; ///< use MPEG-4/H.263 ac/dc predictions
int pb_frame ; ///< PB-frame mode (0 = none, 1 = base, 2 = improved)
2002-04-27 15:30:26 +03:00
/* the following codec id fields are deprecated in favor of codec_id */
2016-04-27 19:45:23 +02:00
int h263_plus ; ///< H.263+ headers
int h263_flv ; ///< use flv H.263 header
2005-12-17 20:14:38 +02:00
2012-08-05 12:11:04 +03:00
enum AVCodecID codec_id ; /* see AV_CODEC_ID_xxx */
2005-12-17 20:14:38 +02:00
int fixed_qscale ; ///< fixed qscale if non zero
int encoding ; ///< true if we are encoding (vs decoding)
2016-04-27 19:45:23 +02:00
int max_b_frames ; ///< max number of B-frames for encoding
2002-06-02 15:20:39 +03:00
int luma_elim_threshold ;
int chroma_elim_threshold ;
2016-04-27 19:45:23 +02:00
int strict_std_compliance ; ///< strictly follow the std (MPEG-4, ...)
2005-12-17 20:14:38 +02:00
int workaround_bugs ; ///< workaround bugs in encoders which cannot be detected automatically
2006-11-07 11:46:57 +02:00
int codec_tag ; ///< internal codec_tag upper case converted from avctx codec_tag
2001-07-22 17:18:56 +03:00
/* the following fields are managed internally by the encoder */
/* sequence parameters */
int context_initialized ;
2007-06-12 12:29:25 +03:00
int input_picture_number ; ///< used to set pic->display_picture_number, should not be used for/by anything else
int coded_picture_number ; ///< used to set pic->coded_picture_number, should not be used for/by anything else
2003-12-30 00:25:08 +02:00
int picture_number ; //FIXME remove, unclear definition
2005-12-17 20:14:38 +02:00
int picture_in_gop_number ; ///< 0-> first pic in gop, ...
int mb_width , mb_height ; ///< number of MBs horizontally & vertically
2005-06-17 18:02:53 +03:00
int mb_stride ; ///< mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11
int b8_stride ; ///< 2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
int h_edge_pos , v_edge_pos ; ///< horizontal / vertical position of the right/bottom edge (pixel replication)
2005-12-17 20:14:38 +02:00
int mb_num ; ///< number of MBs of a picture
2013-09-28 03:13:59 +03:00
ptrdiff_t linesize ; ///< line size, in bytes, may be different from width
ptrdiff_t uvlinesize ; ///< line size, for chroma in bytes, may be different from width
2005-12-17 20:14:38 +02:00
Picture * picture ; ///< main picture buffer
2003-10-22 18:36:46 +03:00
Picture * * input_picture ; ///< next pictures on display order for encoding
2016-04-27 19:45:23 +02:00
Picture * * reordered_input_picture ; ///< pointer to the next pictures in coded order for encoding
2005-12-17 20:14:38 +02:00
2021-04-14 04:09:53 +02:00
int64_t user_specified_pts ; ///< last non-zero pts from AVFrame which was passed into avcodec_send_frame()
2012-02-10 12:30:05 +03:00
/**
* pts difference between the first and second input frame , used for
* calculating dts of the first frame when there ' s a delay */
int64_t dts_delta ;
/**
* reordered pts to be used as dts for the next output frame when there ' s
* a delay */
int64_t reordered_pts ;
2011-08-01 17:18:13 +03:00
2011-01-29 19:14:29 +02:00
/** bit output */
PutBitContext pb ;
2004-02-13 19:54:10 +02:00
int start_mb_y ; ///< start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
int end_mb_y ; ///< end mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
struct MpegEncContext * thread_context [ MAX_THREADS ] ;
2012-01-01 22:24:24 +03:00
int slice_context_count ; ///< number of used thread_contexts
2005-12-17 20:14:38 +02:00
/**
2003-03-16 22:22:22 +02:00
* copy of the previous picture structure .
* note , linesize & data , might not match the previous picture ( for field pictures )
*/
2005-12-17 20:14:38 +02:00
Picture last_picture ;
/**
2003-03-16 22:22:22 +02:00
* copy of the next picture structure .
* note , linesize & data , might not match the next picture ( for field pictures )
*/
Picture next_picture ;
2005-12-17 20:14:38 +02:00
/**
2003-03-16 22:22:22 +02:00
* copy of the source picture structure for encoding .
* note , linesize & data , might not match the source picture ( for field pictures )
*/
Picture new_picture ;
2005-12-17 20:14:38 +02:00
/**
2003-03-16 22:22:22 +02:00
* copy of the current picture structure .
* note , linesize & data , might not match the current picture ( for field pictures )
*/
2005-12-17 20:14:38 +02:00
Picture current_picture ; ///< buffer to store the decompressed current picture
2003-03-16 22:22:22 +02:00
Picture * last_picture_ptr ; ///< pointer to the previous picture.
2005-12-17 20:14:38 +02:00
Picture * next_picture_ptr ; ///< pointer to the next picture (for bidir pred)
2003-03-16 22:22:22 +02:00
Picture * current_picture_ptr ; ///< pointer to the current picture
2016-04-27 19:45:23 +02:00
int last_dc [ 3 ] ; ///< last DC values for MPEG-1
2006-09-28 01:13:44 +03:00
int16_t * dc_val_base ;
2016-04-27 19:45:23 +02:00
int16_t * dc_val [ 3 ] ; ///< used for MPEG-4 DC prediction, all 3 arrays must be continuous
2005-12-17 20:14:38 +02:00
const uint8_t * y_dc_scale_table ; ///< qscale -> y_dc_scale table
const uint8_t * c_dc_scale_table ; ///< qscale -> c_dc_scale table
2016-04-27 19:45:23 +02:00
const uint8_t * chroma_qscale_table ; ///< qscale -> chroma_qscale (H.263)
2004-04-16 04:01:45 +03:00
uint8_t * coded_block_base ;
2003-03-06 16:37:37 +02:00
uint8_t * coded_block ; ///< used for coded block pattern prediction (msmpeg4v3, wmv1)
2004-04-16 04:01:45 +03:00
int16_t ( * ac_val_base ) [ 16 ] ;
2016-06-21 21:55:20 +02:00
int16_t ( * ac_val [ 3 ] ) [ 16 ] ; ///< used for MPEG-4 AC prediction, all 3 arrays must be continuous
2005-12-17 20:14:38 +02:00
int mb_skipped ; ///< MUST BE SET only during DECODING
uint8_t * mbskip_table ; /**< used to avoid copy if macroblock skipped (for black regions for example)
2016-04-27 19:45:23 +02:00
and used for B - frame encoding & decoding ( contains skip table of next P - frame ) */
2005-12-17 20:14:38 +02:00
uint8_t * mbintra_table ; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding
uint8_t * cbp_table ; ///< used to store cbp, ac_pred for partitioned decoding
uint8_t * pred_dir_table ; ///< used to store pred_dir for partitioned decoding
2015-05-31 15:49:52 +02:00
ScratchpadContext sc ;
2001-07-22 17:18:56 +03:00
2005-12-17 20:14:38 +02:00
int qscale ; ///< QP
int chroma_qscale ; ///< chroma QP
2016-04-27 19:45:23 +02:00
unsigned int lambda ; ///< Lagrange multiplier used in rate distortion
2006-10-28 19:11:25 +03:00
unsigned int lambda2 ; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT
2003-10-07 14:32:40 +03:00
int * lambda_table ;
2005-12-17 20:14:38 +02:00
int adaptive_quant ; ///< use adaptive quantization
int dquant ; ///< qscale difference to prev qscale
2011-10-24 02:04:14 +03:00
int closed_gop ; ///< MPEG1/2 GOP is closed
2011-04-28 02:40:44 +03:00
int pict_type ; ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
2012-11-02 18:25:03 +03:00
int vbv_delay ;
2004-04-17 16:36:21 +03:00
int last_pict_type ; //FIXME removes
2016-04-27 19:45:23 +02:00
int last_non_b_pict_type ; ///< used for MPEG-4 gmc B-frames & ratecontrol
2012-12-07 12:25:27 +03:00
int droppable ;
2001-07-22 17:18:56 +03:00
int frame_rate_index ;
2012-10-04 16:25:30 +03:00
AVRational mpeg2_frame_rate_ext ;
2005-12-29 17:46:23 +02:00
int last_lambda_for [ 5 ] ; ///< last lambda for a specific pict type
2006-12-23 05:05:36 +02:00
int skipdct ; ///< skip dct and code zero residual
2004-03-01 16:55:21 +02:00
2001-07-22 17:18:56 +03:00
/* motion compensation */
2005-12-17 20:14:38 +02:00
int unrestricted_mv ; ///< mv can point outside of the coded picture
2016-04-27 19:45:23 +02:00
int h263_long_vectors ; ///< use horrible H.263v1 long vector mode
2003-03-06 16:37:37 +02:00
2014-01-14 12:33:47 +03:00
BlockDSPContext bdsp ;
2014-02-03 21:09:45 +03:00
FDCTDSPContext fdsp ;
2013-02-07 15:09:35 +03:00
H264ChromaContext h264chroma ;
2013-03-10 23:55:07 +03:00
HpelDSPContext hdsp ;
2014-01-24 13:55:16 +03:00
IDCTDSPContext idsp ;
2014-02-08 04:59:58 +03:00
MECmpContext mecc ;
2014-01-24 12:41:12 +03:00
MpegVideoDSPContext mdsp ;
2013-12-30 21:19:39 +03:00
MpegvideoEncDSPContext mpvencdsp ;
2014-02-04 01:29:09 +03:00
PixblockDSPContext pdsp ;
2014-01-08 16:00:10 +03:00
QpelDSPContext qdsp ;
2012-12-15 20:46:02 +03:00
VideoDSPContext vdsp ;
2013-11-05 10:11:47 +03:00
H263DSPContext h263dsp ;
2005-12-17 20:14:38 +02:00
int f_code ; ///< forward MV resolution
2016-04-27 19:45:23 +02:00
int b_code ; ///< backward MV resolution for B-frames (MPEG-4)
2003-04-10 16:18:38 +03:00
int16_t ( * p_mv_table_base ) [ 2 ] ;
int16_t ( * b_forw_mv_table_base ) [ 2 ] ;
int16_t ( * b_back_mv_table_base ) [ 2 ] ;
2005-12-17 20:14:38 +02:00
int16_t ( * b_bidir_forw_mv_table_base ) [ 2 ] ;
int16_t ( * b_bidir_back_mv_table_base ) [ 2 ] ;
2003-04-10 16:18:38 +03:00
int16_t ( * b_direct_mv_table_base ) [ 2 ] ;
2003-12-30 18:07:57 +02:00
int16_t ( * p_field_mv_table_base [ 2 ] [ 2 ] ) [ 2 ] ;
int16_t ( * b_field_mv_table_base [ 2 ] [ 2 ] [ 2 ] ) [ 2 ] ;
2016-04-27 19:45:23 +02:00
int16_t ( * p_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) P-frame encoding
int16_t ( * b_forw_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) forward mode B-frame encoding
int16_t ( * b_back_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) backward mode B-frame encoding
int16_t ( * b_bidir_forw_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) bidir mode B-frame encoding
int16_t ( * b_bidir_back_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) bidir mode B-frame encoding
int16_t ( * b_direct_mv_table ) [ 2 ] ; ///< MV table (1MV per MB) direct mode B-frame encoding
int16_t ( * p_field_mv_table [ 2 ] [ 2 ] ) [ 2 ] ; ///< MV table (2MV per MB) interlaced P-frame encoding
int16_t ( * b_field_mv_table [ 2 ] [ 2 ] [ 2 ] ) [ 2 ] ; ///< MV table (4MV per MB) interlaced B-frame encoding
2003-12-30 18:07:57 +02:00
uint8_t ( * p_field_select_table [ 2 ] ) ;
uint8_t ( * b_field_select_table [ 2 ] [ 2 ] ) ;
2015-07-07 02:20:43 +02:00
int motion_est ; ///< ME algorithm
2015-11-09 04:15:06 +02:00
int me_penalty_compensation ;
2015-11-09 04:15:06 +02:00
int me_pre ; ///< prepass for motion estimation
2001-07-22 17:18:56 +03:00
int mv_dir ;
2007-08-02 01:12:52 +03:00
# define MV_DIR_FORWARD 1
# define MV_DIR_BACKWARD 2
2016-04-27 19:45:23 +02:00
# define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
2001-07-22 17:18:56 +03:00
int mv_type ;
2005-12-17 20:14:38 +02:00
# define MV_TYPE_16X16 0 ///< 1 vector for the whole mb
2016-04-27 19:45:23 +02:00
# define MV_TYPE_8X8 1 ///< 4 vectors (H.263, MPEG-4 4MV)
2005-12-17 20:14:38 +02:00
# define MV_TYPE_16X8 2 ///< 2 vectors, one per 16x8 block
# define MV_TYPE_FIELD 3 ///< 2 vectors, one per field
# define MV_TYPE_DMV 4 ///< 2 vectors, special mpeg2 Dual Prime Vectors
/**motion vectors for a macroblock
2001-07-22 17:18:56 +03:00
first coordinate : 0 = forward 1 = backward
second " : depend on type
third " : 0 = x, 1 = y
*/
int mv [ 2 ] [ 4 ] [ 2 ] ;
int field_select [ 2 ] [ 2 ] ;
2016-04-27 19:45:23 +02:00
int last_mv [ 2 ] [ 2 ] [ 2 ] ; ///< last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4
2020-12-09 05:16:48 +02:00
const uint8_t * fcode_tab ; ///< smallest fcode needed for each MV
2006-04-03 10:52:24 +03:00
int16_t direct_scale_mv [ 2 ] [ 64 ] ; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
2005-12-17 20:14:38 +02:00
2002-12-28 01:51:46 +02:00
MotionEstContext me ;
2001-07-22 17:18:56 +03:00
2016-04-27 19:45:23 +02:00
int no_rounding ; /**< apply no rounding to motion compensation (MPEG-4, msmpeg4, ...)
for B - frames rounding mode is always 0 */
2001-07-22 17:18:56 +03:00
/* macroblock layer */
int mb_x , mb_y ;
2003-03-30 22:26:01 +03:00
int mb_skip_run ;
2001-07-22 17:18:56 +03:00
int mb_intra ;
2014-02-28 15:40:54 +03:00
uint16_t * mb_type ; ///< Table for candidate MB types for encoding (defines in mpegutils.h)
2006-12-21 17:20:02 +02:00
2003-03-06 16:37:37 +02:00
int block_index [ 6 ] ; ///< index to current MB in block based arrays with edges
2002-03-15 16:57:17 +02:00
int block_wrap [ 6 ] ;
2003-07-29 05:09:12 +03:00
uint8_t * dest [ 3 ] ;
2005-12-17 20:14:38 +02:00
2003-04-10 16:18:38 +03:00
int * mb_index2xy ; ///< mb_index -> mb_x + mb_y*mb_stride
2002-03-15 16:57:17 +02:00
2003-03-06 16:37:37 +02:00
/** matrix transmitted in the bitstream */
2003-02-11 18:35:48 +02:00
uint16_t intra_matrix [ 64 ] ;
uint16_t chroma_intra_matrix [ 64 ] ;
uint16_t inter_matrix [ 64 ] ;
uint16_t chroma_inter_matrix [ 64 ] ;
2015-10-09 20:58:07 +02:00
int force_duplicated_matrix ; ///< Force duplication of mjpeg matrices, useful for rtp streaming
2014-07-22 21:10:13 +03:00
2005-12-17 20:14:38 +02:00
int intra_quant_bias ; ///< bias for the quantizer
int inter_quant_bias ; ///< bias for the quantizer
int min_qcoeff ; ///< minimum encodable coefficient
int max_qcoeff ; ///< maximum encodable coefficient
int ac_esc_length ; ///< num of bits needed to encode the longest esc
2002-12-31 19:23:56 +02:00
uint8_t * intra_ac_vlc_length ;
uint8_t * intra_ac_vlc_last_length ;
2015-02-11 01:34:02 +02:00
uint8_t * intra_chroma_ac_vlc_length ;
uint8_t * intra_chroma_ac_vlc_last_length ;
2002-12-31 19:23:56 +02:00
uint8_t * inter_ac_vlc_length ;
uint8_t * inter_ac_vlc_last_length ;
2003-01-19 19:55:13 +02:00
uint8_t * luma_dc_vlc_length ;
2003-01-01 02:42:18 +02:00
# define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level))
2002-12-31 19:23:56 +02:00
2012-11-08 00:44:27 +03:00
int coded_score [ 12 ] ;
2003-10-01 01:18:43 +03:00
2003-03-06 16:37:37 +02:00
/** precomputed matrix (combine qscale and DCT renorm) */
2003-10-22 13:59:39 +03:00
int ( * q_intra_matrix ) [ 64 ] ;
2011-09-25 07:46:39 +03:00
int ( * q_chroma_intra_matrix ) [ 64 ] ;
2003-10-22 13:59:39 +03:00
int ( * q_inter_matrix ) [ 64 ] ;
2003-10-22 14:23:39 +03:00
/** identical to the above but for MMX & these are not permutated, second 64 entries are bias*/
uint16_t ( * q_intra_matrix16 ) [ 2 ] [ 64 ] ;
2011-09-25 07:46:39 +03:00
uint16_t ( * q_chroma_intra_matrix16 ) [ 2 ] [ 64 ] ;
2003-10-22 14:23:39 +03:00
uint16_t ( * q_inter_matrix16 ) [ 2 ] [ 64 ] ;
2005-12-17 20:14:38 +02:00
2003-11-03 01:19:47 +02:00
/* noise reduction */
int ( * dct_error_sum ) [ 64 ] ;
int dct_count [ 2 ] ;
uint16_t ( * dct_offset ) [ 64 ] ;
2001-07-22 17:18:56 +03:00
/* bit rate control */
2003-02-11 18:35:48 +02:00
int64_t total_bits ;
2005-12-17 20:14:38 +02:00
int frame_bits ; ///< bits used for the current frame
2012-09-11 18:20:08 +03:00
int stuffing_bits ; ///< bits used for stuffing
2006-10-05 22:27:18 +03:00
int next_lambda ; ///< next lambda used for retrying to encode a frame
2003-03-06 16:37:37 +02:00
RateControlContext rc_context ; ///< contains stuff only accessed in ratecontrol.c
2002-03-17 18:31:38 +02:00
2002-03-23 19:43:30 +02:00
/* statistics, used for 2-pass encoding */
int mv_bits ;
int header_bits ;
int i_tex_bits ;
int p_tex_bits ;
int i_count ;
2002-09-12 15:26:09 +03:00
int f_count ;
int b_count ;
2002-03-23 19:43:30 +02:00
int skip_count ;
2003-03-06 16:37:37 +02:00
int misc_bits ; ///< cbp, mb_type
int last_bits ; ///< temp var used for calculating the above vars
2005-12-17 20:14:38 +02:00
2002-06-02 15:20:39 +03:00
/* error concealment / resync */
2005-12-17 20:14:38 +02:00
int resync_mb_x ; ///< x position of last resync marker
int resync_mb_y ; ///< y position of last resync marker
GetBitContext last_resync_gb ; ///< used to search for the next resync marker
2003-03-06 16:37:37 +02:00
int mb_num_left ; ///< number of MBs left in this video packet (for partitioned Slices only)
2016-04-27 19:45:23 +02:00
int next_p_frame_damaged ; ///< set if the next p frame is damaged, to avoid showing trashed B-frames
2005-12-17 20:14:38 +02:00
2021-03-08 12:26:32 +02:00
# if FF_API_FLAG_TRUNCATED
2002-11-08 20:35:39 +02:00
ParseContext parse_context ;
2021-03-08 12:26:32 +02:00
# endif
2002-03-23 19:43:30 +02:00
2001-11-12 07:19:55 +02:00
/* H.263 specific */
2001-11-19 04:13:14 +02:00
int gob_index ;
2003-11-29 10:37:51 +02:00
int obmc ; ///< overlapped block motion compensation
2012-02-28 00:23:45 +03:00
int mb_info ; ///< interval for outputting info about mb offsets as side data
int prev_mb_info , last_mb_info ;
uint8_t * mb_info_ptr ;
int mb_info_size ;
2013-08-24 19:44:24 +03:00
int ehc_mode ;
2005-12-17 20:14:38 +02:00
2001-08-31 09:21:27 +03:00
/* H.263+ specific */
2016-04-27 19:45:23 +02:00
int umvplus ; ///< == H.263+ && unrestricted_mv
2003-12-07 03:33:45 +02:00
int h263_aic_dir ; ///< AIC direction: 0 = left, 1 = top
int h263_slice_structured ;
2003-11-29 10:37:51 +02:00
int alt_inter_vlc ; ///< alternative inter vlc
2003-11-30 16:35:35 +02:00
int modified_quant ;
2005-12-17 20:14:38 +02:00
int loop_filter ;
2004-03-11 00:11:49 +02:00
int custom_pcf ;
2005-12-17 20:14:38 +02:00
2016-04-27 19:45:23 +02:00
/* MPEG-4 specific */
2017-12-29 17:42:14 +02:00
int studio_profile ;
int dct_precision ;
2013-11-26 13:23:16 +03:00
///< number of bits to represent the fractional part of time (encoder only)
int time_increment_bits ;
2002-04-17 07:32:12 +03:00
int last_time_base ;
2005-12-17 20:14:38 +02:00
int time_base ; ///< time in seconds of last I,P,S Frame
int64_t time ; ///< time of current frame
2003-02-11 18:35:48 +02:00
int64_t last_non_b_time ;
2005-12-17 20:14:38 +02:00
uint16_t pp_time ; ///< time distance between the last 2 p,s,i frames
uint16_t pb_time ; ///< time distance between the last b and p,s,i frame
2003-02-11 18:35:48 +02:00
uint16_t pp_field_time ;
2005-12-17 20:14:38 +02:00
uint16_t pb_field_time ; ///< like above, just for interlaced
2002-03-09 15:01:16 +02:00
int real_sprite_warping_points ;
2005-12-17 20:14:38 +02:00
int sprite_offset [ 2 ] [ 2 ] ; ///< sprite offset[isChroma][isMVY]
int sprite_delta [ 2 ] [ 2 ] ; ///< sprite_delta [isY][isMVY]
2002-03-07 15:27:15 +02:00
int mcsel ;
2001-08-14 00:48:05 +03:00
int quant_precision ;
2005-12-17 20:14:38 +02:00
int quarter_sample ; ///< 1->qpel, 0->half pel ME/MC
2003-04-04 17:42:28 +03:00
int aspect_ratio_info ; //FIXME remove
2002-03-05 15:58:13 +02:00
int sprite_warping_accuracy ;
2005-12-17 20:14:38 +02:00
int data_partitioning ; ///< data partitioning flag from header
int partitioned_frame ; ///< is current frame partitioned
2016-04-27 19:45:23 +02:00
int low_delay ; ///< no reordering needed / has no B-frames
2002-04-22 22:04:28 +03:00
int vo_type ;
2005-12-17 20:14:38 +02:00
PutBitContext tex_pb ; ///< used for data partitioned VOPs
PutBitContext pb2 ; ///< used for data partitioned VOPs
2002-08-02 23:27:46 +03:00
int mpeg_quant ;
2016-04-27 19:45:23 +02:00
int padding_bug_score ; ///< used to detect the VERY common padding bug in MPEG-4
2002-03-09 15:01:16 +02:00
/* divx specific, used to workaround (many) bugs in divx5 */
2003-03-20 19:52:30 +02:00
int divx_packed ;
2003-02-11 18:35:48 +02:00
uint8_t * bitstream_buffer ; //Divx 5.01 puts several frames in a single one, this is used to reorder them
2002-04-22 15:45:22 +03:00
int bitstream_buffer_size ;
2006-01-26 00:10:13 +02:00
unsigned int allocated_bitstream_buffer_size ;
2005-12-17 20:14:38 +02:00
2001-07-22 17:18:56 +03:00
/* RV10 specific */
2005-12-17 20:14:38 +02:00
int rv10_version ; ///< RV10 version: 0 or 3
2001-07-22 17:18:56 +03:00
int rv10_first_dc_coded [ 3 ] ;
2005-12-17 20:14:38 +02:00
2001-07-22 17:18:56 +03:00
/* MJPEG specific */
struct MJpegContext * mjpeg_ctx ;
2012-06-14 17:26:15 +03:00
int esc_pos ;
2015-11-09 04:15:06 +02:00
int pred ;
2017-02-02 09:23:04 +02:00
int huffman ;
2001-07-22 17:18:56 +03:00
/* MSMPEG4 specific */
int mv_table_index ;
int rl_table_index ;
int rl_chroma_table_index ;
int dc_table_index ;
int use_skip_mb_code ;
2005-12-17 20:14:38 +02:00
int slice_height ; ///< in macroblocks
2016-04-27 19:45:23 +02:00
int first_slice_line ; ///< used in MPEG-4 too to handle resync markers
2002-01-16 00:22:41 +02:00
int flipflop_rounding ;
2003-03-06 16:37:37 +02:00
int msmpeg4_version ; ///< 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8
2002-06-18 03:50:20 +03:00
int per_mb_rl_table ;
int esc3_level_length ;
int esc3_run_length ;
2003-03-06 16:37:37 +02:00
/** [mb_intra][isChroma][level][run][last] */
2002-09-11 10:26:43 +03:00
int ( * ac_stats ) [ 2 ] [ MAX_LEVEL + 1 ] [ MAX_RUN + 1 ] [ 2 ] ;
2002-07-07 11:34:46 +03:00
int inter_intra_pred ;
2002-12-28 01:51:46 +02:00
int mspel ;
2002-06-18 03:50:20 +03:00
2020-11-09 13:25:02 +02:00
/* SpeedHQ specific */
int slice_start ;
2001-07-22 17:18:56 +03:00
/* decompression specific */
GetBitContext gb ;
2016-04-27 19:45:23 +02:00
/* MPEG-1 specific */
int gop_picture_number ; ///< index of the first picture of a GOP based on fake_pic_num & MPEG-1 specific
int last_mv_dir ; ///< last mv_dir, used for B-frame encoding
2005-12-17 20:14:38 +02:00
uint8_t * vbv_delay_ptr ; ///< pointer to vbv_delay in the bitstream
2009-03-02 07:41:55 +02:00
/* MPEG-2-specific - I wished not to have to support this mess. */
2001-07-22 17:18:56 +03:00
int progressive_sequence ;
int mpeg_f_code [ 2 ] [ 2 ] ;
2019-02-09 00:10:12 +02:00
int a53_cc ;
2014-02-28 15:40:54 +03:00
// picture structure defines are loaded from mpegutils.h
2001-07-22 17:18:56 +03:00
int picture_structure ;
2015-09-13 23:45:24 +02:00
int64_t timecode_frame_start ; ///< GOP timecode frame start number, in non drop frame format
2001-07-22 17:18:56 +03:00
int intra_dc_precision ;
int frame_pred_frame_dct ;
int top_field_first ;
int concealment_motion_vectors ;
int q_scale_type ;
2015-09-11 00:01:12 +02:00
int brd_scale ;
2001-07-22 17:18:56 +03:00
int intra_vlc_format ;
int alternate_scan ;
2014-06-14 18:07:28 +03:00
int seq_disp_ext ;
2018-02-10 20:03:36 +02:00
int video_format ;
# define VIDEO_FORMAT_COMPONENT 0
# define VIDEO_FORMAT_PAL 1
# define VIDEO_FORMAT_NTSC 2
# define VIDEO_FORMAT_SECAM 3
# define VIDEO_FORMAT_MAC 4
# define VIDEO_FORMAT_UNSPECIFIED 5
2001-07-22 17:18:56 +03:00
int repeat_first_field ;
int chroma_420_type ;
2004-03-01 16:55:21 +02:00
int chroma_format ;
# define CHROMA_420 1
# define CHROMA_422 2
# define CHROMA_444 3
2004-06-11 10:59:12 +03:00
int chroma_x_shift ; //depend on pix_format, that depend on chroma_format
int chroma_y_shift ;
2004-03-01 16:55:21 +02:00
2001-07-22 17:18:56 +03:00
int progressive_frame ;
2011-10-24 02:34:38 +03:00
int full_pel [ 2 ] ;
2001-07-22 17:18:56 +03:00
int interlaced_dct ;
2003-08-22 17:59:04 +03:00
int first_field ; ///< is 1 for the first field of a field picture 0 otherwise
2011-08-27 09:34:05 +03:00
int drop_frame_timecode ; ///< timecode is in drop frame format.
2011-08-27 11:16:14 +03:00
int scan_offset ; ///< reserve space for SVCD scan offset user data.
2003-12-07 03:33:45 +02:00
2001-11-19 04:13:14 +02:00
/* RTP specific */
2003-08-26 01:54:53 +03:00
int rtp_mode ;
2015-09-13 23:45:24 +02:00
int rtp_payload_size ;
2005-12-17 20:14:38 +02:00
2012-01-16 16:45:46 +03:00
char * tc_opt_str ; ///< timecode option string
AVTimecode tc ; ///< timecode context
2011-07-06 15:44:59 +03:00
2003-02-11 18:35:48 +02:00
uint8_t * ptr_lastgob ;
2009-03-02 07:41:55 +02:00
int swap_uv ; //vcr2 codec is an MPEG-2 variant with U and V swapped
2013-12-14 22:29:15 +03:00
int pack_pblocks ; //xvmc needs to keep blocks without gaps.
2013-01-20 03:02:29 +03:00
int16_t ( * pblocks [ 12 ] ) [ 64 ] ;
2005-12-17 20:14:38 +02:00
2013-01-20 03:02:29 +03:00
int16_t ( * block ) [ 64 ] ; ///< points to one of the following blocks
2013-01-23 19:44:56 +03:00
int16_t ( * blocks ) [ 12 ] [ 64 ] ; // for HQ mode we need to keep the best block
2017-12-29 17:42:14 +02:00
int ( * decode_mb ) ( struct MpegEncContext * s , int16_t block [ 12 ] [ 64 ] ) ; // used by some codecs to avoid a switch()
int32_t ( * block32 ) [ 12 ] [ 64 ] ;
2018-08-19 03:31:42 +02:00
int dpcm_direction ; // 0 = DCT, 1 = DPCM top to bottom scan, -1 = DPCM bottom to top scan
int16_t ( * dpcm_macroblock ) [ 3 ] [ 256 ] ;
2017-12-29 17:42:14 +02:00
2002-10-13 16:16:04 +03:00
# define SLICE_OK 0
# define SLICE_ERROR -1
2003-08-22 17:59:04 +03:00
# define SLICE_END -2 ///<end marker found
# define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_mpeg1_intra ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_mpeg1_inter ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_mpeg2_intra ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_mpeg2_inter ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_h263_intra ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 20:14:38 +02:00
void ( * dct_unquantize_h263_inter ) ( struct MpegEncContext * s ,
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2016-04-27 19:45:23 +02:00
void ( * dct_unquantize_intra ) ( struct MpegEncContext * s , // unquantizer to use (MPEG-4 can use both)
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2016-04-27 19:45:23 +02:00
void ( * dct_unquantize_inter ) ( struct MpegEncContext * s , // unquantizer to use (MPEG-4 can use both)
2013-01-20 03:02:29 +03:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
int ( * dct_quantize ) ( struct MpegEncContext * s , int16_t * block /*align 16*/ , int n , int qscale , int * overflow ) ;
int ( * fast_dct_quantize ) ( struct MpegEncContext * s , int16_t * block /*align 16*/ , int n , int qscale , int * overflow ) ;
void ( * denoise_dct ) ( struct MpegEncContext * s , int16_t * block ) ;
2012-02-27 14:12:19 +03:00
int mpv_flags ; ///< flags set by private options
2012-02-27 22:06:23 +03:00
int quantizer_noise_shaping ;
2012-06-24 21:19:24 +03:00
2013-10-27 15:51:16 +03:00
/**
* ratecontrol qmin qmax limiting method
2014-10-18 14:30:38 +03:00
* 0 - > clipping , 1 - > use a nice continuous function to limit qscale within qmin / qmax .
2013-10-27 15:51:16 +03:00
*/
float rc_qsquish ;
2013-10-27 15:51:16 +03:00
float rc_qmod_amp ;
int rc_qmod_freq ;
2013-10-27 15:51:16 +03:00
float rc_initial_cplx ;
float rc_buffer_aggressivity ;
2013-10-27 15:51:16 +03:00
float border_masking ;
2013-10-27 15:51:16 +03:00
int lmin , lmax ;
2015-07-30 04:56:06 +02:00
int vbv_ignore_qmax ;
2013-10-27 15:51:16 +03:00
2013-10-27 15:51:16 +03:00
char * rc_eq ;
2012-06-24 21:19:24 +03:00
/* temp buffers for rate control */
float * cplx_tab , * bits_tab ;
2012-09-18 16:48:14 +03:00
/* flag to indicate a reinitialization is required, e.g. after
* a frame size change */
int context_reinit ;
2013-02-02 22:42:07 +03:00
ERContext er ;
2013-10-27 15:51:16 +03:00
int error_rate ;
2013-11-09 12:14:46 +03:00
/* temporary frames used by b_frame_strategy = 2 */
AVFrame * tmp_frames [ MAX_B_FRAMES + 2 ] ;
2015-09-09 04:18:26 +02:00
int b_frame_strategy ;
int b_sensitivity ;
2015-09-11 03:30:38 +02:00
/* frame skip options for encoding */
int frame_skip_threshold ;
int frame_skip_factor ;
int frame_skip_exp ;
int frame_skip_cmp ;
2015-09-12 22:27:59 +02:00
int scenechange_threshold ;
2015-09-13 23:45:24 +02:00
int noise_reduction ;
2019-10-23 21:12:32 +02:00
int intra_penalty ;
2001-07-22 17:18:56 +03:00
} MpegEncContext ;
2012-02-27 14:12:19 +03:00
/* mpegvideo_enc common options */
# define FF_MPV_FLAG_SKIP_RD 0x0001
2012-02-27 14:23:19 +03:00
# define FF_MPV_FLAG_STRICT_GOP 0x0002
2012-02-27 14:23:19 +03:00
# define FF_MPV_FLAG_QP_RD 0x0004
2012-02-27 14:23:19 +03:00
# define FF_MPV_FLAG_CBP_RD 0x0008
2014-04-29 09:00:03 +03:00
# define FF_MPV_FLAG_NAQ 0x0010
2014-04-29 09:00:03 +03:00
# define FF_MPV_FLAG_MV0 0x0020
2012-02-27 14:12:19 +03:00
2015-09-11 03:30:38 +02:00
# define FF_MPV_OPT_CMP_FUNC \
{ " sad " , " Sum of absolute differences, fast " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_SAD } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " sse " , " Sum of squared errors " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_SSE } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " satd " , " Sum of absolute Hadamard transformed differences " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_SATD } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " dct " , " Sum of absolute DCT transformed differences " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_DCT } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " 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 , " cmp_func " } , \
{ " 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 , " cmp_func " } , \
{ " rd " , " Rate distortion optimal, slow " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_RD } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " zero " , " Zero " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_ZERO } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " vsad " , " Sum of absolute vertical differences " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_VSAD } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " vsse " , " Sum of squared vertical differences " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_VSSE } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " nsse " , " Noise preserving sum of squared differences " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_NSSE } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " dct264 " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_DCT264 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " dctmax " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_DCTMAX } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
2016-08-18 13:40:09 +02:00
{ " chroma " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_CHROMA } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
{ " 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 , " cmp_func " }
2015-09-11 03:30:38 +02:00
2014-10-18 20:41:48 +03:00
# ifndef FF_MPV_OFFSET
2012-02-27 14:12:19 +03:00
# define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
2014-10-18 20:41:48 +03:00
# endif
2012-02-27 14:12:19 +03:00
# define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
# define FF_MPV_COMMON_OPTS \
2015-09-11 03:30:38 +02:00
FF_MPV_OPT_CMP_FUNC , \
2012-08-31 12:52:18 +03:00
{ " 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 , " mpv_flags " } , \
2012-08-31 12:45:52 +03:00
{ " 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 , " mpv_flags " } , \
{ " strict_gop " , " Strictly enforce gop size " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_MPV_FLAG_STRICT_GOP } , 0 , 0 , FF_MPV_OPT_FLAGS , " mpv_flags " } , \
{ " 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 , " mpv_flags " } , \
{ " 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 , " mpv_flags " } , \
2014-04-29 09:00:03 +03:00
{ " naq " , " normalize adaptive quantization " , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_MPV_FLAG_NAQ } , 0 , 0 , FF_MPV_OPT_FLAGS , " mpv_flags " } , \
2014-04-29 09:00:03 +03:00
{ " 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 , " mpv_flags " } , \
2012-02-27 21:09:49 +03:00
{ " luma_elim_threshold " , " single coefficient elimination threshold for luminance (negative values also consider dc coefficient) " , \
2012-08-31 13:22:31 +03:00
FF_MPV_OFFSET ( luma_elim_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2012-02-27 21:09:49 +03:00
{ " chroma_elim_threshold " , " single coefficient elimination threshold for chrominance (negative values also consider dc coefficient) " , \
2012-08-31 13:22:31 +03:00
FF_MPV_OFFSET ( chroma_elim_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2013-10-27 15:51:16 +03:00
{ " quantizer_noise_shaping " , NULL , FF_MPV_OFFSET ( quantizer_noise_shaping ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " error_rate " , " Simulate errors in the bitstream to test error concealment. " , \
2013-10-27 15:51:16 +03:00
FF_MPV_OFFSET ( error_rate ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " qsquish " , " how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function) " , \
2013-10-27 15:51:16 +03:00
FF_MPV_OFFSET ( rc_qsquish ) , AV_OPT_TYPE_FLOAT , { . dbl = 0 } , 0 , 99 , FF_MPV_OPT_FLAGS } , \
{ " rc_qmod_amp " , " experimental quantizer modulation " , FF_MPV_OFFSET ( rc_qmod_amp ) , AV_OPT_TYPE_FLOAT , { . dbl = 0 } , - FLT_MAX , FLT_MAX , FF_MPV_OPT_FLAGS } , \
2013-10-27 15:51:16 +03:00
{ " rc_qmod_freq " , " experimental quantizer modulation " , FF_MPV_OFFSET ( rc_qmod_freq ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " rc_eq " , " Set rate control equation. When computing the expression, besides the standard functions " \
" defined in the section 'Expression Evaluation', the following functions are available: " \
" bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv " \
" fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex. " , \
2013-10-27 15:51:16 +03:00
FF_MPV_OFFSET ( rc_eq ) , AV_OPT_TYPE_STRING , . flags = FF_MPV_OPT_FLAGS } , \
{ " rc_init_cplx " , " initial complexity for 1-pass encoding " , FF_MPV_OFFSET ( rc_initial_cplx ) , AV_OPT_TYPE_FLOAT , { . dbl = 0 } , - FLT_MAX , FLT_MAX , FF_MPV_OPT_FLAGS } , \
{ " rc_buf_aggressivity " , " currently useless " , FF_MPV_OFFSET ( rc_buffer_aggressivity ) , AV_OPT_TYPE_FLOAT , { . dbl = 1.0 } , - FLT_MAX , FLT_MAX , FF_MPV_OPT_FLAGS } , \
2013-10-27 15:51:16 +03:00
{ " border_mask " , " increase the quantizer for macroblocks close to borders " , FF_MPV_OFFSET ( border_masking ) , AV_OPT_TYPE_FLOAT , { . dbl = 0 } , - FLT_MAX , FLT_MAX , FF_MPV_OPT_FLAGS } , \
2013-10-27 15:51:16 +03:00
{ " lmin " , " minimum Lagrange factor (VBR) " , FF_MPV_OFFSET ( lmin ) , AV_OPT_TYPE_INT , { . i64 = 2 * FF_QP2LAMBDA } , 0 , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " lmax " , " maximum Lagrange factor (VBR) " , FF_MPV_OFFSET ( lmax ) , AV_OPT_TYPE_INT , { . i64 = 31 * FF_QP2LAMBDA } , 0 , INT_MAX , FF_MPV_OPT_FLAGS } , \
2015-07-02 13:14:22 +02:00
{ " ibias " , " intra quant bias " , FF_MPV_OFFSET ( intra_quant_bias ) , AV_OPT_TYPE_INT , { . i64 = FF_DEFAULT_QUANT_BIAS } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " pbias " , " inter quant bias " , FF_MPV_OFFSET ( inter_quant_bias ) , AV_OPT_TYPE_INT , { . i64 = FF_DEFAULT_QUANT_BIAS } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2015-07-07 02:20:43 +02:00
{ " motion_est " , " motion estimation algorithm " , FF_MPV_OFFSET ( motion_est ) , AV_OPT_TYPE_INT , { . i64 = FF_ME_EPZS } , FF_ME_ZERO , FF_ME_XONE , FF_MPV_OPT_FLAGS , " motion_est " } , \
{ " zero " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_ME_ZERO } , 0 , 0 , FF_MPV_OPT_FLAGS , " motion_est " } , \
{ " epzs " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_ME_EPZS } , 0 , 0 , FF_MPV_OPT_FLAGS , " motion_est " } , \
{ " xone " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_ME_XONE } , 0 , 0 , FF_MPV_OPT_FLAGS , " motion_est " } , \
2015-09-11 03:30:38 +02:00
{ " skip_threshold " , " Frame skip threshold " , FF_MPV_OFFSET ( frame_skip_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " skip_factor " , " Frame skip factor " , FF_MPV_OFFSET ( frame_skip_factor ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " skip_exp " , " Frame skip exponent " , FF_MPV_OFFSET ( frame_skip_exp ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " skip_cmp " , " Frame skip compare function " , FF_MPV_OFFSET ( frame_skip_cmp ) , AV_OPT_TYPE_INT , { . i64 = FF_CMP_DCTMAX } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " } , \
2015-09-12 22:27:59 +02:00
{ " sc_threshold " , " Scene change threshold " , FF_MPV_OFFSET ( scenechange_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2015-09-13 23:45:24 +02:00
{ " noise_reduction " , " Noise reduction " , FF_MPV_OFFSET ( noise_reduction ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2015-09-13 23:45:24 +02:00
{ " 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 } , \
2015-11-09 04:15:06 +02:00
{ " mepc " , " Motion estimation bitrate penalty compensation (1.0 = 256) " , FF_MPV_OFFSET ( me_penalty_compensation ) , AV_OPT_TYPE_INT , { . i64 = 256 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2015-11-09 04:15:06 +02:00
{ " mepre " , " pre motion estimation " , FF_MPV_OFFSET ( me_pre ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2019-10-23 21:12:32 +02:00
{ " 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 } , \
2012-02-27 14:12:19 +03:00
2021-04-06 19:32:07 +02:00
# define FF_MPV_COMMON_BFRAME_OPTS \
{ " b_strategy " , " Strategy to choose between I/P/B-frames " , FF_MPV_OFFSET ( b_frame_strategy ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 2 , FF_MPV_OPT_FLAGS } , \
{ " b_sensitivity " , " Adjust sensitivity of b_frame_strategy 1 " , FF_MPV_OFFSET ( b_sensitivity ) , AV_OPT_TYPE_INT , { . i64 = 40 } , 1 , INT_MAX , FF_MPV_OPT_FLAGS } , \
{ " brd_scale " , " Downscale frames for dynamic B-frame decision " , FF_MPV_OFFSET ( brd_scale ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 3 , FF_MPV_OPT_FLAGS } ,
2021-04-06 17:20:57 +02:00
# if FF_API_MPEGVIDEO_OPTS
# define FF_MPV_DEPRECATED_MPEG_QUANT_OPT \
{ " mpeg_quant " , " Deprecated, does nothing " , FF_MPV_OFFSET ( mpeg_quant ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 0 , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } ,
2021-04-06 17:53:20 +02:00
# define FF_MPV_DEPRECATED_A53_CC_OPT \
{ " a53cc " , " Deprecated, does nothing " , FF_MPV_OFFSET ( a53_cc ) , AV_OPT_TYPE_BOOL , { . i64 = 1 } , 0 , 1 , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } ,
2021-04-06 18:51:38 +02:00
# define FF_MPV_DEPRECATED_MATRIX_OPT \
{ " force_duplicated_matrix " , " Deprecated, does nothing " , FF_MPV_OFFSET ( force_duplicated_matrix ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } ,
2021-04-06 19:32:07 +02:00
# define FF_MPV_DEPRECATED_BFRAME_OPTS \
{ " b_strategy " , " Deprecated, does nothing " , FF_MPV_OFFSET ( b_frame_strategy ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 2 , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } , \
{ " b_sensitivity " , " Deprecated, does nothing " , FF_MPV_OFFSET ( b_sensitivity ) , AV_OPT_TYPE_INT , { . i64 = 40 } , 1 , INT_MAX , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } , \
{ " brd_scale " , " Deprecated, does nothing " , FF_MPV_OFFSET ( brd_scale ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 3 , FF_MPV_OPT_FLAGS | AV_OPT_FLAG_DEPRECATED } ,
2021-04-06 17:20:57 +02:00
# endif
2021-06-07 16:13:33 +02:00
extern const AVClass ff_mpv_enc_class ;
2012-02-27 14:12:19 +03:00
2012-08-04 02:50:21 +03:00
/**
* Set the given MpegEncContext to common defaults ( same for encoding
* and decoding ) . The changed fields will not depend upon the prior
* state of the MpegEncContext .
*/
2014-08-10 18:25:12 +03:00
void ff_mpv_common_defaults ( MpegEncContext * s ) ;
2012-09-25 19:04:36 +03:00
void ff_dct_encode_init_x86 ( MpegEncContext * s ) ;
2014-08-15 21:00:34 +03:00
2014-08-10 18:25:12 +03:00
int ff_mpv_common_init ( MpegEncContext * s ) ;
void ff_mpv_common_init_arm ( MpegEncContext * s ) ;
2014-08-15 21:00:34 +03:00
void ff_mpv_common_init_axp ( MpegEncContext * s ) ;
2014-08-10 18:25:12 +03:00
void ff_mpv_common_init_neon ( MpegEncContext * s ) ;
void ff_mpv_common_init_ppc ( MpegEncContext * s ) ;
void ff_mpv_common_init_x86 ( MpegEncContext * s ) ;
2015-06-29 17:27:12 +02:00
void ff_mpv_common_init_mips ( MpegEncContext * s ) ;
2014-08-10 18:25:12 +03:00
int ff_mpv_common_frame_size_change ( MpegEncContext * s ) ;
void ff_mpv_common_end ( MpegEncContext * s ) ;
2014-09-05 17:57:57 +03:00
void ff_mpv_decode_init ( MpegEncContext * s , AVCodecContext * avctx ) ;
2017-06-18 20:15:05 +02:00
void ff_mpv_reconstruct_mb ( MpegEncContext * s , int16_t block [ 12 ] [ 64 ] ) ;
2014-08-10 18:25:12 +03:00
void ff_mpv_report_decode_progress ( MpegEncContext * s ) ;
int ff_mpv_frame_start ( MpegEncContext * s , AVCodecContext * avctx ) ;
void ff_mpv_frame_end ( MpegEncContext * s ) ;
int ff_mpv_encode_init ( AVCodecContext * avctx ) ;
void ff_mpv_encode_init_x86 ( MpegEncContext * s ) ;
int ff_mpv_encode_end ( AVCodecContext * avctx ) ;
int ff_mpv_encode_picture ( AVCodecContext * avctx , AVPacket * pkt ,
2012-02-10 12:30:05 +03:00
const AVFrame * frame , int * got_packet ) ;
2015-05-25 04:12:13 +02:00
int ff_mpv_reallocate_putbitbuffer ( MpegEncContext * s , size_t threshold , size_t size_increase ) ;
2014-08-10 18:25:12 +03:00
2002-06-02 15:20:39 +03:00
void ff_clean_intra_table_entries ( MpegEncContext * s ) ;
2013-02-03 16:26:34 +03:00
void ff_mpeg_draw_horiz_band ( MpegEncContext * s , int y , int h ) ;
2003-07-17 15:29:07 +03:00
void ff_mpeg_flush ( AVCodecContext * avctx ) ;
2013-03-12 12:51:03 +03:00
2013-03-12 13:23:07 +03:00
void ff_print_debug_info ( MpegEncContext * s , Picture * p , AVFrame * pict ) ;
2013-03-12 12:51:03 +03:00
2013-03-15 16:33:24 +03:00
int ff_mpv_export_qp_table ( MpegEncContext * s , AVFrame * f , Picture * p , int qp_type ) ;
2006-09-27 22:47:39 +03:00
void ff_write_quant_matrix ( PutBitContext * pb , uint16_t * matrix ) ;
2015-04-27 23:09:21 +02:00
2012-11-26 00:42:07 +03:00
int ff_update_duplicate_context ( MpegEncContext * dst , MpegEncContext * src ) ;
2011-03-22 23:36:57 +02:00
int ff_mpeg_update_thread_context ( AVCodecContext * dst , const AVCodecContext * src ) ;
2010-03-07 00:36:52 +02:00
void ff_set_qscale ( MpegEncContext * s , int qscale ) ;
2002-12-17 13:25:29 +02:00
2014-08-08 18:11:20 +03:00
void ff_mpv_idct_init ( MpegEncContext * s ) ;
2012-09-25 19:04:36 +03:00
int ff_dct_encode_init ( MpegEncContext * s ) ;
2014-02-07 12:05:46 +03:00
void ff_convert_matrix ( MpegEncContext * s , int ( * qmat ) [ 64 ] , uint16_t ( * qmat16 ) [ 2 ] [ 64 ] ,
2007-10-08 12:14:46 +03:00
const uint16_t * quant_matrix , int bias , int qmin , int qmax , int intra ) ;
2013-01-20 03:02:29 +03:00
int ff_dct_quantize_c ( MpegEncContext * s , int16_t * block , int n , int qscale , int * overflow ) ;
2015-10-12 19:37:42 +02:00
void ff_block_permute ( int16_t * block , uint8_t * permutation ,
const uint8_t * scantable , int last ) ;
2003-07-29 05:09:12 +03:00
void ff_init_block_index ( MpegEncContext * s ) ;
2002-10-13 16:16:04 +03:00
2014-08-10 18:25:12 +03:00
void ff_mpv_motion ( MpegEncContext * s ,
2012-08-04 02:50:21 +03:00
uint8_t * dest_y , uint8_t * dest_cb ,
uint8_t * dest_cr , int dir ,
uint8_t * * ref_picture ,
op_pixels_func ( * pix_op ) [ 4 ] ,
qpel_mc_func ( * qpix_op ) [ 16 ] ) ;
2002-10-13 16:16:04 +03:00
static inline void ff_update_block_index ( MpegEncContext * s ) {
2017-12-29 17:42:14 +02:00
const int bytes_per_pixel = 1 + ( s - > avctx - > bits_per_raw_sample > 8 ) ;
const int block_size = ( 8 * bytes_per_pixel ) > > s - > avctx - > lowres ;
2004-09-26 02:18:58 +03:00
2002-10-13 16:16:04 +03:00
s - > block_index [ 0 ] + = 2 ;
s - > block_index [ 1 ] + = 2 ;
s - > block_index [ 2 ] + = 2 ;
s - > block_index [ 3 ] + = 2 ;
s - > block_index [ 4 ] + + ;
s - > block_index [ 5 ] + + ;
2004-09-26 02:18:58 +03:00
s - > dest [ 0 ] + = 2 * block_size ;
2017-12-29 17:42:14 +02:00
s - > dest [ 1 ] + = ( 2 > > s - > chroma_x_shift ) * block_size ;
s - > dest [ 2 ] + = ( 2 > > s - > chroma_x_shift ) * block_size ;
2002-10-13 16:16:04 +03:00
}
2003-04-02 12:57:34 +03:00
static inline int get_bits_diff ( MpegEncContext * s ) {
2004-02-06 17:27:31 +02:00
const int bits = put_bits_count ( & s - > pb ) ;
2003-04-02 12:57:34 +03:00
const int last = s - > last_bits ;
s - > last_bits = bits ;
return bits - last ;
}
2002-10-13 16:16:04 +03:00
2017-12-29 17:42:14 +02:00
static inline int mpeg_get_qscale ( MpegEncContext * s )
{
int qscale = get_bits ( & s - > gb , 5 ) ;
if ( s - > q_scale_type )
return ff_mpeg2_non_linear_qscale [ qscale ] ;
else
return qscale < < 1 ;
}
2008-08-31 10:39:47 +03:00
# endif /* AVCODEC_MPEGVIDEO_H */