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 * (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 * (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 )
209 hb_log("encx264: min-keyint: %i, keyint: %i", param.i_keyint_min == X264_KEYINT_MIN_AUTO ? param.i_keyint_max / 10 : param.i_keyint_min,
212 /* set up the VUI color model & gamma to match what the COLR atom
213 * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
214 if( job->color_matrix == 1 )
216 // ITU BT.601 DVD or SD TV content
217 param.vui.i_colorprim = 6;
218 param.vui.i_transfer = 1;
219 param.vui.i_colmatrix = 6;
221 else if( job->color_matrix == 2 )
223 // ITU BT.709 HD content
224 param.vui.i_colorprim = 1;
225 param.vui.i_transfer = 1;
226 param.vui.i_colmatrix = 1;
228 else if ( job->title->width >= 1280 || job->title->height >= 720 )
230 // we guess that 720p or above is ITU BT.709 HD content
231 param.vui.i_colorprim = 1;
232 param.vui.i_transfer = 1;
233 param.vui.i_colmatrix = 1;
237 // ITU BT.601 DVD or SD TV content
238 param.vui.i_colorprim = 6;
239 param.vui.i_transfer = 1;
240 param.vui.i_colmatrix = 6;
243 if( job->anamorphic.mode )
245 param.vui.i_sar_width = job->anamorphic.par_width;
246 param.vui.i_sar_height = job->anamorphic.par_height;
248 hb_log( "encx264: encoding with stored aspect %d/%d",
249 param.vui.i_sar_width, param.vui.i_sar_height );
253 if( job->vquality > 0.0 && job->vquality < 1.0 )
256 param.rc.i_rc_method = X264_RC_CRF;
257 param.rc.f_rf_constant = 51 - job->vquality * 51;
258 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
260 else if( job->vquality == 0 || job->vquality >= 1.0 )
262 /* Use the vquality as a raw RF or QP
263 instead of treating it like a percentage. */
265 param.rc.i_rc_method = X264_RC_CRF;
266 param.rc.f_rf_constant = job->vquality;
267 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
272 param.rc.i_rc_method = X264_RC_ABR;
273 param.rc.i_bitrate = job->vbitrate;
277 param.rc.b_stat_write = 1;
278 param.rc.psz_stat_out = pv->filename;
281 param.rc.b_stat_read = 1;
282 param.rc.psz_stat_in = pv->filename;
287 hb_deep_log( 2, "encx264: opening libx264 (pass %d)", job->pass );
288 pv->x264 = x264_encoder_open( ¶m );
290 x264_encoder_headers( pv->x264, &nal, &nal_count );
292 /* Sequence Parameter Set */
293 memcpy(w->config->h264.sps, nal[0].p_payload + 4, nal[0].i_payload - 4);
294 w->config->h264.sps_length = nal[0].i_payload - 4;
296 /* Picture Parameter Set */
297 memcpy(w->config->h264.pps, nal[1].p_payload + 4, nal[1].i_payload - 4);
298 w->config->h264.pps_length = nal[1].i_payload - 4;
300 x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
301 job->width, job->height );
303 pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
304 pv->x264_allocated_pic = pv->pic_in.img.plane[0];
309 void encx264Close( hb_work_object_t * w )
311 hb_work_private_t * pv = w->private_data;
313 if ( pv->frames_split )
315 hb_log( "encx264: %u frames had to be split (%u in, %u out)",
316 pv->frames_split, pv->frames_in, pv->frames_out );
319 * Patch the x264 allocated data back in so that x264 can free it
320 * we have been using our own buffers during the encode to avoid copying.
322 pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
323 x264_picture_clean( &pv->pic_in );
324 x264_encoder_close( pv->x264 );
326 w->private_data = NULL;
332 * see comments in definition of 'frame_info' in pv struct for description
333 * of what these routines are doing.
335 static void save_frame_info( hb_work_private_t * pv, hb_buffer_t * in )
337 int i = (in->start >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
338 pv->frame_info[i].duration = in->stop - in->start;
341 static int64_t get_frame_duration( hb_work_private_t * pv, int64_t pts )
343 int i = (pts >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
344 return pv->frame_info[i].duration;
347 static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
348 int i_nal, x264_nal_t *nal )
350 hb_buffer_t *buf = NULL;
351 hb_work_private_t *pv = w->private_data;
352 hb_job_t *job = pv->job;
354 /* Should be way too large */
355 buf = hb_video_buffer_init( job->width, job->height );
359 // use the pts to get the original frame's duration.
360 int64_t duration = get_frame_duration( pv, pic_out->i_pts );
361 buf->start = pic_out->i_pts;
362 buf->stop = pic_out->i_pts + duration;
363 buf->renderOffset = pic_out->i_dts;
364 if ( !w->config->h264.init_delay && pic_out->i_dts < 0 )
366 w->config->h264.init_delay = -pic_out->i_dts;
369 /* Encode all the NALs we were given into buf.
370 NOTE: This code assumes one video frame per NAL (but there can
371 be other stuff like SPS and/or PPS). If there are multiple
372 frames we only get the duration of the first which will
373 eventually screw up the muxer & decoder. */
375 for( i = 0; i < i_nal; i++ )
377 int size = nal[i].i_payload;
378 memcpy(buf->data + buf->size, nal[i].p_payload, size);
384 /* H.264 in .mp4 or .mkv */
385 switch( nal[i].i_type )
387 /* Sequence Parameter Set & Program Parameter Set go in the
388 * mp4 header so skip them here
401 /* Decide what type of frame we have. */
402 switch( pic_out->i_type )
405 buf->frametype = HB_FRAME_IDR;
406 /* if we have a chapter marker pending and this
407 frame's presentation time stamp is at or after
408 the marker's time stamp, use this as the
410 if( pv->next_chap != 0 && pv->next_chap <= pic_out->i_pts )
413 buf->new_chap = pv->chap_mark;
418 buf->frametype = HB_FRAME_I;
422 buf->frametype = HB_FRAME_P;
426 buf->frametype = HB_FRAME_B;
429 /* This is for b-pyramid, which has reference b-frames
430 However, it doesn't seem to ever be used... */
432 buf->frametype = HB_FRAME_BREF;
435 // If it isn't the above, what type of frame is it??
441 /* Since libx264 doesn't tell us when b-frames are
442 themselves reference frames, figure it out on our own. */
443 if( (buf->frametype == HB_FRAME_B) &&
444 (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
445 buf->frametype = HB_FRAME_BREF;
447 /* Expose disposable bit to muxer. */
448 if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
449 buf->flags &= ~HB_FRAME_REF;
451 buf->flags |= HB_FRAME_REF;
455 // make sure we found at least one video frame
456 if ( buf->size <= 0 )
458 // no video - discard the buf
459 hb_buffer_close( &buf );
464 static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
466 hb_work_private_t *pv = w->private_data;
467 hb_job_t *job = pv->job;
469 /* Point x264 at our current buffers Y(UV) data. */
470 pv->pic_in.img.plane[0] = in->data;
472 int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
475 /* XXX x264 has currently no option for grayscale encoding */
476 memset( pv->pic_in.img.plane[1], 0x80, uvsize );
477 memset( pv->pic_in.img.plane[2], 0x80, uvsize );
481 /* Point x264 at our buffers (Y)UV data */
482 pv->pic_in.img.plane[1] = in->data + job->width * job->height;
483 pv->pic_in.img.plane[2] = pv->pic_in.img.plane[1] + uvsize;
485 if( in->new_chap && job->chapter_markers )
487 /* chapters have to start with an IDR frame so request that this
488 frame be coded as IDR. Since there may be up to 16 frames
489 currently buffered in the encoder remember the timestamp so
490 when this frame finally pops out of the encoder we'll mark
491 its buffer as the start of a chapter. */
492 pv->pic_in.i_type = X264_TYPE_IDR;
493 if( pv->next_chap == 0 )
495 pv->next_chap = in->start;
496 pv->chap_mark = in->new_chap;
498 /* don't let 'work_loop' put a chapter mark on the wrong buffer */
503 pv->pic_in.i_type = X264_TYPE_AUTO;
505 pv->pic_in.i_qpplus1 = 0;
507 /* XXX this is temporary debugging code to check that the upstream
508 * modules (render & sync) have generated a continuous, self-consistent
509 * frame stream with the current frame's start time equal to the
510 * previous frame's stop time.
512 if( pv->last_stop != in->start )
514 hb_log("encx264 input continuity err: last stop %"PRId64" start %"PRId64,
515 pv->last_stop, in->start);
517 pv->last_stop = in->stop;
519 // Remember info about this frame that we need to pass across
520 // the x264_encoder_encode call (since it reorders frames).
521 save_frame_info( pv, in );
523 /* Feed the input PTS to x264 so it can figure out proper output PTS */
524 pv->pic_in.i_pts = in->start;
526 x264_picture_t pic_out;
530 x264_encoder_encode( pv->x264, &nal, &i_nal, &pv->pic_in, &pic_out );
533 return nal_encode( w, &pic_out, i_nal, nal );
538 int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
539 hb_buffer_t ** buf_out )
541 hb_work_private_t *pv = w->private_data;
542 hb_buffer_t *in = *buf_in;
548 // EOF on input. Flush any frames still in the decoder then
549 // send the eof downstream to tell the muxer we're done.
550 x264_picture_t pic_out;
553 hb_buffer_t *last_buf = NULL;
555 while ( x264_encoder_delayed_frames( pv->x264 ) )
557 x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
563 hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
567 if ( last_buf == NULL )
570 last_buf->next = buf;
574 // Flushed everything - add the eof to the end of the chain.
575 if ( last_buf == NULL )
584 // Not EOF - encode the packet & wrap it in a NAL
587 *buf_out = x264_encode( w, in );