X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fencx264.c;h=bd41839a127fa213ae86a64555bacd2a6cba5568;hb=033e32de9c380f54c7d1362a3979da205ebc3a29;hp=a68bbd4a6eb31680a64f815b42eeea0a70cf96a5;hpb=4126066b3dbc362c60bc42364f82ae49d30b1938;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/encx264.c b/libhb/encx264.c index a68bbd4a..bd41839a 100644 --- a/libhb/encx264.c +++ b/libhb/encx264.c @@ -75,7 +75,6 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) x264_param_t param; x264_nal_t * nal; int nal_count; - int nal_size; hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) ); w->private_data = pv; @@ -87,7 +86,7 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) x264_param_default( ¶m ); - /* Temporarily default mbtree to off for baseline, + /* Default weightp to off for baseline, overridable through x264 option strings. */ if( job->x264opts != NULL && *job->x264opts != '\0' ) { @@ -99,7 +98,6 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) { char *name = x264opts; char *value; - int ret; x264opts += strcspn( x264opts, ":" ); if( *x264opts ) @@ -126,7 +124,7 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) { if( atoi( value ) == 0 ) { - param.rc.b_mb_tree = 0; + param.analyse.i_weighted_pred = X264_WEIGHTP_NONE; } } } @@ -142,6 +140,9 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) param.i_fps_num = job->vrate; param.i_fps_den = job->vrate_base; + /* Disable annexb. Inserts size into nal header instead of start code */ + param.b_annexb = 0; + /* Set min:max key intervals ratio to 1:10 of fps. * This section is skipped if fps=25 (default). */ @@ -254,6 +255,14 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) { job->areBframes = 2; } + if( value == NULL || !strcmp( value, "1" ) ) + { + value = "normal"; + } + else if( !strcmp( value, "0" ) ) + { + value = "none"; + } } /* Here's where the strings are passed to libx264 for parsing. */ @@ -311,47 +320,19 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) if( job->vquality > 0.0 && job->vquality < 1.0 ) { - switch( job->crf ) - { - case 1: - /*Constant RF*/ - param.rc.i_rc_method = X264_RC_CRF; - param.rc.f_rf_constant = 51 - job->vquality * 51; - hb_log( "encx264: Encoding at constant RF %f", - param.rc.f_rf_constant ); - break; - - case 0: - /*Constant QP*/ - param.rc.i_rc_method = X264_RC_CQP; - param.rc.i_qp_constant = 51 - job->vquality * 51; - hb_log( "encx264: encoding at constant QP %d", - param.rc.i_qp_constant ); - break; - } + /*Constant RF*/ + param.rc.i_rc_method = X264_RC_CRF; + param.rc.f_rf_constant = 51 - job->vquality * 51; + hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant ); } else if( job->vquality == 0 || job->vquality >= 1.0 ) { /* Use the vquality as a raw RF or QP instead of treating it like a percentage. */ - switch( job->crf ) - { - case 1: - /*Constant RF*/ - param.rc.i_rc_method = X264_RC_CRF; - param.rc.f_rf_constant = job->vquality; - hb_log( "encx264: Encoding at constant RF %f", - param.rc.f_rf_constant ); - break; - - case 0: - /*Constant QP*/ - param.rc.i_rc_method = X264_RC_CQP; - param.rc.i_qp_constant = job->vquality; - hb_log( "encx264: encoding at constant QP %d", - param.rc.i_qp_constant ); - break; - } + /*Constant RF*/ + param.rc.i_rc_method = X264_RC_CRF; + param.rc.f_rf_constant = job->vquality; + hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant ); } else { @@ -377,12 +358,12 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job ) x264_encoder_headers( pv->x264, &nal, &nal_count ); /* Sequence Parameter Set */ - x264_nal_encode( w->config->h264.sps, &nal_size, 0, &nal[1] ); - w->config->h264.sps_length = nal_size; + memcpy(w->config->h264.sps, nal[1].p_payload + 4, nal[1].i_payload - 4); + w->config->h264.sps_length = nal[1].i_payload - 4; /* Picture Parameter Set */ - x264_nal_encode( w->config->h264.pps, &nal_size, 0, &nal[2] ); - w->config->h264.pps_length = nal_size; + memcpy(w->config->h264.pps, nal[2].p_payload + 4, nal[2].i_payload - 4); + w->config->h264.pps_length = nal[2].i_payload - 4; x264_picture_alloc( &pv->pic_in, X264_CSP_I420, job->width, job->height ); @@ -494,8 +475,8 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out, int i; for( i = 0; i < i_nal; i++ ) { - int data = buf->alloc - buf->size; - int size = x264_nal_encode( buf->data + buf->size, &data, 1, &nal[i] ); + int size = nal[i].i_payload; + memcpy(buf->data + buf->size, nal[i].p_payload, size); if( size < 1 ) { continue; @@ -528,12 +509,6 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out, break; } - /* H.264 in mp4 (stolen from mp4creator) */ - buf->data[buf->size+0] = ( ( size - 4 ) >> 24 ) & 0xFF; - buf->data[buf->size+1] = ( ( size - 4 ) >> 16 ) & 0xFF; - buf->data[buf->size+2] = ( ( size - 4 ) >> 8 ) & 0xFF; - buf->data[buf->size+3] = ( ( size - 4 ) >> 0 ) & 0xFF; - /* Decide what type of frame we have. */ switch( pic_out->i_type ) {