2001-07-22 14:18:56 +00:00
/*
* Generic DCT based hybrid video encoder
2009-01-19 15:46:40 +00:00
* Copyright ( c ) 2000 , 2001 , 2002 Fabrice Bellard
2004-01-10 16:04:55 +00:00
* Copyright ( c ) 2002 - 2004 Michael Niedermayer
2001-07-22 14:18:56 +00:00
*
2006-10-07 15:30:46 +00:00
* This file is part of FFmpeg .
*
* FFmpeg is free software ; you can redistribute it and / or
2002-05-25 22:45:33 +00:00
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
2006-10-07 15:30:46 +00:00
* version 2.1 of the License , or ( at your option ) any later version .
2001-07-22 14:18:56 +00:00
*
2006-10-07 15:30:46 +00:00
* FFmpeg is distributed in the hope that it will be useful ,
2001-07-22 14:18:56 +00:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2002-05-25 22:45:33 +00:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
2001-07-22 14:18:56 +00:00
*
2002-05-25 22:45:33 +00:00
* You should have received a copy of the GNU Lesser General Public
2006-10-07 15:30:46 +00:00
* License along with FFmpeg ; if not , write to the Free Software
2006-01-12 22:43:26 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-07-22 14:18:56 +00:00
*/
2003-03-06 11:32:04 +00:00
/**
2010-04-20 14:45:34 +00:00
* @ file
2003-03-06 11:32:04 +00:00
* mpegvideo header .
*/
2005-12-17 18:14:38 +00:00
2008-08-31 07:39:47 +00:00
# ifndef AVCODEC_MPEGVIDEO_H
# define AVCODEC_MPEGVIDEO_H
2002-05-27 16:42:14 +00:00
2013-10-27 12:51:16 +00:00
# include <float.h>
2011-07-06 18:08:30 +00:00
# include "avcodec.h"
2014-01-14 09:33:47 +00:00
# include "blockdsp.h"
2013-02-02 19:42:07 +00:00
# include "error_resilience.h"
2014-02-03 18:09:45 +00:00
# include "fdctdsp.h"
2009-04-13 16:20:26 +00:00
# include "get_bits.h"
2013-02-07 12:09:35 +00:00
# include "h264chroma.h"
2013-11-05 07:11:47 +00:00
# include "h263dsp.h"
2013-03-10 20:55:07 +00:00
# include "hpeldsp.h"
2014-01-24 10:55:16 +00:00
# include "idctdsp.h"
2015-07-20 17:24:19 +00:00
# include "internal.h"
2014-02-08 01:59:58 +00:00
# include "me_cmp.h"
2015-05-29 18:44:05 +00:00
# include "motion_est.h"
2015-06-08 12:00:49 +00:00
# include "mpegpicture.h"
2014-01-24 09:41:12 +00:00
# include "mpegvideodsp.h"
2013-12-30 18:19:39 +00:00
# include "mpegvideoencdsp.h"
2014-02-03 22:29:09 +00:00
# include "pixblockdsp.h"
2009-04-12 08:35:26 +00:00
# include "put_bits.h"
2006-09-29 19:39:19 +00:00
# include "ratecontrol.h"
2006-11-06 10:43:49 +00:00
# include "parser.h"
2015-05-31 13:49:55 +00:00
# include "mpegutils.h"
2008-03-05 00:06:09 +00:00
# include "mpeg12data.h"
2014-01-08 13:00:10 +00:00
# include "qpeldsp.h"
2012-11-21 20:34:46 +00:00
# include "thread.h"
2012-12-15 17:46:02 +00:00
# include "videodsp.h"
2003-02-10 09:35:32 +00:00
2012-02-27 11:12:19 +00:00
# include "libavutil/opt.h"
2012-12-21 16:18:43 +00:00
# include "libavutil/timecode.h"
2012-02-27 11:12:19 +00:00
2012-05-07 18:08:56 +00:00
# define MAX_THREADS 32
2002-03-22 02:21:17 +00:00
2013-10-27 15:46:01 +00:00
# define MAX_B_FRAMES 16
2007-05-05 18:18:51 +00:00
/* Start codes. */
# define SEQ_END_CODE 0x000001b7
# define SEQ_START_CODE 0x000001b3
# define GOP_START_CODE 0x000001b8
# define PICTURE_START_CODE 0x00000100
# define SLICE_MIN_START_CODE 0x00000101
# define SLICE_MAX_START_CODE 0x000001af
# define EXT_START_CODE 0x000001b5
# define USER_START_CODE 0x000001b2
2003-03-06 14:37:37 +00:00
/**
* MpegEncContext .
*/
2001-07-22 14:18:56 +00:00
typedef struct MpegEncContext {
2011-08-27 06:26:14 +00:00
AVClass * class ;
2013-12-05 20:14:40 +00:00
int y_dc_scale , c_dc_scale ;
int ac_pred ;
int block_last_index [ 12 ] ; ///< last non zero coefficient in block
int h263_aic ; ///< Advanded INTRA Coding (AIC)
/* scantables */
ScanTable inter_scantable ; ///< if inter == intra then intra should be used to reduce tha cache usage
ScanTable intra_scantable ;
ScanTable intra_h_scantable ;
ScanTable intra_v_scantable ;
/* WARNING: changes above this line require updates to hardcoded
* offsets used in asm . */
2001-08-15 13:12:23 +00:00
struct AVCodecContext * avctx ;
2001-07-22 14:18:56 +00:00
/* the following parameters must be initialized before encoding */
2005-12-17 18:14:38 +00:00
int width , height ; ///< picture size. must be a multiple of 16
2001-07-22 14:18:56 +00:00
int gop_size ;
2005-12-17 18:14:38 +00:00
int intra_only ; ///< if true, only intra pictures are generated
2015-09-02 19:02:31 +00:00
int64_t bit_rate ; ///< wanted bit rate
2005-12-17 18:14:38 +00:00
enum OutputFormat out_format ; ///< output format
int h263_pred ; ///< use mpeg4/h263 ac/dc predictions
2009-02-22 18:13:40 +00:00
int pb_frame ; ///< PB frame mode (0 = none, 1 = base, 2 = improved)
2002-04-27 12:30:26 +00:00
/* the following codec id fields are deprecated in favor of codec_id */
2005-12-17 18:14:38 +00:00
int h263_plus ; ///< h263 plus headers
int h263_flv ; ///< use flv h263 header
2012-08-05 09:11:04 +00:00
enum AVCodecID codec_id ; /* see AV_CODEC_ID_xxx */
2005-12-17 18:14:38 +00:00
int fixed_qscale ; ///< fixed qscale if non zero
int encoding ; ///< true if we are encoding (vs decoding)
int max_b_frames ; ///< max number of b-frames for encoding
2002-06-02 12:20:39 +00:00
int luma_elim_threshold ;
int chroma_elim_threshold ;
2005-12-17 18:14:38 +00:00
int strict_std_compliance ; ///< strictly follow the std (MPEG4, ...)
int workaround_bugs ; ///< workaround bugs in encoders which cannot be detected automatically
2006-11-07 09:46:57 +00:00
int codec_tag ; ///< internal codec_tag upper case converted from avctx codec_tag
2001-07-22 14:18:56 +00:00
/* the following fields are managed internally by the encoder */
/* sequence parameters */
int context_initialized ;
2007-06-12 09:29:25 +00: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-29 22:25:08 +00:00
int picture_number ; //FIXME remove, unclear definition
2005-12-17 18:14:38 +00:00
int picture_in_gop_number ; ///< 0-> first pic in gop, ...
int mb_width , mb_height ; ///< number of MBs horizontally & vertically
2005-06-17 15:02:53 +00: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 18:14:38 +00:00
int mb_num ; ///< number of MBs of a picture
2013-09-28 00:13:59 +00: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 18:14:38 +00:00
Picture * picture ; ///< main picture buffer
2003-10-22 15:36:46 +00:00
Picture * * input_picture ; ///< next pictures on display order for encoding
Picture * * reordered_input_picture ; ///< pointer to the next pictures in codedorder for encoding
2005-12-17 18:14:38 +00:00
2013-09-10 10:31:46 +00:00
int64_t user_specified_pts ; ///< last non-zero pts from AVFrame which was passed into avcodec_encode_video2()
2012-02-10 09:30:05 +00: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 14:18:13 +00:00
2011-01-29 17:14:29 +00:00
/** bit output */
PutBitContext pb ;
2004-02-13 17:54:10 +00: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 19:24:24 +00:00
int slice_context_count ; ///< number of used thread_contexts
2005-12-17 18:14:38 +00:00
/**
2003-03-16 20:22:22 +00:00
* copy of the previous picture structure .
* note , linesize & data , might not match the previous picture ( for field pictures )
*/
2005-12-17 18:14:38 +00:00
Picture last_picture ;
/**
2003-03-16 20:22:22 +00: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 18:14:38 +00:00
/**
2003-03-16 20:22:22 +00: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 18:14:38 +00:00
/**
2003-03-16 20:22:22 +00:00
* copy of the current picture structure .
* note , linesize & data , might not match the current picture ( for field pictures )
*/
2005-12-17 18:14:38 +00:00
Picture current_picture ; ///< buffer to store the decompressed current picture
2003-03-16 20:22:22 +00:00
Picture * last_picture_ptr ; ///< pointer to the previous picture.
2005-12-17 18:14:38 +00:00
Picture * next_picture_ptr ; ///< pointer to the next picture (for bidir pred)
2003-03-16 20:22:22 +00:00
Picture * current_picture_ptr ; ///< pointer to the current picture
2005-12-17 18:14:38 +00:00
int last_dc [ 3 ] ; ///< last DC values for MPEG1
2006-09-27 22:13:44 +00:00
int16_t * dc_val_base ;
int16_t * dc_val [ 3 ] ; ///< used for mpeg4 DC prediction, all 3 arrays must be continuous
2005-12-17 18:14:38 +00: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
2003-12-01 15:23:14 +00:00
const uint8_t * chroma_qscale_table ; ///< qscale -> chroma_qscale (h263)
2004-04-16 01:01:45 +00:00
uint8_t * coded_block_base ;
2003-03-06 14:37:37 +00:00
uint8_t * coded_block ; ///< used for coded block pattern prediction (msmpeg4v3, wmv1)
2004-04-16 01:01:45 +00:00
int16_t ( * ac_val_base ) [ 16 ] ;
2013-08-12 17:40:29 +00:00
int16_t ( * ac_val [ 3 ] ) [ 16 ] ; ///< used for mpeg4 AC prediction, all 3 arrays must be continuous
2005-12-17 18:14:38 +00: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)
2002-04-17 04:32:12 +00:00
and used for b - frame encoding & decoding ( contains skip table of next P Frame ) */
2005-12-17 18:14:38 +00: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 13:49:52 +00:00
ScratchpadContext sc ;
2001-07-22 14:18:56 +00:00
2005-12-17 18:14:38 +00:00
int qscale ; ///< QP
int chroma_qscale ; ///< chroma QP
2006-10-28 16:11:25 +00:00
unsigned int lambda ; ///< lagrange multipler used in rate distortion
unsigned int lambda2 ; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT
2003-10-07 11:32:40 +00:00
int * lambda_table ;
2005-12-17 18:14:38 +00:00
int adaptive_quant ; ///< use adaptive quantization
int dquant ; ///< qscale difference to prev qscale
2011-10-23 23:04:14 +00:00
int closed_gop ; ///< MPEG1/2 GOP is closed
2011-04-27 23:40:44 +00:00
int pict_type ; ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
2012-11-02 15:25:03 +00:00
int vbv_delay ;
2004-04-17 13:36:21 +00:00
int last_pict_type ; //FIXME removes
2005-12-17 18:14:38 +00:00
int last_non_b_pict_type ; ///< used for mpeg4 gmc b-frames & ratecontrol
2012-12-07 09:25:27 +00:00
int droppable ;
2001-07-22 14:18:56 +00:00
int frame_rate_index ;
2012-10-04 13:25:30 +00:00
AVRational mpeg2_frame_rate_ext ;
2005-12-29 15:46:23 +00:00
int last_lambda_for [ 5 ] ; ///< last lambda for a specific pict type
2006-12-23 03:05:36 +00:00
int skipdct ; ///< skip dct and code zero residual
2004-03-01 14:55:21 +00:00
2001-07-22 14:18:56 +00:00
/* motion compensation */
2005-12-17 18:14:38 +00:00
int unrestricted_mv ; ///< mv can point outside of the coded picture
int h263_long_vectors ; ///< use horrible h263v1 long vector mode
2003-03-06 14:37:37 +00:00
2014-01-14 09:33:47 +00:00
BlockDSPContext bdsp ;
2014-02-03 18:09:45 +00:00
FDCTDSPContext fdsp ;
2013-02-07 12:09:35 +00:00
H264ChromaContext h264chroma ;
2013-03-10 20:55:07 +00:00
HpelDSPContext hdsp ;
2014-01-24 10:55:16 +00:00
IDCTDSPContext idsp ;
2014-02-08 01:59:58 +00:00
MECmpContext mecc ;
2014-01-24 09:41:12 +00:00
MpegVideoDSPContext mdsp ;
2013-12-30 18:19:39 +00:00
MpegvideoEncDSPContext mpvencdsp ;
2014-02-03 22:29:09 +00:00
PixblockDSPContext pdsp ;
2014-01-08 13:00:10 +00:00
QpelDSPContext qdsp ;
2012-12-15 17:46:02 +00:00
VideoDSPContext vdsp ;
2013-11-05 07:11:47 +00:00
H263DSPContext h263dsp ;
2005-12-17 18:14:38 +00:00
int f_code ; ///< forward MV resolution
int b_code ; ///< backward MV resolution for B Frames (mpeg4)
2003-04-10 13:18:38 +00: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 18:14:38 +00:00
int16_t ( * b_bidir_forw_mv_table_base ) [ 2 ] ;
int16_t ( * b_bidir_back_mv_table_base ) [ 2 ] ;
2003-04-10 13:18:38 +00:00
int16_t ( * b_direct_mv_table_base ) [ 2 ] ;
2003-12-30 16:07:57 +00:00
int16_t ( * p_field_mv_table_base [ 2 ] [ 2 ] ) [ 2 ] ;
int16_t ( * b_field_mv_table_base [ 2 ] [ 2 ] [ 2 ] ) [ 2 ] ;
2005-12-17 18:14:38 +00: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
2003-12-30 16:07:57 +00:00
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
uint8_t ( * p_field_select_table [ 2 ] ) ;
uint8_t ( * b_field_select_table [ 2 ] [ 2 ] ) ;
2015-07-07 00:20:43 +00:00
# if FF_API_MOTION_EST
2005-12-17 18:14:38 +00:00
int me_method ; ///< ME algorithm
2015-07-07 00:20:43 +00:00
# endif
int motion_est ; ///< ME algorithm
2015-11-09 02:15:06 +00:00
int me_penalty_compensation ;
2015-11-09 02:15:06 +00:00
int me_pre ; ///< prepass for motion estimation
2001-07-22 14:18:56 +00:00
int mv_dir ;
2007-08-01 22:12:52 +00:00
# define MV_DIR_FORWARD 1
# define MV_DIR_BACKWARD 2
2003-03-06 14:37:37 +00:00
# define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4)
2001-07-22 14:18:56 +00:00
int mv_type ;
2005-12-17 18:14:38 +00:00
# define MV_TYPE_16X16 0 ///< 1 vector for the whole mb
# define MV_TYPE_8X8 1 ///< 4 vectors (h263, mpeg4 4MV)
# 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 14:18:56 +00: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 ] ;
2005-12-17 18:14:38 +00:00
int last_mv [ 2 ] [ 2 ] [ 2 ] ; ///< last MV, used for MV prediction in MPEG1 & B-frame MPEG4
uint8_t * fcode_tab ; ///< smallest fcode needed for each MV
2006-04-03 07:52:24 +00:00
int16_t direct_scale_mv [ 2 ] [ 64 ] ; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
2005-12-17 18:14:38 +00:00
2002-12-27 23:51:46 +00:00
MotionEstContext me ;
2001-07-22 14:18:56 +00:00
2005-12-17 18:14:38 +00:00
int no_rounding ; /**< apply no rounding to motion compensation (MPEG4, msmpeg4, ...)
2007-04-07 14:09:20 +00:00
for b - frames rounding mode is always 0 */
2001-07-22 14:18:56 +00:00
/* macroblock layer */
int mb_x , mb_y ;
2003-03-30 19:26:01 +00:00
int mb_skip_run ;
2001-07-22 14:18:56 +00:00
int mb_intra ;
2014-02-28 12:40:54 +00:00
uint16_t * mb_type ; ///< Table for candidate MB types for encoding (defines in mpegutils.h)
2006-12-21 15:20:02 +00:00
2003-03-06 14:37:37 +00:00
int block_index [ 6 ] ; ///< index to current MB in block based arrays with edges
2002-03-15 14:57:17 +00:00
int block_wrap [ 6 ] ;
2003-07-29 02:09:12 +00:00
uint8_t * dest [ 3 ] ;
2005-12-17 18:14:38 +00:00
2003-04-10 13:18:38 +00:00
int * mb_index2xy ; ///< mb_index -> mb_x + mb_y*mb_stride
2002-03-15 14:57:17 +00:00
2003-03-06 14:37:37 +00:00
/** matrix transmitted in the bitstream */
2003-02-11 16:35:48 +00: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 18:58:07 +00:00
int force_duplicated_matrix ; ///< Force duplication of mjpeg matrices, useful for rtp streaming
2014-07-22 18:10:13 +00:00
2005-12-17 18:14:38 +00: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 17:23:56 +00:00
uint8_t * intra_ac_vlc_length ;
uint8_t * intra_ac_vlc_last_length ;
2015-02-10 23:34:02 +00:00
uint8_t * intra_chroma_ac_vlc_length ;
uint8_t * intra_chroma_ac_vlc_last_length ;
2002-12-31 17:23:56 +00:00
uint8_t * inter_ac_vlc_length ;
uint8_t * inter_ac_vlc_last_length ;
2003-01-19 17:55:13 +00:00
uint8_t * luma_dc_vlc_length ;
2003-01-01 00:42:18 +00:00
# define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level))
2002-12-31 17:23:56 +00:00
2012-11-07 21:44:27 +00:00
int coded_score [ 12 ] ;
2003-09-30 22:18:43 +00:00
2003-03-06 14:37:37 +00:00
/** precomputed matrix (combine qscale and DCT renorm) */
2003-10-22 10:59:39 +00:00
int ( * q_intra_matrix ) [ 64 ] ;
2011-09-25 04:46:39 +00:00
int ( * q_chroma_intra_matrix ) [ 64 ] ;
2003-10-22 10:59:39 +00:00
int ( * q_inter_matrix ) [ 64 ] ;
2003-10-22 11:23:39 +00: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 04:46:39 +00:00
uint16_t ( * q_chroma_intra_matrix16 ) [ 2 ] [ 64 ] ;
2003-10-22 11:23:39 +00:00
uint16_t ( * q_inter_matrix16 ) [ 2 ] [ 64 ] ;
2005-12-17 18:14:38 +00:00
2003-11-02 23:19:47 +00:00
/* noise reduction */
int ( * dct_error_sum ) [ 64 ] ;
int dct_count [ 2 ] ;
uint16_t ( * dct_offset ) [ 64 ] ;
2001-07-22 14:18:56 +00:00
/* bit rate control */
2003-02-11 16:35:48 +00:00
int64_t total_bits ;
2005-12-17 18:14:38 +00:00
int frame_bits ; ///< bits used for the current frame
2012-09-11 15:20:08 +00:00
int stuffing_bits ; ///< bits used for stuffing
2006-10-05 19:27:18 +00:00
int next_lambda ; ///< next lambda used for retrying to encode a frame
2003-03-06 14:37:37 +00:00
RateControlContext rc_context ; ///< contains stuff only accessed in ratecontrol.c
2002-03-17 16:31:38 +00:00
2002-03-23 17:43:30 +00: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 12:26:09 +00:00
int f_count ;
int b_count ;
2002-03-23 17:43:30 +00:00
int skip_count ;
2003-03-06 14:37:37 +00:00
int misc_bits ; ///< cbp, mb_type
int last_bits ; ///< temp var used for calculating the above vars
2005-12-17 18:14:38 +00:00
2002-06-02 12:20:39 +00:00
/* error concealment / resync */
2005-12-17 18:14:38 +00: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 14:37:37 +00:00
int mb_num_left ; ///< number of MBs left in this video packet (for partitioned Slices only)
2005-12-17 18:14:38 +00:00
int next_p_frame_damaged ; ///< set if the next p frame is damaged, to avoid showing trashed b frames
2002-11-08 18:35:39 +00:00
ParseContext parse_context ;
2002-03-23 17:43:30 +00:00
2001-11-12 05:19:55 +00:00
/* H.263 specific */
2001-11-19 02:13:14 +00:00
int gob_index ;
2003-11-29 08:37:51 +00:00
int obmc ; ///< overlapped block motion compensation
2012-02-27 21:23:45 +00: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 16:44:24 +00:00
int ehc_mode ;
2015-07-03 15:46:44 +00:00
int rc_strategy ;
2005-12-17 18:14:38 +00:00
2001-08-31 06:21:27 +00:00
/* H.263+ specific */
2005-12-17 18:14:38 +00:00
int umvplus ; ///< == H263+ && unrestricted_mv
2003-12-07 01:33:45 +00:00
int h263_aic_dir ; ///< AIC direction: 0 = left, 1 = top
int h263_slice_structured ;
2003-11-29 08:37:51 +00:00
int alt_inter_vlc ; ///< alternative inter vlc
2003-11-30 14:35:35 +00:00
int modified_quant ;
2005-12-17 18:14:38 +00:00
int loop_filter ;
2004-03-10 22:11:49 +00:00
int custom_pcf ;
2005-12-17 18:14:38 +00:00
2001-07-22 14:18:56 +00:00
/* mpeg4 specific */
2013-11-26 10:23:16 +00:00
///< number of bits to represent the fractional part of time (encoder only)
int time_increment_bits ;
2002-04-17 04:32:12 +00:00
int last_time_base ;
2005-12-17 18:14:38 +00:00
int time_base ; ///< time in seconds of last I,P,S Frame
int64_t time ; ///< time of current frame
2003-02-11 16:35:48 +00:00
int64_t last_non_b_time ;
2005-12-17 18:14:38 +00: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 16:35:48 +00:00
uint16_t pp_field_time ;
2005-12-17 18:14:38 +00:00
uint16_t pb_field_time ; ///< like above, just for interlaced
2002-03-09 13:01:16 +00:00
int real_sprite_warping_points ;
2005-12-17 18:14:38 +00:00
int sprite_offset [ 2 ] [ 2 ] ; ///< sprite offset[isChroma][isMVY]
int sprite_delta [ 2 ] [ 2 ] ; ///< sprite_delta [isY][isMVY]
2002-03-07 13:27:15 +00:00
int mcsel ;
2001-08-13 21:48:05 +00:00
int quant_precision ;
2005-12-17 18:14:38 +00:00
int quarter_sample ; ///< 1->qpel, 0->half pel ME/MC
2003-04-04 14:42:28 +00:00
int aspect_ratio_info ; //FIXME remove
2002-03-05 13:58:13 +00:00
int sprite_warping_accuracy ;
2005-12-17 18:14:38 +00:00
int data_partitioning ; ///< data partitioning flag from header
int partitioned_frame ; ///< is current frame partitioned
int low_delay ; ///< no reordering needed / has no b-frames
2002-04-22 19:04:28 +00:00
int vo_type ;
2005-12-17 18:14:38 +00:00
PutBitContext tex_pb ; ///< used for data partitioned VOPs
PutBitContext pb2 ; ///< used for data partitioned VOPs
2002-08-02 20:27:46 +00:00
int mpeg_quant ;
2005-12-17 18:14:38 +00:00
int padding_bug_score ; ///< used to detect the VERY common padding bug in MPEG4
2002-03-09 13:01:16 +00:00
/* divx specific, used to workaround (many) bugs in divx5 */
2003-03-20 17:52:30 +00:00
int divx_packed ;
2003-02-11 16:35:48 +00:00
uint8_t * bitstream_buffer ; //Divx 5.01 puts several frames in a single one, this is used to reorder them
2002-04-22 12:45:22 +00:00
int bitstream_buffer_size ;
2006-01-25 22:10:13 +00:00
unsigned int allocated_bitstream_buffer_size ;
2005-12-17 18:14:38 +00:00
2001-07-22 14:18:56 +00:00
/* RV10 specific */
2005-12-17 18:14:38 +00:00
int rv10_version ; ///< RV10 version: 0 or 3
2001-07-22 14:18:56 +00:00
int rv10_first_dc_coded [ 3 ] ;
2005-12-17 18:14:38 +00:00
2001-07-22 14:18:56 +00:00
/* MJPEG specific */
struct MJpegContext * mjpeg_ctx ;
2012-06-14 14:26:15 +00:00
int esc_pos ;
2015-11-09 02:15:06 +00:00
int pred ;
2001-07-22 14:18:56 +00: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 18:14:38 +00:00
int slice_height ; ///< in macroblocks
int first_slice_line ; ///< used in mpeg4 too to handle resync markers
2002-01-15 22:22:41 +00:00
int flipflop_rounding ;
2003-03-06 14:37:37 +00:00
int msmpeg4_version ; ///< 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8
2002-06-18 00:50:20 +00:00
int per_mb_rl_table ;
int esc3_level_length ;
int esc3_run_length ;
2003-03-06 14:37:37 +00:00
/** [mb_intra][isChroma][level][run][last] */
2002-09-11 07:26:43 +00:00
int ( * ac_stats ) [ 2 ] [ MAX_LEVEL + 1 ] [ MAX_RUN + 1 ] [ 2 ] ;
2002-07-07 08:34:46 +00:00
int inter_intra_pred ;
2002-12-27 23:51:46 +00:00
int mspel ;
2002-06-18 00:50:20 +00:00
2001-07-22 14:18:56 +00:00
/* decompression specific */
GetBitContext gb ;
2002-12-04 10:04:03 +00:00
/* Mpeg1 specific */
2005-12-17 18:14:38 +00:00
int gop_picture_number ; ///< index of the first picture of a GOP based on fake_pic_num & mpeg1 specific
int last_mv_dir ; ///< last mv_dir, used for b frame encoding
uint8_t * vbv_delay_ptr ; ///< pointer to vbv_delay in the bitstream
2009-03-02 05:41:55 +00:00
/* MPEG-2-specific - I wished not to have to support this mess. */
2001-07-22 14:18:56 +00:00
int progressive_sequence ;
int mpeg_f_code [ 2 ] [ 2 ] ;
2014-02-28 12:40:54 +00:00
// picture structure defines are loaded from mpegutils.h
2001-07-22 14:18:56 +00:00
int picture_structure ;
2015-09-13 21:45:24 +00:00
int64_t timecode_frame_start ; ///< GOP timecode frame start number, in non drop frame format
2001-07-22 14:18:56 +00:00
int intra_dc_precision ;
int frame_pred_frame_dct ;
int top_field_first ;
int concealment_motion_vectors ;
int q_scale_type ;
2015-09-10 22:01:12 +00:00
int brd_scale ;
2001-07-22 14:18:56 +00:00
int intra_vlc_format ;
int alternate_scan ;
2014-06-14 15:07:28 +00:00
int seq_disp_ext ;
2001-07-22 14:18:56 +00:00
int repeat_first_field ;
int chroma_420_type ;
2004-03-01 14:55:21 +00:00
int chroma_format ;
# define CHROMA_420 1
# define CHROMA_422 2
# define CHROMA_444 3
2004-06-11 07:59:12 +00:00
int chroma_x_shift ; //depend on pix_format, that depend on chroma_format
int chroma_y_shift ;
2004-03-01 14:55:21 +00:00
2001-07-22 14:18:56 +00:00
int progressive_frame ;
2011-10-23 23:34:38 +00:00
int full_pel [ 2 ] ;
2001-07-22 14:18:56 +00:00
int interlaced_dct ;
2003-08-22 14:59:04 +00:00
int first_field ; ///< is 1 for the first field of a field picture 0 otherwise
2011-08-27 06:34:05 +00:00
int drop_frame_timecode ; ///< timecode is in drop frame format.
2011-08-27 08:16:14 +00:00
int scan_offset ; ///< reserve space for SVCD scan offset user data.
2003-12-07 01:33:45 +00:00
2001-11-19 02:13:14 +00:00
/* RTP specific */
2003-08-25 22:54:53 +00:00
int rtp_mode ;
2015-09-13 21:45:24 +00:00
int rtp_payload_size ;
2005-12-17 18:14:38 +00:00
2012-01-16 13:45:46 +00:00
char * tc_opt_str ; ///< timecode option string
AVTimecode tc ; ///< timecode context
2011-07-06 12:44:59 +00:00
2003-02-11 16:35:48 +00:00
uint8_t * ptr_lastgob ;
2009-03-02 05:41:55 +00:00
int swap_uv ; //vcr2 codec is an MPEG-2 variant with U and V swapped
2013-12-14 19:29:15 +00:00
int pack_pblocks ; //xvmc needs to keep blocks without gaps.
2013-01-20 00:02:29 +00:00
int16_t ( * pblocks [ 12 ] ) [ 64 ] ;
2005-12-17 18:14:38 +00:00
2013-01-20 00:02:29 +00:00
int16_t ( * block ) [ 64 ] ; ///< points to one of the following blocks
2013-01-23 16:44:56 +00:00
int16_t ( * blocks ) [ 12 ] [ 64 ] ; // for HQ mode we need to keep the best block
2013-01-20 00:02:29 +00:00
int ( * decode_mb ) ( struct MpegEncContext * s , int16_t block [ 6 ] [ 64 ] ) ; // used by some codecs to avoid a switch()
2002-10-13 13:16:04 +00:00
# define SLICE_OK 0
# define SLICE_ERROR -1
2003-08-22 14:59:04 +00: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 18:14:38 +00:00
void ( * dct_unquantize_mpeg1_intra ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 18:14:38 +00:00
void ( * dct_unquantize_mpeg1_inter ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 18:14:38 +00:00
void ( * dct_unquantize_mpeg2_intra ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 18:14:38 +00:00
void ( * dct_unquantize_mpeg2_inter ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 18:14:38 +00:00
void ( * dct_unquantize_h263_intra ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2005-12-17 18:14:38 +00:00
void ( * dct_unquantize_h263_inter ) ( struct MpegEncContext * s ,
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2003-12-14 02:57:00 +00:00
void ( * dct_unquantize_intra ) ( struct MpegEncContext * s , // unquantizer to use (mpeg4 can use both)
2013-01-20 00:02:29 +00:00
int16_t * block /*align 16*/ , int n , int qscale ) ;
2003-12-14 02:57:00 +00:00
void ( * dct_unquantize_inter ) ( struct MpegEncContext * s , // unquantizer to use (mpeg4 can use both)
2013-01-20 00:02:29 +00: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 11:12:19 +00:00
int mpv_flags ; ///< flags set by private options
2012-02-27 19:06:23 +00:00
int quantizer_noise_shaping ;
2012-06-24 18:19:24 +00:00
2013-10-27 12:51:16 +00:00
/**
* ratecontrol qmin qmax limiting method
2014-10-18 11:30:38 +00:00
* 0 - > clipping , 1 - > use a nice continuous function to limit qscale within qmin / qmax .
2013-10-27 12:51:16 +00:00
*/
float rc_qsquish ;
2013-10-27 12:51:16 +00:00
float rc_qmod_amp ;
int rc_qmod_freq ;
2013-10-27 12:51:16 +00:00
float rc_initial_cplx ;
float rc_buffer_aggressivity ;
2013-10-27 12:51:16 +00:00
float border_masking ;
2013-10-27 12:51:16 +00:00
int lmin , lmax ;
2015-07-30 02:56:06 +00:00
int vbv_ignore_qmax ;
2013-10-27 12:51:16 +00:00
2013-10-27 12:51:16 +00:00
char * rc_eq ;
2012-06-24 18:19:24 +00:00
/* temp buffers for rate control */
float * cplx_tab , * bits_tab ;
2012-09-18 13:48:14 +00:00
/* flag to indicate a reinitialization is required, e.g. after
* a frame size change */
int context_reinit ;
2013-02-02 19:42:07 +00:00
ERContext er ;
2013-10-27 12:51:16 +00:00
int error_rate ;
2013-11-09 09:14:46 +00:00
/* temporary frames used by b_frame_strategy = 2 */
AVFrame * tmp_frames [ MAX_B_FRAMES + 2 ] ;
2015-09-09 02:18:26 +00:00
int b_frame_strategy ;
int b_sensitivity ;
2015-09-11 01:30:38 +00: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 20:27:59 +00:00
int scenechange_threshold ;
2015-09-13 21:45:24 +00:00
int noise_reduction ;
2001-07-22 14:18:56 +00:00
} MpegEncContext ;
2012-02-27 11:12:19 +00:00
/* mpegvideo_enc common options */
# define FF_MPV_FLAG_SKIP_RD 0x0001
2012-02-27 11:23:19 +00:00
# define FF_MPV_FLAG_STRICT_GOP 0x0002
2012-02-27 11:23:19 +00:00
# define FF_MPV_FLAG_QP_RD 0x0004
2012-02-27 11:23:19 +00:00
# define FF_MPV_FLAG_CBP_RD 0x0008
2014-04-29 06:00:03 +00:00
# define FF_MPV_FLAG_NAQ 0x0010
2014-04-29 06:00:03 +00:00
# define FF_MPV_FLAG_MV0 0x0020
2012-02-27 11:12:19 +00:00
2015-11-21 20:28:31 +00:00
enum rc_strategy {
MPV_RC_STRATEGY_FFMPEG ,
MPV_RC_STRATEGY_XVID ,
NB_MPV_RC_STRATEGY
} ;
2015-09-11 01:30:38 +00: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 " } , \
{ " chroma " , NULL , 0 , AV_OPT_TYPE_CONST , { . i64 = FF_CMP_CHROMA } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS , " cmp_func " }
2014-10-18 17:41:48 +00:00
# ifndef FF_MPV_OFFSET
2012-02-27 11:12:19 +00:00
# define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
2014-10-18 17:41:48 +00:00
# endif
2012-02-27 11:12:19 +00:00
# define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
# define FF_MPV_COMMON_OPTS \
2015-09-11 01:30:38 +00:00
FF_MPV_OPT_CMP_FUNC , \
2012-08-31 09:52:18 +00: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 09:45:52 +00: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 06:00:03 +00: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 06:00:03 +00: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 18:09:49 +00:00
{ " luma_elim_threshold " , " single coefficient elimination threshold for luminance (negative values also consider dc coefficient) " , \
2012-08-31 10:22:31 +00:00
FF_MPV_OFFSET ( luma_elim_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2012-02-27 18:09:49 +00:00
{ " chroma_elim_threshold " , " single coefficient elimination threshold for chrominance (negative values also consider dc coefficient) " , \
2012-08-31 10:22:31 +00:00
FF_MPV_OFFSET ( chroma_elim_threshold ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2013-10-27 12:51:16 +00: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 12:51:16 +00: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 12:51:16 +00: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 12:51:16 +00: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 12:51:16 +00: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 12:51:16 +00: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 12:51:16 +00: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 11:14:22 +00: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-11-21 20:28:31 +00:00
{ " rc_strategy " , " ratecontrol method " , FF_MPV_OFFSET ( rc_strategy ) , AV_OPT_TYPE_INT , { . i64 = MPV_RC_STRATEGY_FFMPEG } , 0 , NB_MPV_RC_STRATEGY - 1 , FF_MPV_OPT_FLAGS , " rc_strategy " } , \
{ " ffmpeg " , " default native rate control " , 0 , AV_OPT_TYPE_CONST , { . i64 = MPV_RC_STRATEGY_FFMPEG } , 0 , 0 , FF_MPV_OPT_FLAGS , " rc_strategy " } , \
{ " xvid " , " libxvid (2 pass only) " , 0 , AV_OPT_TYPE_CONST , { . i64 = MPV_RC_STRATEGY_XVID } , 0 , 0 , FF_MPV_OPT_FLAGS , " rc_strategy " } , \
2015-07-07 00:20:43 +00: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-10-09 18:58:07 +00:00
{ " force_duplicated_matrix " , " Always write luma and chroma matrix for mjpeg, useful for rtp streaming. " , FF_MPV_OFFSET ( force_duplicated_matrix ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , FF_MPV_OPT_FLAGS } , \
2015-09-09 02:18:26 +00:00
{ " 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 } , \
2015-09-10 22:01:12 +00:00
{ " 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 } , \
2015-09-11 01:30:38 +00: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 20:27:59 +00: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 21:45:24 +00: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 21:45:24 +00:00
{ " mpeg_quant " , " Use MPEG quantizers instead of H.263 " , FF_MPV_OFFSET ( mpeg_quant ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 1 , FF_MPV_OPT_FLAGS } , \
2015-09-13 21:45:24 +00: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 02:15:06 +00: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 02:15:06 +00:00
{ " mepre " , " pre motion estimation " , FF_MPV_OFFSET ( me_pre ) , AV_OPT_TYPE_INT , { . i64 = 0 } , INT_MIN , INT_MAX , FF_MPV_OPT_FLAGS } , \
2012-02-27 11:12:19 +00:00
extern const AVOption ff_mpv_generic_options [ ] ;
2012-08-03 23:50:21 +00: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 15:25:12 +00:00
void ff_mpv_common_defaults ( MpegEncContext * s ) ;
2012-09-25 16:04:36 +00:00
void ff_dct_encode_init_x86 ( MpegEncContext * s ) ;
2014-08-15 18:00:34 +00:00
2014-08-10 15:25:12 +00:00
int ff_mpv_common_init ( MpegEncContext * s ) ;
void ff_mpv_common_init_arm ( MpegEncContext * s ) ;
2014-08-15 18:00:34 +00:00
void ff_mpv_common_init_axp ( MpegEncContext * s ) ;
2014-08-10 15:25:12 +00: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 15:27:12 +00:00
void ff_mpv_common_init_mips ( MpegEncContext * s ) ;
2014-08-10 15:25:12 +00:00
int ff_mpv_common_frame_size_change ( MpegEncContext * s ) ;
void ff_mpv_common_end ( MpegEncContext * s ) ;
void ff_mpv_decode_defaults ( MpegEncContext * s ) ;
2014-09-05 14:57:57 +00:00
void ff_mpv_decode_init ( MpegEncContext * s , AVCodecContext * avctx ) ;
2014-08-10 15:25:12 +00:00
void ff_mpv_decode_mb ( MpegEncContext * s , int16_t block [ 12 ] [ 64 ] ) ;
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 09:30:05 +00:00
const AVFrame * frame , int * got_packet ) ;
2015-05-25 02:12:13 +00:00
int ff_mpv_reallocate_putbitbuffer ( MpegEncContext * s , size_t threshold , size_t size_increase ) ;
2014-08-10 15:25:12 +00:00
2002-06-02 12:20:39 +00:00
void ff_clean_intra_table_entries ( MpegEncContext * s ) ;
2013-02-03 13:26:34 +00:00
void ff_mpeg_draw_horiz_band ( MpegEncContext * s , int y , int h ) ;
2003-07-17 12:29:07 +00:00
void ff_mpeg_flush ( AVCodecContext * avctx ) ;
2013-03-12 09:51:03 +00:00
2013-03-12 10:23:07 +00:00
void ff_print_debug_info ( MpegEncContext * s , Picture * p , AVFrame * pict ) ;
2014-03-27 21:14:26 +00:00
void ff_print_debug_info2 ( AVCodecContext * avctx , AVFrame * pict , uint8_t * mbskip_table ,
uint32_t * mbtype_table , int8_t * qscale_table , int16_t ( * motion_val [ 2 ] ) [ 2 ] ,
2013-03-12 10:23:07 +00:00
int * low_delay ,
2013-03-12 09:51:03 +00:00
int mb_width , int mb_height , int mb_stride , int quarter_sample ) ;
2013-03-15 13:33:24 +00:00
int ff_mpv_export_qp_table ( MpegEncContext * s , AVFrame * f , Picture * p , int qp_type ) ;
2006-09-27 19:47:39 +00:00
void ff_write_quant_matrix ( PutBitContext * pb , uint16_t * matrix ) ;
2015-04-27 21:09:21 +00:00
2012-11-25 21:42:07 +00:00
int ff_update_duplicate_context ( MpegEncContext * dst , MpegEncContext * src ) ;
2011-03-22 21:36:57 +00:00
int ff_mpeg_update_thread_context ( AVCodecContext * dst , const AVCodecContext * src ) ;
2010-03-06 22:36:52 +00:00
void ff_set_qscale ( MpegEncContext * s , int qscale ) ;
2002-12-17 11:25:29 +00:00
2014-08-08 15:11:20 +00:00
void ff_mpv_idct_init ( MpegEncContext * s ) ;
2012-09-25 16:04:36 +00:00
int ff_dct_encode_init ( MpegEncContext * s ) ;
2014-02-07 09:05:46 +00:00
void ff_convert_matrix ( MpegEncContext * s , int ( * qmat ) [ 64 ] , uint16_t ( * qmat16 ) [ 2 ] [ 64 ] ,
2007-10-08 09:14:46 +00:00
const uint16_t * quant_matrix , int bias , int qmin , int qmax , int intra ) ;
2013-01-20 00:02:29 +00:00
int ff_dct_quantize_c ( MpegEncContext * s , int16_t * block , int n , int qscale , int * overflow ) ;
2015-10-12 17:37:42 +00:00
void ff_block_permute ( int16_t * block , uint8_t * permutation ,
const uint8_t * scantable , int last ) ;
2003-07-29 02:09:12 +00:00
void ff_init_block_index ( MpegEncContext * s ) ;
2002-10-13 13:16:04 +00:00
2014-08-10 15:25:12 +00:00
void ff_mpv_motion ( MpegEncContext * s ,
2012-08-03 23:50:21 +00: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 13:16:04 +00:00
static inline void ff_update_block_index ( MpegEncContext * s ) {
2012-04-22 19:37:54 +00:00
const int block_size = 8 > > s - > avctx - > lowres ;
2004-09-25 23:18:58 +00:00
2002-10-13 13:16:04 +00: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-25 23:18:58 +00:00
s - > dest [ 0 ] + = 2 * block_size ;
s - > dest [ 1 ] + = block_size ;
s - > dest [ 2 ] + = block_size ;
2002-10-13 13:16:04 +00:00
}
2003-04-02 09:57:34 +00:00
static inline int get_bits_diff ( MpegEncContext * s ) {
2004-02-06 15:27:31 +00:00
const int bits = put_bits_count ( & s - > pb ) ;
2003-04-02 09:57:34 +00:00
const int last = s - > last_bits ;
s - > last_bits = bits ;
return bits - last ;
}
2002-10-13 13:16:04 +00:00
2008-08-31 07:39:47 +00:00
# endif /* AVCODEC_MPEGVIDEO_H */