ve_lavc.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,050 行 · 第 1/3 页
C
1,050 行
#include <uclib.h>#include <uclib.h>#include <uclib.h>#include <math.h>#include <time.h>#include <assert.h>#if !defined(INFINITY) && defined(HUGE_VAL)#define INFINITY HUGE_VAL#endif#include "config.h"#include "mp_msg.h"#include "help_mp.h"#include "codec-cfg.h"#include "stream/stream.h"#include "libmpdemux/demuxer.h"#include "libmpdemux/stheader.h"#include "libmpdemux/muxer.h"#include "img_format.h"#include "mp_image.h"#include "vf.h"#undef memcpy#define memcpy uc_memcpyextern char* passtmpfile;//===========================================================================//#ifdef USE_LIBAVCODEC_SO#include <ffmpeg/avcodec.h>#else#include "libavcodec/avcodec.h"#endifextern int avcodec_inited;/* video options */static char *lavc_param_vcodec = "mpeg4";static int lavc_param_vbitrate = -1;static int lavc_param_vrate_tolerance = 1000*8;static int lavc_param_mb_decision = 0; /* default is realtime encoding */static int lavc_param_v4mv = 0;static int lavc_param_vme = 4;static float lavc_param_vqscale = -1;static int lavc_param_vqmin = 2;static int lavc_param_vqmax = 31;static int lavc_param_mb_qmin = 2;static int lavc_param_mb_qmax = 31;static float lavc_param_lmin = 2;static float lavc_param_lmax = 31;static float lavc_param_mb_lmin = 2;static float lavc_param_mb_lmax = 31;static int lavc_param_vqdiff = 3;static float lavc_param_vqcompress = 0.5;static float lavc_param_vqblur = 0.5;static float lavc_param_vb_qfactor = 1.25;static float lavc_param_vb_qoffset = 1.25;static float lavc_param_vi_qfactor = 0.8;static float lavc_param_vi_qoffset = 0.0;static int lavc_param_vmax_b_frames = 0;static int lavc_param_keyint = -1;static int lavc_param_vpass = 0;static int lavc_param_vrc_strategy = 0;static int lavc_param_vb_strategy = 0;static int lavc_param_luma_elim_threshold = 0;static int lavc_param_chroma_elim_threshold = 0;static int lavc_param_packet_size= 0;static int lavc_param_strict= -1;static int lavc_param_data_partitioning= 0;static int lavc_param_gray=0;static float lavc_param_rc_qsquish=1.0;static float lavc_param_rc_qmod_amp=0;static int lavc_param_rc_qmod_freq=0;static char *lavc_param_rc_override_string=NULL;static char *lavc_param_rc_eq="tex^qComp";static int lavc_param_rc_buffer_size=0;static float lavc_param_rc_buffer_aggressivity=1.0;static int lavc_param_rc_max_rate=0;static int lavc_param_rc_min_rate=0;static float lavc_param_rc_initial_cplx=0;static float lavc_param_rc_initial_buffer_occupancy=0.9;static int lavc_param_mpeg_quant=0;static int lavc_param_fdct=0;static int lavc_param_idct=0;static char* lavc_param_aspect = NULL;static int lavc_param_autoaspect = 0;static float lavc_param_lumi_masking= 0.0;static float lavc_param_dark_masking= 0.0;static float lavc_param_temporal_cplx_masking= 0.0;static float lavc_param_spatial_cplx_masking= 0.0;static float lavc_param_p_masking= 0.0;static float lavc_param_border_masking= 0.0;static int lavc_param_normalize_aqp= 0;static int lavc_param_interlaced_dct= 0;static int lavc_param_prediction_method= FF_PRED_LEFT;static int lavc_param_format= IMGFMT_YV12;static int lavc_param_debug= 0;static int lavc_param_psnr= 0;static int lavc_param_me_pre_cmp= 0;static int lavc_param_me_cmp= 0;static int lavc_param_me_sub_cmp= 0;static int lavc_param_mb_cmp= 0;#ifdef FF_CMP_VSADstatic int lavc_param_ildct_cmp= FF_CMP_VSAD;#endifstatic int lavc_param_pre_dia_size= 0;static int lavc_param_dia_size= 0;static int lavc_param_qpel= 0;static int lavc_param_trell= 0;static int lavc_param_lowdelay= 0;static int lavc_param_bit_exact = 0;static int lavc_param_aic= 0;static int lavc_param_aiv= 0;static int lavc_param_umv= 0;static int lavc_param_obmc= 0;static int lavc_param_loop= 0;static int lavc_param_last_pred= 0;static int lavc_param_pre_me= 1;static int lavc_param_me_subpel_quality= 8;static int lavc_param_me_range= 0;static int lavc_param_ibias= FF_DEFAULT_QUANT_BIAS;static int lavc_param_pbias= FF_DEFAULT_QUANT_BIAS;static int lavc_param_coder= 0;static int lavc_param_context= 0;static char *lavc_param_intra_matrix = NULL;static char *lavc_param_inter_matrix = NULL;static int lavc_param_cbp= 0;static int lavc_param_mv0= 0;static int lavc_param_noise_reduction= 0;static int lavc_param_qns= 0;static int lavc_param_qp_rd= 0;static int lavc_param_inter_threshold= 0;static int lavc_param_sc_threshold= 0;static int lavc_param_ss= 0;static int lavc_param_top= -1;static int lavc_param_alt= 0;static int lavc_param_ilme= 0;static int lavc_param_nssew= 8;static int lavc_param_closed_gop = 0;static int lavc_param_dc_precision = 8;static int lavc_param_threads= 1;static int lavc_param_turbo = 0;static int lavc_param_skip_threshold=0;static int lavc_param_skip_factor=0;static int lavc_param_skip_exp=0;static int lavc_param_skip_cmp=0;static int lavc_param_brd_scale = 0;static int lavc_param_bidir_refine = 0;static int lavc_param_sc_factor = 1;static int lavc_param_video_global_header= 0;static int lavc_param_mv0_threshold = 256;static int lavc_param_refs = 1;static int lavc_param_b_sensitivity = 40;static int lavc_param_level = FF_LEVEL_UNKNOWN;char *lavc_param_acodec = "mp2";int lavc_param_atag = 0;int lavc_param_abitrate = 224;int lavc_param_audio_global_header= 0;#include "m_option.h"#ifdef USE_LIBAVCODECm_option_t lavcopts_conf[]={ {"acodec", &lavc_param_acodec, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"abitrate", &lavc_param_abitrate, CONF_TYPE_INT, CONF_RANGE, 1, 1000000, NULL}, {"atag", &lavc_param_atag, CONF_TYPE_INT, CONF_RANGE, 0, 0xffff, NULL}, {"vcodec", &lavc_param_vcodec, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"vbitrate", &lavc_param_vbitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, {"vratetol", &lavc_param_vrate_tolerance, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, {"vhq", &lavc_param_mb_decision, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"mbd", &lavc_param_mb_decision, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL}, {"v4mv", &lavc_param_v4mv, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"vme", &lavc_param_vme, CONF_TYPE_INT, CONF_RANGE, 0, 8, NULL}, {"vqscale", &lavc_param_vqscale, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 255.0, NULL}, {"vqmin", &lavc_param_vqmin, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"vqmax", &lavc_param_vqmax, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"mbqmin", &lavc_param_mb_qmin, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"mbqmax", &lavc_param_mb_qmax, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"lmin", &lavc_param_lmin, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, {"lmax", &lavc_param_lmax, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, {"mblmin", &lavc_param_mb_lmin, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, {"mblmax", &lavc_param_mb_lmax, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, {"vqdiff", &lavc_param_vqdiff, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"vqcomp", &lavc_param_vqcompress, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, {"vqblur", &lavc_param_vqblur, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, {"vb_qfactor", &lavc_param_vb_qfactor, CONF_TYPE_FLOAT, CONF_RANGE, -31.0, 31.0, NULL}, {"vmax_b_frames", &lavc_param_vmax_b_frames, CONF_TYPE_INT, CONF_RANGE, 0, FF_MAX_B_FRAMES, NULL}, {"vpass", &lavc_param_vpass, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL}, {"vrc_strategy", &lavc_param_vrc_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL}, {"vb_strategy", &lavc_param_vb_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, {"vb_qoffset", &lavc_param_vb_qoffset, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 31.0, NULL}, {"vlelim", &lavc_param_luma_elim_threshold, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, {"vcelim", &lavc_param_chroma_elim_threshold, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, {"vpsize", &lavc_param_packet_size, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, {"vstrict", &lavc_param_strict, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, {"vdpart", &lavc_param_data_partitioning, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, {"keyint", &lavc_param_keyint, CONF_TYPE_INT, 0, 0, 0, NULL}, {"gray", &lavc_param_gray, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, {"mpeg_quant", &lavc_param_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"vi_qfactor", &lavc_param_vi_qfactor, CONF_TYPE_FLOAT, CONF_RANGE, -31.0, 31.0, NULL}, {"vi_qoffset", &lavc_param_vi_qoffset, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 31.0, NULL}, {"vqsquish", &lavc_param_rc_qsquish, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, {"vqmod_amp", &lavc_param_rc_qmod_amp, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, {"vqmod_freq", &lavc_param_rc_qmod_freq, CONF_TYPE_INT, 0, 0, 0, NULL}, {"vrc_eq", &lavc_param_rc_eq, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"vrc_override", &lavc_param_rc_override_string, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"vrc_maxrate", &lavc_param_rc_max_rate, CONF_TYPE_INT, CONF_RANGE, 0, 24000000, NULL}, {"vrc_minrate", &lavc_param_rc_min_rate, CONF_TYPE_INT, CONF_RANGE, 0, 24000000, NULL}, {"vrc_buf_size", &lavc_param_rc_buffer_size, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, {"vrc_buf_aggressivity", &lavc_param_rc_buffer_aggressivity, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, {"vrc_init_cplx", &lavc_param_rc_initial_cplx, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 9999999.0, NULL}, {"vrc_init_occupancy", &lavc_param_rc_initial_buffer_occupancy, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, {"vfdct", &lavc_param_fdct, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, {"aspect", &lavc_param_aspect, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"autoaspect", &lavc_param_autoaspect, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"lumi_mask", &lavc_param_lumi_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, {"tcplx_mask", &lavc_param_temporal_cplx_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, {"scplx_mask", &lavc_param_spatial_cplx_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, {"p_mask", &lavc_param_p_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, {"naq", &lavc_param_normalize_aqp, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"dark_mask", &lavc_param_dark_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, {"ildct", &lavc_param_interlaced_dct, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"idct", &lavc_param_idct, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, {"pred", &lavc_param_prediction_method, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, {"format", &lavc_param_format, CONF_TYPE_IMGFMT, 0, 0, 0, NULL}, {"debug", &lavc_param_debug, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, {"psnr", &lavc_param_psnr, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PSNR, NULL}, {"precmp", &lavc_param_me_pre_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"cmp", &lavc_param_me_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"subcmp", &lavc_param_me_sub_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"mbcmp", &lavc_param_mb_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"skipcmp", &lavc_param_skip_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL},#ifdef FF_CMP_VSAD {"ildctcmp", &lavc_param_ildct_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL},#endif {"bit_exact", &lavc_param_bit_exact, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_BITEXACT, NULL}, {"predia", &lavc_param_pre_dia_size, CONF_TYPE_INT, CONF_RANGE, -2000, 2000, NULL}, {"dia", &lavc_param_dia_size, CONF_TYPE_INT, CONF_RANGE, -2000, 2000, NULL}, {"qpel", &lavc_param_qpel, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL, NULL}, {"trell", &lavc_param_trell, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRELLIS_QUANT, NULL}, {"lowdelay", &lavc_param_lowdelay, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_LOW_DELAY, NULL}, {"last_pred", &lavc_param_last_pred, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"preme", &lavc_param_pre_me, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, {"subq", &lavc_param_me_subpel_quality, CONF_TYPE_INT, CONF_RANGE, 0, 8, NULL}, {"me_range", &lavc_param_me_range, CONF_TYPE_INT, CONF_RANGE, 0, 16000, NULL},#ifdef CODEC_FLAG_H263P_AIC {"aic", &lavc_param_aic, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIC, NULL}, {"umv", &lavc_param_umv, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_UMV, NULL},#endif#ifdef CODEC_FLAG_H263P_AIV {"aiv", &lavc_param_aiv, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIV, NULL},#endif#ifdef CODEC_FLAG_OBMC {"obmc", &lavc_param_obmc, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_OBMC, NULL},#endif#ifdef CODEC_FLAG_LOOP_FILTER {"loop", &lavc_param_loop, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_LOOP_FILTER, NULL},#endif {"ibias", &lavc_param_ibias, CONF_TYPE_INT, CONF_RANGE, -512, 512, NULL}, {"pbias", &lavc_param_pbias, CONF_TYPE_INT, CONF_RANGE, -512, 512, NULL}, {"coder", &lavc_param_coder, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, {"context", &lavc_param_context, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, {"intra_matrix", &lavc_param_intra_matrix, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"inter_matrix", &lavc_param_inter_matrix, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"cbp", &lavc_param_cbp, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CBP_RD, NULL}, {"mv0", &lavc_param_mv0, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0, NULL}, {"nr", &lavc_param_noise_reduction, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL},#ifdef CODEC_FLAG_QP_RD {"qprd", &lavc_param_qp_rd, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QP_RD, NULL},#endif#ifdef CODEC_FLAG_H263P_SLICE_STRUCT {"ss", &lavc_param_ss, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_SLICE_STRUCT, NULL},#endif#ifdef CODEC_FLAG_ALT_SCAN {"alt", &lavc_param_alt, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_ALT_SCAN, NULL},#endif#ifdef CODEC_FLAG_INTERLACED_ME {"ilme", &lavc_param_ilme, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME, NULL},#endif#ifdef CODEC_FLAG_CLOSED_GOP {"cgop", &lavc_param_closed_gop, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CLOSED_GOP, NULL},#endif {"dc", &lavc_param_dc_precision, CONF_TYPE_INT, CONF_RANGE, 8, 11, NULL}, {"border_mask", &lavc_param_border_masking, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, {"inter_threshold", &lavc_param_inter_threshold, CONF_TYPE_INT, CONF_RANGE, -1000000, 1000000, NULL}, {"sc_threshold", &lavc_param_sc_threshold, CONF_TYPE_INT, CONF_RANGE, -1000000000, 1000000000, NULL}, {"top", &lavc_param_top, CONF_TYPE_INT, CONF_RANGE, -1, 1, NULL}, {"qns", &lavc_param_qns, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, {"nssew", &lavc_param_nssew, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, {"threads", &lavc_param_threads, CONF_TYPE_INT, CONF_RANGE, 1, 8, NULL}, {"turbo", &lavc_param_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"skip_threshold", &lavc_param_skip_threshold, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, {"skip_factor", &lavc_param_skip_factor, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, {"skip_exp", &lavc_param_skip_exp, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, {"brd_scale", &lavc_param_brd_scale, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, {"bidir_refine", &lavc_param_bidir_refine, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL}, {"sc_factor", &lavc_param_sc_factor, CONF_TYPE_INT, CONF_RANGE, 1, INT_MAX, NULL}, {"vglobal", &lavc_param_video_global_header, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, {"aglobal", &lavc_param_audio_global_header, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, {"mv0_threshold", &lavc_param_mv0_threshold, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, {"refs", &lavc_param_refs, CONF_TYPE_INT, CONF_RANGE, 1, 16, NULL}, {"b_sensitivity", &lavc_param_b_sensitivity, CONF_TYPE_INT, CONF_RANGE, 1, INT_MAX, NULL}, {"level", &lavc_param_level, CONF_TYPE_INT, CONF_RANGE, INT_MIN, INT_MAX, NULL}, {NULL, NULL, 0, 0, 0, 0, NULL}};#endifstruct vf_priv_s { muxer_stream_t* mux; AVCodecContext *context; AVFrame *pic; AVCodec *codec; FILE *stats_file;};#define stats_file (vf->priv->stats_file)#define mux_v (vf->priv->mux)#define lavc_venc_context (vf->priv->context)static int encode_frame(struct vf_instance_s* vf, AVFrame *pic, double pts);static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ int size, i; void *p; mux_v->bih->biWidth=width; mux_v->bih->biHeight=height; mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8); mp_msg(MSGT_MENCODER, MSGL_INFO,"videocodec: libavcodec (%dx%d fourcc=%x [%.4s])\n", mux_v->bih->biWidth, mux_v->bih->biHeight, mux_v->bih->biCompression, (char *)&mux_v->bih->biCompression); lavc_venc_context->width = width; lavc_venc_context->height = height; if (lavc_param_vbitrate > 16000) /* != -1 */ lavc_venc_context->bit_rate = lavc_param_vbitrate; else if (lavc_param_vbitrate >= 0) /* != -1 */ lavc_venc_context->bit_rate = lavc_param_vbitrate*1000; else lavc_venc_context->bit_rate = 800000; /* default */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?