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 + -
显示快捷键?