📄 x264.c
字号:
/***************************************************************************** * x264.c: h264 video encoder ***************************************************************************** * Copyright (C) 2004-2006 the VideoLAN team * $Id: x264.c 17327 2006-10-28 18:06:45Z Trax $ * * Authors: Laurent Aimar <fenrir@via.ecp.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. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <vlc/vlc.h>#include <vlc/vout.h>#include <vlc/sout.h>#include <vlc/decoder.h>#include <x264.h>#define SOUT_CFG_PREFIX "sout-x264-"/***************************************************************************** * Module descriptor *****************************************************************************/static int Open ( vlc_object_t * );static void Close( vlc_object_t * );/* Frame-type options */#define KEYINT_TEXT N_("Maximum GOP size")#define KEYINT_LONGTEXT N_( "Sets maximum interval between IDR-frames." \ "Larger values save bits, thus improving quality for a given bitrate at " \ "the cost of seeking precision." )#define MIN_KEYINT_TEXT N_("Minimum GOP size")#define MIN_KEYINT_LONGTEXT N_( "Sets minimum interval between IDR-frames. " \ "In H.264, I-frames do not necessarily bound a closed GOP because it is " \ "allowable for a P-frame to be predicted from more frames than just the " \ "one frame before it (also see reference frame option). Therefore, " \ "I-frames are not necessarily seekable. IDR-frames restrict subsequent " \ "P-frames from referring to any frame prior to the IDR-frame. \n" \ "If scenecuts appear within this interval, they are still encoded as " \ "I-frames, but do not start a new GOP." )#define SCENE_TEXT N_("Extra I-frames aggressivity" )#define SCENE_LONGTEXT N_( "Scene-cut detection. Controls how " \ "aggressively to insert extra I-frames. With small values of " \ "scenecut, the codec often has " \ "to force an I-frame when it would exceed keyint. " \ "Good values of scenecut may find a better location for the " \ "I-frame. Large values use more I-frames " \ "than necessary, thus wasting bits. -1 disables scene-cut detection, so " \ "I-frames are inserted only every other keyint frames, which probably " \ "leads to ugly encoding artifacts. Range 1 to 100." )#define BFRAMES_TEXT N_("B-frames between I and P")#define BFRAMES_LONGTEXT N_( "Number of consecutive B-frames between I and " \ "P-frames. Range 1 to 16." )#define B_ADAPT_TEXT N_("Adaptive B-frame decision")#define B_ADAPT_LONGTEXT N_( "Force the specified number of " \ "consecutive B-frames to be used, except possibly before an I-frame." )#define B_BIAS_TEXT N_("Influence (bias) B-frames usage")#define B_BIAS_LONGTEXT N_( "Bias the choice to use B-frames. Positive values " \ "cause more B-frames, negative values cause less B-frames." )#define BPYRAMID_TEXT N_("Keep some B-frames as references")#define BPYRAMID_LONGTEXT N_( "Allows B-frames to be used as references for " \ "predicting other frames. Keeps the middle of 2+ consecutive B-frames " \ "as a reference, and reorders frame appropriately." )#define CABAC_TEXT N_("CABAC")#define CABAC_LONGTEXT N_( "CABAC (Context-Adaptive Binary Arithmetic "\ "Coding). Slightly slows down encoding and decoding, but should save " \ "10 to 15% bitrate." )#define REF_TEXT N_("Number of reference frames")#define REF_LONGTEXT N_( "Number of previous frames used as predictors. " \ "This is effective in Anime, but seems to make little difference in " \ "live-action source material. Some decoders are unable to deal with " \ "large frameref values. Range 1 to 16." )#define NF_TEXT N_("Skip loop filter")#define NF_LONGTEXT N_( "Deactivate the deblocking loop filter (decreases quality).")#define FILTER_TEXT N_("Loop filter AlphaC0 and Beta parameters alpha:beta")#define FILTER_LONGTEXT N_( "Loop filter AlphaC0 and Beta parameters. " \ "Range -6 to 6 for both alpha and beta parameters. -6 means light " \ "filter, 6 means strong.") #define LEVEL_TEXT N_("H.264 level")#define LEVEL_LONGTEXT N_( "Specify H.264 level (as defined by Annex A " \ "of the standard). Levels are not enforced; it's up to the user to select " \ "a level compatible with the rest of the encoding options. Range 1 to 5.1 " \ "(10 to 51 is also allowed).")/* In order to play an interlaced output stream encoded by x264, a decoder needs mbaff support. r570 is using the 'mb' part and not 'aff' yet; so it's really 'pure-interlaced' mode */#if X264_BUILD >= 51 /* r570 */#define INTERLACED_TEXT N_("Interlaced mode")#define INTERLACED_LONGTEXT N_( "Pure-interlaced mode.")#endif/* Ratecontrol */#define QP_TEXT N_("Set QP")#define QP_LONGTEXT N_( "This selects the quantizer to use. " \ "Lower values result in better fidelity, but higher bitrates. 26 is a " \ "good default value. Range 0 (lossless) to 51." )#define CRF_TEXT N_("Quality-based VBR")#define CRF_LONGTEXT N_( "1-pass Quality-based VBR. Range 0 to 51." )#define QPMIN_TEXT N_("Min QP")#define QPMIN_LONGTEXT N_( "Minimum quantizer parameter. 15 to 35 seems to " \ "be a useful range." )#define QPMAX_TEXT N_("Max QP")#define QPMAX_LONGTEXT N_( "Maximum quantizer parameter." )#define QPSTEP_TEXT N_("Max QP step")#define QPSTEP_LONGTEXT N_( "Max QP step between frames.")#define RATETOL_TEXT N_("Average bitrate tolerance")#define RATETOL_LONGTEXT N_( "Allowed variance in average " \ "bitrate (in kbits/s).")#define VBV_MAXRATE_TEXT N_("Max local bitrate")#define VBV_MAXRATE_LONGTEXT N_( "Sets a maximum local bitrate (in kbits/s).")#define VBV_BUFSIZE_TEXT N_("VBV buffer")#define VBV_BUFSIZE_LONGTEXT N_( "Averaging period for the maximum " \ "local bitrate (in kbits).")#define VBV_INIT_TEXT N_("Initial VBV buffer occupancy")#define VBV_INIT_LONGTEXT N_( "Sets the initial buffer occupancy as a " \ "fraction of the buffer size. Range 0.0 to 1.0.")/* IP Ratio < 1 is technically valid but should never improve quality */#define IPRATIO_TEXT N_("QP factor between I and P")#define IPRATIO_LONGTEXT N_( "QP factor between I and P. Range 1.0 to 2.0.")/* PB ratio < 1 is not valid and breaks ratecontrol */#define PBRATIO_TEXT N_("QP factor between P and B")#define PBRATIO_LONGTEXT N_( "QP factor between P and B. Range 1.0 to 2.0.")#define CHROMA_QP_OFFSET_TEXT N_("QP difference between chroma and luma")#define CHROMA_QP_OFFSET_LONGTEXT N_( "QP difference between chroma and luma.")#define QCOMP_TEXT N_("QP curve compression")#define QCOMP_LONGTEXT N_( "QP curve compression. Range 0.0 (CBR) to 1.0 (QCP).")#define CPLXBLUR_TEXT N_("Reduce fluctuations in QP")#define CPLXBLUR_LONGTEXT N_( "This reduces the fluctuations in QP " \ "before curve compression. Temporally blurs complexity.")#define QBLUR_TEXT N_("Reduce fluctuations in QP")#define QBLUR_LONGTEXT N_( "This reduces the fluctations in QP " \ "after curve compression. Temporally blurs quants.")/* Analysis */#define ANALYSE_TEXT N_("Partitions to consider")#define ANALYSE_LONGTEXT N_( "Partitions to consider in analyse mode: \n" \ " - none : \n" \ " - fast : i4x4\n" \ " - normal: i4x4,p8x8,(i8x8)\n" \ " - slow : i4x4,p8x8,(i8x8),b8x8\n" \ " - all : i4x4,p8x8,(i8x8),b8x8,p4x4\n" \ "(p4x4 requires p8x8. i8x8 requires 8x8dct).")#define DIRECT_PRED_TEXT N_("Direct MV prediction mode")#define DIRECT_PRED_LONGTEXT N_( "Direct MV prediction mode.")#if X264_BUILD >= 52 /* r573 */#define DIRECT_PRED_SIZE_TEXT N_("Direct prediction size")#define DIRECT_PRED_SIZE_LONGTEXT N_( "Direct prediction size: "\ " - 0: 4x4\n" \ " - 1: 8x8\n" \ " - -1: smallest possible according to level\n" )#endif#define WEIGHTB_TEXT N_("Weighted prediction for B-frames")#define WEIGHTB_LONGTEXT N_( "Weighted prediction for B-frames.")#define ME_TEXT N_("Integer pixel motion estimation method")#define ME_LONGTEXT N_( "Selects the motion estimation algorithm: "\ " - dia: diamond search, radius 1 (fast)\n" \ " - hex: hexagonal search, radius 2\n" \ " - umh: uneven multi-hexagon search (better but slower)\n" \ " - esa: exhaustive search (extremely slow, primarily for testing)\n" )#define MERANGE_TEXT N_("Maximum motion vector search range")#define MERANGE_LONGTEXT N_( "Maximum distance to search for " \ "motion estimation, measured from predicted position(s). " \ "Default of 16 is good for most footage, high motion sequences may " \ "benefit from settings between 24 and 32. Range 0 to 64." )#define SUBME_TEXT N_("Subpixel motion estimation and partition decision " \ "quality")#if X264_BUILD >= 46 /* r477 */#define SUBME_MAX 7#define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " \ "tradeoffs involved in the motion estimation decision process " \ "(lower = quicker and higher = better quality). Range 1 to 7." )#elif X264_BUILD >= 30 /* r262 */#define SUBME_MAX 6#define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " \ "tradeoffs involved in the motion estimation decision process " \ "(lower = quicker and higher = better quality). Range 1 to 6." )#else#define SUBME_MAX 5#define SUBME_LONGTEXT N_( "This parameter controls quality versus speed " \ "tradeoffs involved in the motion estimation decision process " \ "(lower = quicker and higher = better quality). Range 1 to 5." )#endif#define B_RDO_TEXT N_("RD based mode decision for B-frames")#define B_RDO_LONGTEXT N_( "RD based mode decision for B-frames. This " \ "requires subme 6 (or higher).")#define MIXED_REFS_TEXT N_("Decide references on a per partition basis")#define MIXED_REFS_LONGTEXT N_( "Allows each 8x8 or 16x8 partition to " \ "independently select a reference frame, as opposed to only one ref " \ "per macroblock." )#define CHROMA_ME_TEXT N_("Chroma in motion estimation")#define CHROMA_ME_LONGTEXT N_( "Chroma ME for subpel and mode decision in " \ "P-frames.")#define BIME_TEXT N_("Jointly optimize both MVs in B-frames")#define BIME_LONGTEXT N_( "Joint bidirectional motion refinement.")#define TRANSFORM_8X8DCT_TEXT N_("Adaptive spatial transform size")#define TRANSFORM_8X8DCT_LONGTEXT N_( \ "SATD-based decision for 8x8 transform in inter-MBs.")#define TRELLIS_TEXT N_("Trellis RD quantization" )#define TRELLIS_LONGTEXT N_( "Trellis RD quantization: \n" \ " - 0: disabled\n" \ " - 1: enabled only on the final encode of a MB\n" \ " - 2: enabled on all mode decisions\n" \ "This requires CABAC." )#define FAST_PSKIP_TEXT N_("Early SKIP detection on P-frames")#define FAST_PSKIP_LONGTEXT N_( "Early SKIP detection on P-frames.")#define DCT_DECIMATE_TEXT N_("Coefficient thresholding on P-frames")#define DCT_DECIMATE_LONGTEXT N_( "Coefficient thresholding on P-frames." \ "Eliminate dct blocks containing only a small single coefficient.")/* Noise reduction 1 is too weak to measure, suggest at least 10 */#define NR_TEXT N_("Noise reduction")#define NR_LONGTEXT N_( "Dct-domain noise reduction. Adaptive pseudo-deadzone. " \ "10 to 1000 seems to be a useful range." )#if X264_BUILD >= 52 /* r573 */#define DEADZONE_INTER_TEXT N_("Inter luma quantization deadzone")#define DEADZONE_INTER_LONGTEXT N_( "Set the size of the inter luma quantization deadzone. " \ "Range 0 to 32." )#define DEADZONE_INTRA_TEXT N_("Intra luma quantization deadzone")#define DEADZONE_INTRA_LONGTEXT N_( "Set the size of the intra luma quantization deadzone. " \ "Range 0 to 32." )#endif/* Input/Output */#define ASM_TEXT N_("CPU optimizations")#define ASM_LONGTEXT N_( "Use assembler CPU optimizations.")#define PSNR_TEXT N_("PSNR computation")#define PSNR_LONGTEXT N_( "Compute and print PSNR stats. This has no effect on " \ "the actual encoding quality." )#define SSIM_TEXT N_("SSIM computation")#define SSIM_LONGTEXT N_( "Compute and print SSIM stats. This has no effect on " \ "the actual encoding quality." )#define QUIET_TEXT N_("Quiet mode")#define QUIET_LONGTEXT N_( "Quiet mode.")#define VERBOSE_TEXT N_("Statistics")#define VERBOSE_LONGTEXT N_( "Print stats for each frame.")#if X264_BUILD >= 47 /* r518 */#define SPS_ID_TEXT N_("SPS and PPS id numbers")#define SPS_ID_LONGTEXT N_( "Set SPS and PPS id numbers to allow concatenating " \ "streams with different settings.")#endif#define AUD_TEXT N_("Access unit delimiters")#define AUD_LONGTEXT N_( "Generate access unit delimiter NAL units.")#if X264_BUILD >= 24static char *enc_me_list[] = { "dia", "hex", "umh", "esa" };static char *enc_me_list_text[] = { N_("dia"), N_("hex"), N_("umh"), N_("esa") };#endifstatic char *enc_analyse_list[] = { "none", "fast", "normal", "slow", "all" };static char *enc_analyse_list_text[] = { N_("none"), N_("fast"), N_("normal"), N_("slow"), N_("all") };#if X264_BUILD >= 45 /* r457 */static char *direct_pred_list[] = { "none", "spatial", "temporal", "auto" };static char *direct_pred_list_text[] = { N_("none"), N_("spatial"), N_("temporal"), N_("auto") };#elsestatic char *direct_pred_list[] = { "none", "spatial", "temporal" };static char *direct_pred_list_text[] = { N_("none"), N_("spatial"), N_("temporal") };#endifvlc_module_begin(); set_description( _("H.264/MPEG4 AVC encoder (using x264 library)")); set_capability( "encoder", 200 ); set_callbacks( Open, Close ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_VCODEC );/* Frame-type options */ add_integer( SOUT_CFG_PREFIX "keyint", 250, NULL, KEYINT_TEXT, KEYINT_LONGTEXT, VLC_FALSE ); add_integer( SOUT_CFG_PREFIX "min-keyint", 25, NULL, MIN_KEYINT_TEXT, MIN_KEYINT_LONGTEXT, VLC_FALSE ); add_deprecated( SOUT_CFG_PREFIX "keyint-min", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_integer( SOUT_CFG_PREFIX "scenecut", 40, NULL, SCENE_TEXT, SCENE_LONGTEXT, VLC_FALSE ); change_integer_range( -1, 100 ); add_integer( SOUT_CFG_PREFIX "bframes", 0, NULL, BFRAMES_TEXT, BFRAMES_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 16 );#if X264_BUILD >= 0x0013 /* r137 */ add_bool( SOUT_CFG_PREFIX "b-adapt", 1, NULL, B_ADAPT_TEXT, B_ADAPT_LONGTEXT, VLC_FALSE ); add_integer( SOUT_CFG_PREFIX "b-bias", 0, NULL, B_BIAS_TEXT, B_BIAS_LONGTEXT, VLC_FALSE ); change_integer_range( -100, 100 );#endif add_bool( SOUT_CFG_PREFIX "bpyramid", 0, NULL, BPYRAMID_TEXT, BPYRAMID_LONGTEXT, VLC_FALSE ); add_bool( SOUT_CFG_PREFIX "cabac", 1, NULL, CABAC_TEXT, CABAC_LONGTEXT, VLC_FALSE ); add_integer( SOUT_CFG_PREFIX "ref", 1, NULL, REF_TEXT, REF_LONGTEXT, VLC_FALSE ); change_integer_range( 1, 16 ); add_deprecated( SOUT_CFG_PREFIX "frameref", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_bool( SOUT_CFG_PREFIX "nf", 0, NULL, NF_TEXT, NF_LONGTEXT, VLC_FALSE ); add_deprecated( SOUT_CFG_PREFIX "loopfilter", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_string( SOUT_CFG_PREFIX "deblock", "0:0", NULL, FILTER_TEXT, FILTER_LONGTEXT, VLC_FALSE ); add_deprecated( SOUT_CFG_PREFIX "filter", VLC_FALSE ); /* Deprecated since 0.8.6 */ add_string( SOUT_CFG_PREFIX "level", "5.1", NULL, LEVEL_TEXT, LEVEL_LONGTEXT, VLC_FALSE );#if X264_BUILD >= 51 /* r570 */ add_bool( SOUT_CFG_PREFIX "interlaced", 0, NULL, INTERLACED_TEXT, INTERLACED_LONGTEXT, VLC_FALSE );#endif/* Ratecontrol */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -