/***************************************************************************** * x264: h264 encoder testing program. ***************************************************************************** * Copyright (C) 2003-2008 x264 project * * Authors: Loren Merritt * Laurent Aimar * * 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 02111, USA. *****************************************************************************/ #include #include #include #define _GNU_SOURCE #include #include "common/common.h" #include "common/cpu.h" #include "x264.h" #include "muxers.h" #ifndef _MSC_VER #include "config.h" #endif #ifdef _WIN32 #include #else #define SetConsoleTitle(t) #endif uint8_t *mux_buffer = NULL; int mux_buffer_size = 0; /* Ctrl-C handler */ static int b_ctrl_c = 0; static int b_exit_on_ctrl_c = 0; static void SigIntHandler( int a ) { if( b_exit_on_ctrl_c ) exit(0); b_ctrl_c = 1; } typedef struct { int b_progress; int i_seek; hnd_t hin; hnd_t hout; FILE *qpfile; } cli_opt_t; /* input file operation function pointers */ int (*p_open_infile)( char *psz_filename, hnd_t *p_handle, x264_param_t *p_param ); int (*p_get_frame_total)( hnd_t handle ); int (*p_read_frame)( x264_picture_t *p_pic, hnd_t handle, int i_frame ); int (*p_close_infile)( hnd_t handle ); /* output file operation function pointers */ static int (*p_open_outfile)( char *psz_filename, hnd_t *p_handle ); static int (*p_set_outfile_param)( hnd_t handle, x264_param_t *p_param ); static int (*p_write_nalu)( hnd_t handle, uint8_t *p_nal, int i_size ); static int (*p_set_eop)( hnd_t handle, x264_picture_t *p_picture ); static int (*p_close_outfile)( hnd_t handle ); static void Help( x264_param_t *defaults, int b_longhelp ); static int Parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt ); static int Encode( x264_param_t *param, cli_opt_t *opt ); /**************************************************************************** * main: ****************************************************************************/ int main( int argc, char **argv ) { x264_param_t param; cli_opt_t opt; int ret; #ifdef PTW32_STATIC_LIB pthread_win32_process_attach_np(); pthread_win32_thread_attach_np(); #endif #ifdef _WIN32 _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); #endif x264_param_default( ¶m ); /* Parse command line */ if( Parse( argc, argv, ¶m, &opt ) < 0 ) return -1; /* Control-C handler */ signal( SIGINT, SigIntHandler ); ret = Encode( ¶m, &opt ); #ifdef PTW32_STATIC_LIB pthread_win32_thread_detach_np(); pthread_win32_process_detach_np(); #endif return ret; } static char const *strtable_lookup( const char * const table[], int index ) { int i = 0; while( table[i] ) i++; return ( ( index >= 0 && index < i ) ? table[ index ] : "???" ); } /***************************************************************************** * Help: *****************************************************************************/ static void Help( x264_param_t *defaults, int b_longhelp ) { #define H0 printf #define H1 if(b_longhelp) printf H0( "x264 core:%d%s\n" "Syntax: x264 [options] -o outfile infile [widthxheight]\n" "\n" "Infile can be raw YUV 4:2:0 (in which case resolution is required),\n" " or YUV4MPEG 4:2:0 (*.y4m),\n" " or AVI or Avisynth if compiled with AVIS support (%s).\n" "Outfile type is selected by filename:\n" " .264 -> Raw bytestream\n" " .mkv -> Matroska\n" " .mp4 -> MP4 if compiled with GPAC support (%s)\n" "\n" "Options:\n" "\n" " -h, --help List the more commonly used options\n" " --longhelp List all options\n" "\n", X264_BUILD, X264_VERSION, #ifdef AVIS_INPUT "yes", #else "no", #endif #ifdef MP4_OUTPUT "yes" #else "no" #endif ); H0( "Frame-type options:\n" ); H0( "\n" ); H0( " -I, --keyint Maximum GOP size [%d]\n", defaults->i_keyint_max ); H1( " -i, --min-keyint Minimum GOP size [%d]\n", defaults->i_keyint_min ); H1( " --no-scenecut Disable adaptive I-frame decision\n" ); H1( " --scenecut How aggressively to insert extra I-frames [%d]\n", defaults->i_scenecut_threshold ); H0( " -b, --bframes Number of B-frames between I and P [%d]\n", defaults->i_bframe ); H1( " --b-adapt Adaptive B-frame decision method [%d]\n" " Higher values may lower threading efficiency.\n" " - 0: Disabled\n" " - 1: Fast\n" " - 2: Optimal (slow with high --bframes)\n", defaults->i_bframe_adaptive ); H1( " --b-bias Influences how often B-frames are used [%d]\n", defaults->i_bframe_bias ); H0( " --b-pyramid Keep some B-frames as references\n" ); H0( " --no-cabac Disable CABAC\n" ); H0( " -r, --ref Number of reference frames [%d]\n", defaults->i_frame_reference ); H1( " --no-deblock Disable loop filter\n" ); H0( " -f, --deblock Loop filter AlphaC0 and Beta parameters [%d:%d]\n", defaults->i_deblocking_filter_alphac0, defaults->i_deblocking_filter_beta ); H0( " --interlaced Enable pure-interlaced mode\n" ); H0( "\n" ); H0( "Ratecontrol:\n" ); H0( "\n" ); H0( " -q, --qp Set QP (0=lossless) [%d]\n", defaults->rc.i_qp_constant ); H0( " -B, --bitrate Set bitrate (kbit/s)\n" ); H0( " --crf Quality-based VBR (nominal QP)\n" ); H1( " --vbv-maxrate Max local bitrate (kbit/s) [%d]\n", defaults->rc.i_vbv_max_bitrate ); H0( " --vbv-bufsize Enable CBR and set size of the VBV buffer (kbit) [%d]\n", defaults->rc.i_vbv_buffer_size ); H1( " --vbv-init Initial VBV buffer occupancy [%.1f]\n", defaults->rc.f_vbv_buffer_init ); H1( " --qpmin Set min QP [%d]\n", defaults->rc.i_qp_min ); H1( " --qpmax Set max QP [%d]\n", defaults->rc.i_qp_max ); H1( " --qpstep Set max QP step [%d]\n", defaults->rc.i_qp_step ); H0( " --ratetol Allowed variance of average bitrate [%.1f]\n", defaults->rc.f_rate_tolerance ); H0( " --ipratio QP factor between I and P [%.2f]\n", defaults->rc.f_ip_factor ); H0( " --pbratio QP factor between P and B [%.2f]\n", defaults->rc.f_pb_factor ); H1( " --chroma-qp-offset QP difference between chroma and luma [%d]\n", defaults->analyse.i_chroma_qp_offset ); H1( " --aq-mode AQ method [%d]\n" " - 0: Disabled\n" " - 1: Variance AQ (complexity mask)\n", defaults->rc.i_aq_mode ); H0( " --aq-strength Reduces blocking and blurring in flat and\n" " textured areas. [%.1f]\n" " - 0.5: weak AQ\n" " - 1.5: strong AQ\n", defaults->rc.f_aq_strength ); H0( "\n" ); H0( " -p, --pass <1|2|3> Enable multipass ratecontrol\n" " - 1: First pass, creates stats file\n" " - 2: Last pass, does not overwrite stats file\n" " - 3: Nth pass, overwrites stats file\n" ); H0( " --stats Filename for 2 pass stats [\"%s\"]\n", defaults->rc.psz_stat_out ); H0( " --qcomp QP curve compression: 0.0 => CBR, 1.0 => CQP [%.2f]\n", defaults->rc.f_qcompress ); H1( " --cplxblur Reduce fluctuations in QP (before curve compression) [%.1f]\n", defaults->rc.f_complexity_blur ); H1( " --qblur Reduce fluctuations in QP (after curve compression) [%.1f]\n", defaults->rc.f_qblur ); H0( " --zones //... Tweak the bitrate of some regions of the video\n" ); H1( " Each zone is of the form\n" " ,,