ve_xvid4.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,533 行 · 第 1/4 页
C
1,533 行
/***************************************************************************** * * - XviD 1.x export module for mplayer/mencoder - * * Copyright(C) 2003 Marco Belli <elcabesa@inwind.it> * 2003-2004 Edouard Gomez <ed.gomez@free.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ****************************************************************************//***************************************************************************** * Includes ****************************************************************************/#include <uclib.h>#include <uclib.h>#include <uclib.h>#include <errno.h>#include <math.h>#include <time.h>#include "config.h"#include "mp_msg.h"#include "codec-cfg.h"#include "stream/stream.h"#include "libmpdemux/demuxer.h"#include "libmpdemux/stheader.h"#include "stream/stream.h"#include "libmpdemux/muxer.h"#include "img_format.h"#include "mp_image.h"#include "vf.h"#include <xvid.h>#include <uclib.h>#include <stdarg.h>#include <assert.h>#include "m_option.h"#ifdef USE_LIBAVUTIL_SO#include <ffmpeg/avutil.h>#else#include "avutil.h"#endif#define FINE (!0)#define BAD (!FINE)#define MAX_ZONES 64// Profile flag definitions#define PROFILE_ADAPTQUANT 0x00000001#define PROFILE_BVOP 0x00000002#define PROFILE_MPEGQUANT 0x00000004#define PROFILE_INTERLACE 0x00000008#define PROFILE_QPEL 0x00000010#define PROFILE_GMC 0x00000020#define PROFILE_4MV 0x00000040#define PROFILE_DXN 0x00000080// Reduce code duplication in profiles[] array#define PROFILE_S (PROFILE_4MV)#define PROFILE_AS (PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_MPEGQUANT|PROFILE_INTERLACE|PROFILE_QPEL|PROFILE_GMC)typedef const struct{ char *name; ///< profile name int id; ///< mpeg-4 profile id; iso/iec 14496-2:2001 table G-1 int width; ///< profile width restriction int height; ///< profile height restriction int fps; ///< profile frame rate restriction int max_objects; ///< ?????? int total_vmv_buffer_sz; ///< macroblock memory; when BVOPS=false, vmv = 2*vcv; when BVOPS=true, vmv = 3*vcv int max_vmv_buffer_sz; ///< max macroblocks per vop int vcv_decoder_rate; ///< macroblocks decoded per second int max_acpred_mbs; ///< percentage int max_vbv_size; ///< max vbv size (bits) 16368 bits int max_video_packet_length; ///< bits int max_bitrate; ///< bits per second int vbv_peakrate; ///< max bits over anyone second period; 0=don't care int dxn_max_bframes; ///< dxn: max consecutive bframes unsigned int flags; ///< flags for allowed options/dxn note the definitions for PROFILE_S and PROFILE_AS} profile_t;// Code taken from XviD VfW source for profile support/* default vbv_occupancy is (64/170)*vbv_buffer_size */static profile_t profiles[] ={ /* name p@l w h fps obj Tvmv vmv vcv ac% vbv pkt bps vbv_peak dbf flags */ /* unrestricted profile (default) */ { "unrestricted", 0x00, 0, 0, 0, 0, 0, 0, 0, 100, 0*16368, -1, 0, 0, -1, 0xffffffff & ~PROFILE_DXN }, { "sp0", 0x08, 176, 144, 15, 1, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S }, /* simple@l0: max f_code=1, intra_dc_vlc_threshold=0 */ /* if ac preidition is used, adaptive quantization must not be used */ /* <=qcif must be used */ { "sp1", 0x01, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, { "sp2", 0x02, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 4096, 128000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, { "sp3", 0x03, 352, 288, 15, 4, 792, 396, 11880, 100, 40*16368, 8192, 384000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, { "asp0", 0xf0, 176, 144, 30, 1, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, { "asp1", 0xf1, 176, 144, 30, 4, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, { "asp2", 0xf2, 352, 288, 15, 4, 1188, 396, 5940, 100, 40*16368, 4096, 384000, 0, -1, PROFILE_AS }, { "asp3", 0xf3, 352, 288, 30, 4, 1188, 396, 11880, 100, 40*16368, 4096, 768000, 0, -1, PROFILE_AS }, /* ISMA Profile 1, (ASP) @ L3b (CIF, 1.5 Mb/s) CIF(352x288), 30fps, 1.5Mbps max ??? */ { "asp4", 0xf4, 352, 576, 30, 4, 2376, 792, 23760, 50, 80*16368, 8192, 3000000, 0, -1, PROFILE_AS }, { "asp5", 0xf5, 720, 576, 30, 4, 4860, 1620, 48600, 25, 112*16368, 16384, 8000000, 0, -1, PROFILE_AS }, // information provided by DivXNetworks, USA. // "DivX Certified Profile Compatibility v1.1", February 2005 { "dxnhandheld", 0x00, 176, 144, 15, 1, 198, 99, 1485, 100, 32*8192, -1, 537600, 800000, 0, PROFILE_ADAPTQUANT|PROFILE_DXN }, { "dxnportntsc", 0x00, 352, 240, 30, 1, 990, 330, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_DXN }, { "dxnportpal", 0x00, 352, 288, 25, 1, 1188, 396, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_DXN }, { "dxnhtntsc", 0x00, 720, 480, 30, 1, 4050, 1350, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, { "dxnhtpal", 0x00, 720, 576, 25, 1, 4860, 1620, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, { "dxnhdtv", 0x00, 1280, 720, 30, 1,10800, 3600, 108000, 100, 768*8192, -1, 9708400, 16000000, 2, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, { NULL, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000000 },};/** * \brief return the pointer to a chosen profile * \param str the profile name * \return pointer of the appropriate profiles array entry or NULL for a mistyped profile name */static profile_t *profileFromName(char *str){ profile_t *cur = profiles; while (cur->name && strcasecmp(cur->name, str)) cur++; if(!cur->name) return NULL; return cur;}/***************************************************************************** * Configuration options ****************************************************************************/extern char* passtmpfile;static int xvidenc_bitrate = 0;static int xvidenc_pass = 0;static float xvidenc_quantizer = 0;static int xvidenc_packed = 0;static int xvidenc_closed_gop = 1;static int xvidenc_interlaced = 0;static int xvidenc_quarterpel = 0;static int xvidenc_gmc = 0;static int xvidenc_trellis = 1;static int xvidenc_cartoon = 0;static int xvidenc_hqacpred = 1;static int xvidenc_chromame = 1;static int xvidenc_chroma_opt = 0;static int xvidenc_vhq = 1;static int xvidenc_bvhq = 1;static int xvidenc_motion = 6;static int xvidenc_turbo = 0;static int xvidenc_stats = 0;static int xvidenc_max_key_interval = 0; /* Let xvidcore set a 10s interval by default */static int xvidenc_frame_drop_ratio = 0;static int xvidenc_greyscale = 0;static int xvidenc_luminance_masking = 0;static int xvidenc_debug = 0;static int xvidenc_psnr = 0;static int xvidenc_max_bframes = 2;static int xvidenc_num_threads = 0;static int xvidenc_bquant_ratio = 150;static int xvidenc_bquant_offset = 100;static int xvidenc_bframe_threshold = 0;static int xvidenc_min_quant[3] = {2, 2, 2};static int xvidenc_max_quant[3] = {31, 31, 31};static char *xvidenc_intra_matrix_file = NULL;static char *xvidenc_inter_matrix_file = NULL;static char *xvidenc_quant_method = NULL;static int xvidenc_cbr_reaction_delay_factor = 0;static int xvidenc_cbr_averaging_period = 0;static int xvidenc_cbr_buffer = 0;static int xvidenc_vbr_keyframe_boost = 0;static int xvidenc_vbr_overflow_control_strength = 5;static int xvidenc_vbr_curve_compression_high = 0;static int xvidenc_vbr_curve_compression_low = 0;static int xvidenc_vbr_max_overflow_improvement = 5;static int xvidenc_vbr_max_overflow_degradation = 5;static int xvidenc_vbr_kfreduction = 0;static int xvidenc_vbr_kfthreshold = 0;static int xvidenc_vbr_container_frame_overhead = 24; /* mencoder uses AVI container */// commandline profile option string - default to unrestrictedstatic char *xvidenc_profile = "unrestricted";static char *xvidenc_par = NULL;static int xvidenc_par_width = 0;static int xvidenc_par_height = 0;static float xvidenc_dar_aspect = 0.0f;static int xvidenc_autoaspect = 0;static char *xvidenc_zones = NULL; // zones stringm_option_t xvidencopts_conf[] ={ /* Standard things mencoder should be able to treat directly */ {"bitrate", &xvidenc_bitrate, CONF_TYPE_INT, 0, 0, 0, NULL}, {"pass", &xvidenc_pass, CONF_TYPE_INT, CONF_RANGE, 1, 2, NULL}, {"fixed_quant", &xvidenc_quantizer, CONF_TYPE_FLOAT, CONF_RANGE, 1, 31, NULL}, /* Features */ {"quant_type", &xvidenc_quant_method, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"me_quality", &xvidenc_motion, CONF_TYPE_INT, CONF_RANGE, 0, 6, NULL}, {"chroma_me", &xvidenc_chromame, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nochroma_me", &xvidenc_chromame, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"chroma_opt", &xvidenc_chroma_opt, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nochroma_opt", &xvidenc_chroma_opt, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"vhq", &xvidenc_vhq, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL}, {"bvhq", &xvidenc_bvhq, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL}, {"max_bframes", &xvidenc_max_bframes, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, {"threads", &xvidenc_num_threads, CONF_TYPE_INT, 0, 0, 0, NULL}, {"bquant_ratio", &xvidenc_bquant_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL}, {"bquant_offset", &xvidenc_bquant_offset, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL}, {"bf_threshold", &xvidenc_bframe_threshold, CONF_TYPE_INT, CONF_RANGE, -255, 255, NULL}, {"qpel", &xvidenc_quarterpel, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"noqpel", &xvidenc_quarterpel, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"gmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nogmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"trellis", &xvidenc_trellis, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"notrellis", &xvidenc_trellis, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"packed", &xvidenc_packed, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nopacked", &xvidenc_packed, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"closed_gop", &xvidenc_closed_gop, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"noclosed_gop", &xvidenc_closed_gop, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"interlacing", &xvidenc_interlaced, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nointerlacing", &xvidenc_interlaced, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"cartoon", &xvidenc_cartoon, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nocartoon", &xvidenc_cartoon, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"hq_ac", &xvidenc_hqacpred, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nohq_ac", &xvidenc_hqacpred, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"frame_drop_ratio", &xvidenc_frame_drop_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, {"greyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL}, /* kept for backward compatibility */ {"grayscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nogreyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"lumi_mask", &xvidenc_luminance_masking, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nolumi_mask", &xvidenc_luminance_masking, CONF_TYPE_FLAG, 0, 1, 0, NULL}, {"turbo", &xvidenc_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"debug", &xvidenc_debug, CONF_TYPE_INT , 0 ,0,-1,NULL}, {"stats", &xvidenc_stats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"psnr", &xvidenc_psnr , CONF_TYPE_FLAG, 0, 0, 1, NULL}, /* section [quantizer] */ {"min_iquant", &xvidenc_min_quant[0], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"max_iquant", &xvidenc_max_quant[0], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"min_pquant", &xvidenc_min_quant[1], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"max_pquant", &xvidenc_max_quant[1], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"min_bquant", &xvidenc_min_quant[2], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"max_bquant", &xvidenc_max_quant[2], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, {"quant_intra_matrix", &xvidenc_intra_matrix_file, CONF_TYPE_STRING, 0, 0, 100, NULL}, {"quant_inter_matrix", &xvidenc_inter_matrix_file, CONF_TYPE_STRING, 0, 0, 100, NULL}, /* section [cbr] */ {"rc_reaction_delay_factor", &xvidenc_cbr_reaction_delay_factor, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"rc_averaging_period", &xvidenc_cbr_averaging_period, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, {"rc_buffer", &xvidenc_cbr_buffer, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, /* section [vbr] */ {"keyframe_boost", &xvidenc_vbr_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"curve_compression_high", &xvidenc_vbr_curve_compression_high, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"curve_compression_low", &xvidenc_vbr_curve_compression_low, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"overflow_control_strength", &xvidenc_vbr_overflow_control_strength, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"max_overflow_improvement", &xvidenc_vbr_max_overflow_improvement, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"max_overflow_degradation", &xvidenc_vbr_max_overflow_degradation, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"kfreduction", &xvidenc_vbr_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, {"kfthreshold", &xvidenc_vbr_kfthreshold, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, {"container_frame_overhead", &xvidenc_vbr_container_frame_overhead, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, /* Section Aspect Ratio */ {"par", &xvidenc_par, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"par_width", &xvidenc_par_width, CONF_TYPE_INT, CONF_RANGE, 0, 255, NULL}, {"par_height", &xvidenc_par_height, CONF_TYPE_INT, CONF_RANGE, 0, 255, NULL}, {"aspect", &xvidenc_dar_aspect, CONF_TYPE_FLOAT, CONF_RANGE, 0.1, 9.99, NULL}, {"autoaspect", &xvidenc_autoaspect, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"noautoaspect", &xvidenc_autoaspect, CONF_TYPE_FLAG, 0, 1, 0, NULL}, /* Section Zones */ {"zones", &xvidenc_zones, CONF_TYPE_STRING, 0, 0, 0, NULL}, /* section profiles */ {"profile", &xvidenc_profile, CONF_TYPE_STRING, 0, 0, 0, NULL}, /* End of the config array */ {NULL, 0, 0, 0, 0, 0, NULL}};/***************************************************************************** * Module private data ****************************************************************************/typedef struct _xvid_mplayer_module_t{ /* Instance related global vars */ void *instance; xvid_gbl_init_t init; xvid_enc_create_t create; xvid_enc_frame_t frame; xvid_plugin_single_t onepass; xvid_plugin_2pass1_t pass1; xvid_plugin_2pass2_t pass2; /* This data must survive local block scope, so here it is */ xvid_enc_plugin_t plugins[7]; xvid_enc_zone_t zones[MAX_ZONES]; /* MPEG4 stream buffer */ muxer_stream_t *mux; /* Stats accumulators */ int frames; long long sse_y; long long sse_u; long long sse_v; /* Min & Max PSNR */ int min_sse_y; int min_sse_u; int min_sse_v; int min_framenum; int max_sse_y; int max_sse_u; int max_sse_v; int max_framenum; int pixels; /* DAR/PAR and all that thingies */ int d_width; int d_height; FILE *fvstats;} xvid_mplayer_module_t;static int dispatch_settings(xvid_mplayer_module_t *mod);static int set_create_struct(xvid_mplayer_module_t *mod);static int set_frame_struct(xvid_mplayer_module_t *mod, mp_image_t *mpi);static void update_stats(xvid_mplayer_module_t *mod, xvid_enc_stats_t *stats);static void print_stats(xvid_mplayer_module_t *mod);static void flush_internal_buffers(xvid_mplayer_module_t *mod);static const char *par_string(int parcode);static const char *errorstring(int err);/***************************************************************************** * Video Filter API function definitions ****************************************************************************//*============================================================================ * config *==========================================================================*/static intconfig(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?