/*****************************************************************************
- * common.c: h264 library
+ * common.c: misc common functions
*****************************************************************************
- * Copyright (C) 2003-2008 x264 project
+ * Copyright (C) 2003-2010 x264 project
*
* Authors: Loren Merritt <lorenm@u.washington.edu>
* Laurent Aimar <fenrir@via.ecp.fr>
* 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.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at licensing@x264.com.
*****************************************************************************/
#include "common.h"
#include <malloc.h>
#endif
+const int x264_bit_depth = BIT_DEPTH;
+
static void x264_log_default( void *, int, const char *, va_list );
/****************************************************************************
param->rc.i_vbv_max_bitrate = 0;
param->rc.i_vbv_buffer_size = 0;
param->rc.f_vbv_buffer_init = 0.9;
- param->rc.i_qp_constant = 23;
+ param->rc.i_qp_constant = 23 + QP_BD_OFFSET;
param->rc.f_rf_constant = 23;
param->rc.i_qp_min = 10;
- param->rc.i_qp_max = 51;
+ param->rc.i_qp_max = QP_MAX;
param->rc.i_qp_step = 4;
param->rc.f_ip_factor = 1.4;
param->rc.f_pb_factor = 1.3;
param->b_annexb = 1;
param->b_aud = 0;
param->b_vfr_input = 1;
- param->b_dts_compress = 0;
param->i_nal_hrd = X264_NAL_HRD_NONE;
param->b_tff = 1;
param->b_pic_struct = 0;
static int x264_param_apply_preset( x264_param_t *param, const char *preset )
{
+ char *end;
+ int i = strtol( preset, &end, 10 );
+ if( *end == 0 && i >= 0 && i < sizeof(x264_preset_names)/sizeof(*x264_preset_names)-1 )
+ preset = x264_preset_names[i];
+
if( !strcasecmp( preset, "ultrafast" ) )
{
param->i_frame_reference = 1;
param->rc.b_mb_tree = 0;
param->analyse.i_weighted_pred = X264_WEIGHTP_NONE;
param->analyse.b_weighted_bipred = 0;
+ param->rc.i_lookahead = 0;
}
else if( !strcasecmp( preset, "superfast" ) )
{
param->analyse.i_trellis = 0;
param->rc.b_mb_tree = 0;
param->analyse.i_weighted_pred = X264_WEIGHTP_NONE;
+ param->rc.i_lookahead = 0;
}
else if( !strcasecmp( preset, "veryfast" ) )
{
param->i_frame_reference = 1;
param->analyse.b_mixed_references = 0;
param->analyse.i_trellis = 0;
- param->rc.b_mb_tree = 0;
param->analyse.i_weighted_pred = X264_WEIGHTP_NONE;
+ param->rc.i_lookahead = 10;
}
else if( !strcasecmp( preset, "faster" ) )
{
param->i_bframe = 0;
param->b_sliced_threads = 1;
param->b_vfr_input = 0;
+ param->rc.b_mb_tree = 0;
}
else if( !strncasecmp( s, "touhou", 6 ) )
{
if( !profile )
return 0;
+#if BIT_DEPTH > 8
+ if( !strcasecmp( profile, "baseline" ) || !strcasecmp( profile, "main" ) ||
+ !strcasecmp( profile, "high" ) )
+ {
+ x264_log( NULL, X264_LOG_ERROR, "%s profile doesn't support a bit depth of %d.\n", profile, BIT_DEPTH );
+ return -1;
+ }
+#endif
+
if( !strcasecmp( profile, "baseline" ) )
{
param->analyse.b_transform_8x8 = 0;
param->analyse.b_transform_8x8 = 0;
param->i_cqm_preset = X264_CQM_FLAT;
}
- else if( !strcasecmp( profile, "high" ) )
+ else if( !strcasecmp( profile, "high" ) || !strcasecmp( profile, "high10" ) )
{
/* Default */
}
x264_log( NULL, X264_LOG_ERROR, "invalid profile: %s\n", profile );
return -1;
}
- if( (param->rc.i_rc_method == X264_RC_CQP && param->rc.i_qp_constant == 0) ||
- (param->rc.i_rc_method == X264_RC_CRF && param->rc.f_rf_constant == 0) )
+ if( (param->rc.i_rc_method == X264_RC_CQP && param->rc.i_qp_constant <= 0) ||
+ (param->rc.i_rc_method == X264_RC_CRF && (int)(param->rc.f_rf_constant + QP_BD_OFFSET) <= 0) )
{
x264_log( NULL, X264_LOG_ERROR, "%s profile doesn't support lossless\n", profile );
return -1;
p->b_deterministic = atobool(value);
OPT2("level", "level-idc")
{
- if( atof(value) < 6 )
+ if( !strcmp(value, "1b") )
+ p->i_level_idc = 9;
+ else if( atof(value) < 6 )
p->i_level_idc = (int)(10*atof(value)+.5);
else
p->i_level_idc = atoi(value);
}
OPT2("ref", "frameref")
p->i_frame_reference = atoi(value);
+ OPT("dpb-size")
+ p->i_dpb_size = atoi(value);
OPT("keyint")
{
- p->i_keyint_max = atoi(value);
- if( p->i_keyint_min > p->i_keyint_max )
- p->i_keyint_min = p->i_keyint_max;
+ if( strstr( value, "infinite" ) )
+ p->i_keyint_max = X264_KEYINT_MAX_INFINITE;
+ else
+ p->i_keyint_max = atoi(value);
}
OPT2("min-keyint", "keyint-min")
{
{
memset( pic, 0, sizeof( x264_picture_t ) );
pic->i_type = X264_TYPE_AUTO;
- pic->i_qpplus1 = 0;
+ pic->i_qpplus1 = X264_QP_AUTO;
pic->i_pic_struct = PIC_STRUCT_AUTO;
}
****************************************************************************/
int x264_picture_alloc( x264_picture_t *pic, int i_csp, int i_width, int i_height )
{
+ int csp = i_csp & X264_CSP_MASK;
+ if( csp <= X264_CSP_NONE || csp >= X264_CSP_MAX )
+ return -1;
x264_picture_init( pic );
pic->img.i_csp = i_csp;
- pic->img.i_plane = 3;
- pic->img.plane[0] = x264_malloc( 3 * i_width * i_height / 2 );
+ pic->img.i_plane = csp == X264_CSP_NV12 ? 2 : 3;
+ int depth_factor = i_csp & X264_CSP_HIGH_DEPTH ? 2 : 1;
+ pic->img.plane[0] = x264_malloc( 3 * i_width * i_height / 2 * depth_factor );
if( !pic->img.plane[0] )
return -1;
- pic->img.plane[1] = pic->img.plane[0] + i_width * i_height;
- pic->img.plane[2] = pic->img.plane[1] + i_width * i_height / 4;
- pic->img.i_stride[0] = i_width;
- pic->img.i_stride[1] = i_width / 2;
- pic->img.i_stride[2] = i_width / 2;
+ pic->img.plane[1] = pic->img.plane[0] + i_width * i_height * depth_factor;
+ if( csp != X264_CSP_NV12 )
+ pic->img.plane[2] = pic->img.plane[1] + i_width * i_height / 4 * depth_factor;
+ pic->img.i_stride[0] = i_width * depth_factor;
+ if( csp == X264_CSP_NV12 )
+ pic->img.i_stride[1] = i_width * depth_factor;
+ else
+ {
+ pic->img.i_stride[1] = i_width / 2 * depth_factor;
+ pic->img.i_stride[2] = i_width / 2 * depth_factor;
+ }
return 0;
}
s += sprintf( s, "%dx%d ", p->i_width, p->i_height );
s += sprintf( s, "fps=%u/%u ", p->i_fps_num, p->i_fps_den );
s += sprintf( s, "timebase=%u/%u ", p->i_timebase_num, p->i_timebase_den );
+ s += sprintf( s, "bitdepth=%d", BIT_DEPTH );
}
s += sprintf( s, "cabac=%d", p->b_cabac );
}
s += sprintf( s, " weightp=%d", p->analyse.i_weighted_pred > 0 ? p->analyse.i_weighted_pred : 0 );
- s += sprintf( s, " keyint=%d keyint_min=%d scenecut=%d intra_refresh=%d",
- p->i_keyint_max, p->i_keyint_min, p->i_scenecut_threshold, p->b_intra_refresh );
+ if( p->i_keyint_max == X264_KEYINT_MAX_INFINITE )
+ s += sprintf( s, " keyint=infinite" );
+ else
+ s += sprintf( s, " keyint=%d", p->i_keyint_max );
+ s += sprintf( s, " keyint_min=%d scenecut=%d intra_refresh=%d",
+ p->i_keyint_min, p->i_scenecut_threshold, p->b_intra_refresh );
if( p->rc.b_mb_tree || p->rc.i_vbv_buffer_size )
s += sprintf( s, " rc_lookahead=%d", p->rc.i_lookahead );