1 /* $Id: encx264.c,v 1.21 2005/11/04 13:09:41 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.fr/>.
5 It may be used under the terms of the GNU General Public License. */
13 int encx264Init( hb_work_object_t *, hb_job_t * );
14 int encx264Work( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
15 void encx264Close( hb_work_object_t * );
17 hb_work_object_t hb_encx264 =
20 "H.264/AVC encoder (libx264)",
26 #define DTS_BUFFER_SIZE 32
29 * The frame info struct remembers information about each frame across calls
30 * to x264_encoder_encode. Since frames are uniquely identified by their
31 * timestamp, we use some bits of the timestamp as an index. The LSB is
32 * chosen so that two successive frames will have different values in the
33 * bits over any plausible range of frame rates. (Starting with bit 8 allows
34 * any frame rate slower than 352fps.) The MSB determines the size of the array.
35 * It is chosen so that two frames can't use the same slot during the
36 * encoder's max frame delay (set by the standard as 16 frames) and so
37 * that, up to some minimum frame rate, frames are guaranteed to map to
38 * different slots. (An MSB of 17 which is 2^(17-8+1) = 1024 slots guarantees
39 * no collisions down to a rate of .7 fps).
41 #define FRAME_INFO_MAX2 (8) // 2^8 = 256; 90000/256 = 352 frames/sec
42 #define FRAME_INFO_MIN2 (17) // 2^17 = 128K; 90000/131072 = 1.4 frames/sec
43 #define FRAME_INFO_SIZE (1 << (FRAME_INFO_MIN2 - FRAME_INFO_MAX2 + 1))
44 #define FRAME_INFO_MASK (FRAME_INFO_SIZE - 1)
46 struct hb_work_private_s
50 x264_picture_t pic_in;
51 uint8_t *x264_allocated_pic;
55 uint32_t frames_split; // number of frames we had to split
56 int chap_mark; // saved chap mark when we're propagating it
57 int64_t last_stop; // Debugging - stop time of previous input frame
62 } frame_info[FRAME_INFO_SIZE];
67 /***********************************************************************
68 * hb_work_encx264_init
69 ***********************************************************************
71 **********************************************************************/
72 int encx264Init( hb_work_object_t * w, hb_job_t * job )
78 hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
83 memset( pv->filename, 0, 1024 );
84 hb_get_tempory_filename( job->h, pv->filename, "x264.log" );
86 x264_param_default( ¶m );
89 param.analyse.b_psnr = 1;
90 param.analyse.b_ssim = 1;
92 param.i_threads = ( hb_get_cpu_count() * 3 / 2 );
93 param.i_width = job->width;
94 param.i_height = job->height;
95 param.i_fps_num = job->vrate;
96 param.i_fps_den = job->vrate_base;
99 param.i_timebase_num = 0;
100 param.i_timebase_den = 0;
101 param.b_vfr_input = 0;
105 param.i_timebase_num = 1;
106 param.i_timebase_den = 90000;
109 /* Disable annexb. Inserts size into nal header instead of start code */
112 /* Set min:max key intervals ratio to 1:10 of fps.
113 * This section is skipped if fps=25 (default).
115 if (job->vrate_base != 1080000)
117 if (job->pass == 2 && !job->cfr )
119 /* Even though the framerate might be different due to VFR,
120 we still want the same keyframe intervals as the 1st pass,
121 so the 1st pass stats won't conflict on frame decisions. */
122 hb_interjob_t * interjob = hb_interjob_get( job->h );
123 param.i_keyint_max = 10 * (int)( (double)interjob->vrate / (double)interjob->vrate_base + 0.5 );
127 /* adjust +0.5 for when fps has remainder to bump
128 { 23.976, 29.976, 59.94 } to { 24, 30, 60 } */
129 param.i_keyint_max = 10 * (int)( (double)job->vrate / (double)job->vrate_base + 0.5 );
133 param.i_log_level = X264_LOG_INFO;
136 This section passes the string x264opts to libx264 for parsing into
137 parameter names and values.
139 The string is set up like this:
140 option1=value1:option2=value 2
142 So, you have to iterate through based on the colons, and then put
143 the left side of the equals sign in "name" and the right side into
144 "value." Then you hand those strings off to x264 for interpretation.
146 This is all based on the universal x264 option handling Loren
147 Merritt implemented in the Mplayer/Mencoder project.
150 if( job->x264opts != NULL && *job->x264opts != '\0' )
152 char *x264opts, *x264opts_start;
154 x264opts = x264opts_start = strdup(job->x264opts);
156 while( x264opts_start && *x264opts )
158 char *name = x264opts;
162 x264opts += strcspn( x264opts, ":" );
169 value = strchr( name, '=' );
176 /* Here's where the strings are passed to libx264 for parsing. */
177 ret = x264_param_parse( ¶m, name, value );
179 /* Let x264 sanity check the options for us*/
180 if( ret == X264_PARAM_BAD_NAME )
181 hb_log( "x264 options: Unknown suboption %s", name );
182 if( ret == X264_PARAM_BAD_VALUE )
183 hb_log( "x264 options: Bad argument %s=%s", name, value ? value : "(null)" );
185 free(x264opts_start);
188 /* B-frames are on by default.*/
191 if( param.i_bframe && param.i_bframe_pyramid )
193 /* Note b-pyramid here, so the initial delay can be doubled */
196 else if( !param.i_bframe )
199 When B-frames are enabled, the max frame count increments
200 by 1 (regardless of the number of B-frames). If you don't
201 change the duration of the video track when you mux, libmp4
202 barfs. So, check if the x264opts aren't using B-frames, and
203 when they aren't, set the boolean job->areBframes as false.
208 if( param.i_keyint_min != X264_KEYINT_MIN_AUTO || param.i_keyint_max != 250 )
212 if ( param.i_fps_num / param.i_fps_den < param.i_keyint_max / 10 )
213 min_auto = param.i_fps_num / param.i_fps_den;
215 min_auto = param.i_keyint_max / 10;
217 char min[40], max[40];
218 param.i_keyint_min == X264_KEYINT_MIN_AUTO ?
219 snprintf( min, 40, "auto (%d)", min_auto ) :
220 snprintf( min, 40, "%d", param.i_keyint_min );
222 param.i_keyint_max == X264_KEYINT_MAX_INFINITE ?
223 snprintf( max, 40, "infinite" ) :
224 snprintf( max, 40, "%d", param.i_keyint_max );
226 hb_log( "encx264: min-keyint: %s, keyint: %s", min, max );
229 /* set up the VUI color model & gamma to match what the COLR atom
230 * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
231 if( job->color_matrix == 1 )
233 // ITU BT.601 DVD or SD TV content
234 param.vui.i_colorprim = 6;
235 param.vui.i_transfer = 1;
236 param.vui.i_colmatrix = 6;
238 else if( job->color_matrix == 2 )
240 // ITU BT.709 HD content
241 param.vui.i_colorprim = 1;
242 param.vui.i_transfer = 1;
243 param.vui.i_colmatrix = 1;
245 else if ( job->title->width >= 1280 || job->title->height >= 720 )
247 // we guess that 720p or above is ITU BT.709 HD content
248 param.vui.i_colorprim = 1;
249 param.vui.i_transfer = 1;
250 param.vui.i_colmatrix = 1;
254 // ITU BT.601 DVD or SD TV content
255 param.vui.i_colorprim = 6;
256 param.vui.i_transfer = 1;
257 param.vui.i_colmatrix = 6;
260 if( job->anamorphic.mode )
262 param.vui.i_sar_width = job->anamorphic.par_width;
263 param.vui.i_sar_height = job->anamorphic.par_height;
265 hb_log( "encx264: encoding with stored aspect %d/%d",
266 param.vui.i_sar_width, param.vui.i_sar_height );
270 if( job->vquality > 0.0 && job->vquality < 1.0 )
273 param.rc.i_rc_method = X264_RC_CRF;
274 param.rc.f_rf_constant = 51 - job->vquality * 51;
275 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
277 else if( job->vquality == 0 || job->vquality >= 1.0 )
279 /* Use the vquality as a raw RF or QP
280 instead of treating it like a percentage. */
282 param.rc.i_rc_method = X264_RC_CRF;
283 param.rc.f_rf_constant = job->vquality;
284 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
289 param.rc.i_rc_method = X264_RC_ABR;
290 param.rc.i_bitrate = job->vbitrate;
294 param.rc.b_stat_write = 1;
295 param.rc.psz_stat_out = pv->filename;
298 param.rc.b_stat_read = 1;
299 param.rc.psz_stat_in = pv->filename;
304 hb_deep_log( 2, "encx264: opening libx264 (pass %d)", job->pass );
305 pv->x264 = x264_encoder_open( ¶m );
307 x264_encoder_headers( pv->x264, &nal, &nal_count );
309 /* Sequence Parameter Set */
310 memcpy(w->config->h264.sps, nal[0].p_payload + 4, nal[0].i_payload - 4);
311 w->config->h264.sps_length = nal[0].i_payload - 4;
313 /* Picture Parameter Set */
314 memcpy(w->config->h264.pps, nal[1].p_payload + 4, nal[1].i_payload - 4);
315 w->config->h264.pps_length = nal[1].i_payload - 4;
317 x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
318 job->width, job->height );
320 pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
321 pv->x264_allocated_pic = pv->pic_in.img.plane[0];
326 void encx264Close( hb_work_object_t * w )
328 hb_work_private_t * pv = w->private_data;
330 if ( pv->frames_split )
332 hb_log( "encx264: %u frames had to be split (%u in, %u out)",
333 pv->frames_split, pv->frames_in, pv->frames_out );
336 * Patch the x264 allocated data back in so that x264 can free it
337 * we have been using our own buffers during the encode to avoid copying.
339 pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
340 x264_picture_clean( &pv->pic_in );
341 x264_encoder_close( pv->x264 );
343 w->private_data = NULL;
349 * see comments in definition of 'frame_info' in pv struct for description
350 * of what these routines are doing.
352 static void save_frame_info( hb_work_private_t * pv, hb_buffer_t * in )
354 int i = (in->start >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
355 pv->frame_info[i].duration = in->stop - in->start;
358 static int64_t get_frame_duration( hb_work_private_t * pv, int64_t pts )
360 int i = (pts >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
361 return pv->frame_info[i].duration;
364 static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
365 int i_nal, x264_nal_t *nal )
367 hb_buffer_t *buf = NULL;
368 hb_work_private_t *pv = w->private_data;
369 hb_job_t *job = pv->job;
371 /* Should be way too large */
372 buf = hb_video_buffer_init( job->width, job->height );
376 // use the pts to get the original frame's duration.
377 int64_t duration = get_frame_duration( pv, pic_out->i_pts );
378 buf->start = pic_out->i_pts;
379 buf->stop = pic_out->i_pts + duration;
380 buf->renderOffset = pic_out->i_dts;
381 if ( !w->config->h264.init_delay && pic_out->i_dts < 0 )
383 w->config->h264.init_delay = -pic_out->i_dts;
386 /* Encode all the NALs we were given into buf.
387 NOTE: This code assumes one video frame per NAL (but there can
388 be other stuff like SPS and/or PPS). If there are multiple
389 frames we only get the duration of the first which will
390 eventually screw up the muxer & decoder. */
392 for( i = 0; i < i_nal; i++ )
394 int size = nal[i].i_payload;
395 memcpy(buf->data + buf->size, nal[i].p_payload, size);
401 /* H.264 in .mp4 or .mkv */
402 switch( nal[i].i_type )
404 /* Sequence Parameter Set & Program Parameter Set go in the
405 * mp4 header so skip them here
418 /* Decide what type of frame we have. */
419 switch( pic_out->i_type )
422 buf->frametype = HB_FRAME_IDR;
423 /* if we have a chapter marker pending and this
424 frame's presentation time stamp is at or after
425 the marker's time stamp, use this as the
427 if( pv->next_chap != 0 && pv->next_chap <= pic_out->i_pts )
430 buf->new_chap = pv->chap_mark;
435 buf->frametype = HB_FRAME_I;
439 buf->frametype = HB_FRAME_P;
443 buf->frametype = HB_FRAME_B;
446 /* This is for b-pyramid, which has reference b-frames
447 However, it doesn't seem to ever be used... */
449 buf->frametype = HB_FRAME_BREF;
452 // If it isn't the above, what type of frame is it??
458 /* Since libx264 doesn't tell us when b-frames are
459 themselves reference frames, figure it out on our own. */
460 if( (buf->frametype == HB_FRAME_B) &&
461 (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
462 buf->frametype = HB_FRAME_BREF;
464 /* Expose disposable bit to muxer. */
465 if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
466 buf->flags &= ~HB_FRAME_REF;
468 buf->flags |= HB_FRAME_REF;
472 // make sure we found at least one video frame
473 if ( buf->size <= 0 )
475 // no video - discard the buf
476 hb_buffer_close( &buf );
481 static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
483 hb_work_private_t *pv = w->private_data;
484 hb_job_t *job = pv->job;
486 /* Point x264 at our current buffers Y(UV) data. */
487 pv->pic_in.img.plane[0] = in->data;
489 int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
492 /* XXX x264 has currently no option for grayscale encoding */
493 memset( pv->pic_in.img.plane[1], 0x80, uvsize );
494 memset( pv->pic_in.img.plane[2], 0x80, uvsize );
498 /* Point x264 at our buffers (Y)UV data */
499 pv->pic_in.img.plane[1] = in->data + job->width * job->height;
500 pv->pic_in.img.plane[2] = pv->pic_in.img.plane[1] + uvsize;
502 if( in->new_chap && job->chapter_markers )
504 /* chapters have to start with an IDR frame so request that this
505 frame be coded as IDR. Since there may be up to 16 frames
506 currently buffered in the encoder remember the timestamp so
507 when this frame finally pops out of the encoder we'll mark
508 its buffer as the start of a chapter. */
509 pv->pic_in.i_type = X264_TYPE_IDR;
510 if( pv->next_chap == 0 )
512 pv->next_chap = in->start;
513 pv->chap_mark = in->new_chap;
515 /* don't let 'work_loop' put a chapter mark on the wrong buffer */
520 pv->pic_in.i_type = X264_TYPE_AUTO;
522 pv->pic_in.i_qpplus1 = 0;
524 /* XXX this is temporary debugging code to check that the upstream
525 * modules (render & sync) have generated a continuous, self-consistent
526 * frame stream with the current frame's start time equal to the
527 * previous frame's stop time.
529 if( pv->last_stop != in->start )
531 hb_log("encx264 input continuity err: last stop %"PRId64" start %"PRId64,
532 pv->last_stop, in->start);
534 pv->last_stop = in->stop;
536 // Remember info about this frame that we need to pass across
537 // the x264_encoder_encode call (since it reorders frames).
538 save_frame_info( pv, in );
540 /* Feed the input PTS to x264 so it can figure out proper output PTS */
541 pv->pic_in.i_pts = in->start;
543 x264_picture_t pic_out;
547 x264_encoder_encode( pv->x264, &nal, &i_nal, &pv->pic_in, &pic_out );
550 return nal_encode( w, &pic_out, i_nal, nal );
555 int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
556 hb_buffer_t ** buf_out )
558 hb_work_private_t *pv = w->private_data;
559 hb_buffer_t *in = *buf_in;
565 // EOF on input. Flush any frames still in the decoder then
566 // send the eof downstream to tell the muxer we're done.
567 x264_picture_t pic_out;
570 hb_buffer_t *last_buf = NULL;
572 while ( x264_encoder_delayed_frames( pv->x264 ) )
574 x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
580 hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
584 if ( last_buf == NULL )
587 last_buf->next = buf;
591 // Flushed everything - add the eof to the end of the chain.
592 if ( last_buf == NULL )
601 // Not EOF - encode the packet & wrap it in a NAL
604 *buf_out = x264_encode( w, in );