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
63 } frame_info[FRAME_INFO_SIZE];
68 /***********************************************************************
69 * hb_work_encx264_init
70 ***********************************************************************
72 **********************************************************************/
73 int encx264Init( hb_work_object_t * w, hb_job_t * job )
80 hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
85 memset( pv->filename, 0, 1024 );
86 hb_get_tempory_filename( job->h, pv->filename, "x264.log" );
88 x264_param_default( ¶m );
90 /* Temporarily default mbtree to off for baseline,
91 overridable through x264 option strings. */
92 if( job->x264opts != NULL && *job->x264opts != '\0' )
94 char *x264opts, *x264opts_start;
96 x264opts = x264opts_start = strdup(job->x264opts);
98 while( x264opts_start && *x264opts )
100 char *name = x264opts;
104 x264opts += strcspn( x264opts, ":" );
111 value = strchr( name, '=' );
119 When B-frames are enabled, the max frame count increments
120 by 1 (regardless of the number of B-frames). If you don't
121 change the duration of the video track when you mux, libmp4
122 barfs. So, check if the x264opts aren't using B-frames, and
123 when they aren't, set the boolean job->areBframes as false.
125 if( !( strcmp( name, "bframes" ) ) )
127 if( atoi( value ) == 0 )
129 param.rc.b_mb_tree = 0;
136 param.analyse.b_psnr = 1;
137 param.analyse.b_ssim = 1;
139 param.i_threads = ( hb_get_cpu_count() * 3 / 2 );
140 param.i_width = job->width;
141 param.i_height = job->height;
142 param.i_fps_num = job->vrate;
143 param.i_fps_den = job->vrate_base;
145 /* Set min:max key intervals ratio to 1:10 of fps.
146 * This section is skipped if fps=25 (default).
148 if (job->vrate_base != 1080000)
150 if (job->pass == 2 && !job->cfr )
152 /* Even though the framerate might be different due to VFR,
153 we still want the same keyframe intervals as the 1st pass,
154 so the 1st pass stats won't conflict on frame decisions. */
155 hb_interjob_t * interjob = hb_interjob_get( job->h );
156 param.i_keyint_min = ( interjob->vrate / interjob->vrate_base ) + 1;
157 param.i_keyint_max = ( 10 * interjob->vrate / interjob->vrate_base ) + 1;
161 int fps = job->vrate / job->vrate_base;
163 /* adjust +1 when fps has remainder to bump
164 { 23.976, 29.976, 59.94 } to { 24, 30, 60 } */
165 if (job->vrate % job->vrate_base)
168 param.i_keyint_min = fps;
169 param.i_keyint_max = fps * 10;
172 hb_log("encx264: keyint-min: %i, keyint-max: %i", param.i_keyint_min, param.i_keyint_max);
175 param.i_log_level = X264_LOG_INFO;
176 if( job->h264_level )
179 param.i_level_idc = job->h264_level;
180 hb_log( "encx264: encoding at level %i",
184 /* B-frames are on by default.*/
188 This section passes the string x264opts to libx264 for parsing into
189 parameter names and values.
191 The string is set up like this:
192 option1=value1:option2=value 2
194 So, you have to iterate through based on the colons, and then put
195 the left side of the equals sign in "name" and the right side into
196 "value." Then you hand those strings off to x264 for interpretation.
198 This is all based on the universal x264 option handling Loren
199 Merritt implemented in the Mplayer/Mencoder project.
202 if( job->x264opts != NULL && *job->x264opts != '\0' )
204 char *x264opts, *x264opts_start;
206 x264opts = x264opts_start = strdup(job->x264opts);
208 while( x264opts_start && *x264opts )
210 char *name = x264opts;
214 x264opts += strcspn( x264opts, ":" );
221 value = strchr( name, '=' );
229 When B-frames are enabled, the max frame count increments
230 by 1 (regardless of the number of B-frames). If you don't
231 change the duration of the video track when you mux, libmp4
232 barfs. So, check if the x264opts aren't using B-frames, and
233 when they aren't, set the boolean job->areBframes as false.
235 if( !( strcmp( name, "bframes" ) ) )
237 if( atoi( value ) == 0 )
243 /* Note b-pyramid here, so the initial delay can be doubled */
244 if( !( strcmp( name, "b-pyramid" ) ) )
248 if( atoi( value ) > 0 )
259 /* Here's where the strings are passed to libx264 for parsing. */
260 ret = x264_param_parse( ¶m, name, value );
262 /* Let x264 sanity check the options for us*/
263 if( ret == X264_PARAM_BAD_NAME )
264 hb_log( "x264 options: Unknown suboption %s", name );
265 if( ret == X264_PARAM_BAD_VALUE )
266 hb_log( "x264 options: Bad argument %s=%s", name, value ? value : "(null)" );
268 free(x264opts_start);
271 /* set up the VUI color model & gamma to match what the COLR atom
272 * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
273 if( job->color_matrix == 1 )
275 // ITU BT.601 DVD or SD TV content
276 param.vui.i_colorprim = 6;
277 param.vui.i_transfer = 1;
278 param.vui.i_colmatrix = 6;
280 else if( job->color_matrix == 2 )
282 // ITU BT.709 HD content
283 param.vui.i_colorprim = 1;
284 param.vui.i_transfer = 1;
285 param.vui.i_colmatrix = 1;
287 else if ( job->title->width >= 1280 || job->title->height >= 720 )
289 // we guess that 720p or above is ITU BT.709 HD content
290 param.vui.i_colorprim = 1;
291 param.vui.i_transfer = 1;
292 param.vui.i_colmatrix = 1;
296 // ITU BT.601 DVD or SD TV content
297 param.vui.i_colorprim = 6;
298 param.vui.i_transfer = 1;
299 param.vui.i_colmatrix = 6;
302 if( job->anamorphic.mode )
304 param.vui.i_sar_width = job->anamorphic.par_width;
305 param.vui.i_sar_height = job->anamorphic.par_height;
307 hb_log( "encx264: encoding with stored aspect %d/%d",
308 param.vui.i_sar_width, param.vui.i_sar_height );
312 if( job->vquality > 0.0 && job->vquality < 1.0 )
318 param.rc.i_rc_method = X264_RC_CRF;
319 param.rc.f_rf_constant = 51 - job->vquality * 51;
320 hb_log( "encx264: Encoding at constant RF %f",
321 param.rc.f_rf_constant );
326 param.rc.i_rc_method = X264_RC_CQP;
327 param.rc.i_qp_constant = 51 - job->vquality * 51;
328 hb_log( "encx264: encoding at constant QP %d",
329 param.rc.i_qp_constant );
333 else if( job->vquality == 0 || job->vquality >= 1.0 )
335 /* Use the vquality as a raw RF or QP
336 instead of treating it like a percentage. */
341 param.rc.i_rc_method = X264_RC_CRF;
342 param.rc.f_rf_constant = job->vquality;
343 hb_log( "encx264: Encoding at constant RF %f",
344 param.rc.f_rf_constant );
349 param.rc.i_rc_method = X264_RC_CQP;
350 param.rc.i_qp_constant = job->vquality;
351 hb_log( "encx264: encoding at constant QP %d",
352 param.rc.i_qp_constant );
359 param.rc.i_rc_method = X264_RC_ABR;
360 param.rc.i_bitrate = job->vbitrate;
364 param.rc.b_stat_write = 1;
365 param.rc.psz_stat_out = pv->filename;
368 param.rc.b_stat_read = 1;
369 param.rc.psz_stat_in = pv->filename;
374 hb_deep_log( 2, "encx264: opening libx264 (pass %d)", job->pass );
375 pv->x264 = x264_encoder_open( ¶m );
377 x264_encoder_headers( pv->x264, &nal, &nal_count );
379 /* Sequence Parameter Set */
380 x264_nal_encode( w->config->h264.sps, &nal_size, 0, &nal[1] );
381 w->config->h264.sps_length = nal_size;
383 /* Picture Parameter Set */
384 x264_nal_encode( w->config->h264.pps, &nal_size, 0, &nal[2] );
385 w->config->h264.pps_length = nal_size;
387 x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
388 job->width, job->height );
390 pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
391 pv->x264_allocated_pic = pv->pic_in.img.plane[0];
395 /* Basic initDelay value is the clockrate divided by the FPS
396 -- the length of one frame in clockticks. */
397 pv->init_delay = 90000. / ((double)job->vrate / (double)job->vrate_base);
399 /* 23.976-length frames are 3753.75 ticks long on average but the DVD
400 creates that average rate by repeating 59.95 fields so the max
401 frame size is actually 4504.5 (3 field times). The field durations
402 are computed based on quantized times (see below) so we need an extra
403 two ticks to account for the rounding. */
404 if (pv->init_delay == 3753)
405 pv->init_delay = 4507;
407 /* frame rates are not exact in the DVD 90KHz PTS clock (they are
408 exact in the DVD 27MHz system clock but we never see that) so the
409 rates computed above are all +-1 due to quantization. Worst case
410 is when a clock-rounded-down frame is adjacent to a rounded-up frame
411 which makes one of the frames 2 ticks longer than the nominal
415 /* For VFR, libhb sees the FPS as 29.97, but the longest frames
416 will use the duration of frames running at 23.976fps instead.
417 Since detelecine occasionally makes mistakes and since we have
418 to deal with some really horrible timing jitter from mkvs and
419 mp4s encoded with low resolution clocks, make the delay very
420 conservative if we're not doing CFR. */
426 /* The delay is 1 frames for regular b-frames, 2 for b-pyramid. */
427 pv->init_delay *= job->areBframes;
429 w->config->h264.init_delay = pv->init_delay;
434 void encx264Close( hb_work_object_t * w )
436 hb_work_private_t * pv = w->private_data;
438 if ( pv->frames_split )
440 hb_log( "encx264: %u frames had to be split (%u in, %u out)",
441 pv->frames_split, pv->frames_in, pv->frames_out );
444 * Patch the x264 allocated data back in so that x264 can free it
445 * we have been using our own buffers during the encode to avoid copying.
447 pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
448 x264_picture_clean( &pv->pic_in );
449 x264_encoder_close( pv->x264 );
451 w->private_data = NULL;
457 * see comments in definition of 'frame_info' in pv struct for description
458 * of what these routines are doing.
460 static void save_frame_info( hb_work_private_t * pv, hb_buffer_t * in )
462 int i = (in->start >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
463 pv->frame_info[i].duration = in->stop - in->start;
466 static int64_t get_frame_duration( hb_work_private_t * pv, int64_t pts )
468 int i = (pts >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
469 return pv->frame_info[i].duration;
472 static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
473 int i_nal, x264_nal_t *nal )
475 hb_buffer_t *buf = NULL;
476 hb_work_private_t *pv = w->private_data;
477 hb_job_t *job = pv->job;
479 /* Should be way too large */
480 buf = hb_video_buffer_init( job->width, job->height );
484 // use the pts to get the original frame's duration.
485 int64_t duration = get_frame_duration( pv, pic_out->i_pts );
486 buf->start = pic_out->i_pts;
487 buf->stop = pic_out->i_pts + duration;
489 /* Encode all the NALs we were given into buf.
490 NOTE: This code assumes one video frame per NAL (but there can
491 be other stuff like SPS and/or PPS). If there are multiple
492 frames we only get the duration of the first which will
493 eventually screw up the muxer & decoder. */
495 for( i = 0; i < i_nal; i++ )
497 int data = buf->alloc - buf->size;
498 int size = x264_nal_encode( buf->data + buf->size, &data, 1, &nal[i] );
504 if( job->mux & HB_MUX_AVI )
506 if( nal[i].i_ref_idc == NAL_PRIORITY_HIGHEST )
508 buf->frametype = HB_FRAME_KEY;
514 /* H.264 in .mp4 or .mkv */
515 switch( nal[i].i_type )
517 /* Sequence Parameter Set & Program Parameter Set go in the
518 * mp4 header so skip them here
531 /* H.264 in mp4 (stolen from mp4creator) */
532 buf->data[buf->size+0] = ( ( size - 4 ) >> 24 ) & 0xFF;
533 buf->data[buf->size+1] = ( ( size - 4 ) >> 16 ) & 0xFF;
534 buf->data[buf->size+2] = ( ( size - 4 ) >> 8 ) & 0xFF;
535 buf->data[buf->size+3] = ( ( size - 4 ) >> 0 ) & 0xFF;
537 /* Decide what type of frame we have. */
538 switch( pic_out->i_type )
541 buf->frametype = HB_FRAME_IDR;
542 /* if we have a chapter marker pending and this
543 frame's presentation time stamp is at or after
544 the marker's time stamp, use this as the
546 if( pv->next_chap != 0 && pv->next_chap <= pic_out->i_pts )
549 buf->new_chap = pv->chap_mark;
554 buf->frametype = HB_FRAME_I;
558 buf->frametype = HB_FRAME_P;
562 buf->frametype = HB_FRAME_B;
565 /* This is for b-pyramid, which has reference b-frames
566 However, it doesn't seem to ever be used... */
568 buf->frametype = HB_FRAME_BREF;
571 // If it isn't the above, what type of frame is it??
577 /* Since libx264 doesn't tell us when b-frames are
578 themselves reference frames, figure it out on our own. */
579 if( (buf->frametype == HB_FRAME_B) &&
580 (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
581 buf->frametype = HB_FRAME_BREF;
583 /* Expose disposable bit to muxer. */
584 if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
585 buf->flags &= ~HB_FRAME_REF;
587 buf->flags |= HB_FRAME_REF;
591 // make sure we found at least one video frame
592 if ( buf->size <= 0 )
594 // no video - discard the buf
595 hb_buffer_close( &buf );
600 static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
602 hb_work_private_t *pv = w->private_data;
603 hb_job_t *job = pv->job;
605 /* Point x264 at our current buffers Y(UV) data. */
606 pv->pic_in.img.plane[0] = in->data;
608 int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
611 /* XXX x264 has currently no option for grayscale encoding */
612 memset( pv->pic_in.img.plane[1], 0x80, uvsize );
613 memset( pv->pic_in.img.plane[2], 0x80, uvsize );
617 /* Point x264 at our buffers (Y)UV data */
618 pv->pic_in.img.plane[1] = in->data + job->width * job->height;
619 pv->pic_in.img.plane[2] = pv->pic_in.img.plane[1] + uvsize;
621 if( in->new_chap && job->chapter_markers )
623 /* chapters have to start with an IDR frame so request that this
624 frame be coded as IDR. Since there may be up to 16 frames
625 currently buffered in the encoder remember the timestamp so
626 when this frame finally pops out of the encoder we'll mark
627 its buffer as the start of a chapter. */
628 pv->pic_in.i_type = X264_TYPE_IDR;
629 if( pv->next_chap == 0 )
631 pv->next_chap = in->start;
632 pv->chap_mark = in->new_chap;
634 /* don't let 'work_loop' put a chapter mark on the wrong buffer */
639 pv->pic_in.i_type = X264_TYPE_AUTO;
641 pv->pic_in.i_qpplus1 = 0;
643 /* XXX this is temporary debugging code to check that the upstream
644 * modules (render & sync) have generated a continuous, self-consistent
645 * frame stream with the current frame's start time equal to the
646 * previous frame's stop time.
648 if( pv->last_stop != in->start )
650 hb_log("encx264 input continuity err: last stop %"PRId64" start %"PRId64,
651 pv->last_stop, in->start);
653 pv->last_stop = in->stop;
655 // Remember info about this frame that we need to pass across
656 // the x264_encoder_encode call (since it reorders frames).
657 save_frame_info( pv, in );
659 /* Feed the input PTS to x264 so it can figure out proper output PTS */
660 pv->pic_in.i_pts = in->start;
662 x264_picture_t pic_out;
666 x264_encoder_encode( pv->x264, &nal, &i_nal, &pv->pic_in, &pic_out );
669 return nal_encode( w, &pic_out, i_nal, nal );
674 int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
675 hb_buffer_t ** buf_out )
677 hb_work_private_t *pv = w->private_data;
678 hb_buffer_t *in = *buf_in;
684 // EOF on input. Flush any frames still in the decoder then
685 // send the eof downstream to tell the muxer we're done.
686 x264_picture_t pic_out;
689 hb_buffer_t *last_buf = NULL;
693 x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
697 hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
701 if ( last_buf == NULL )
704 last_buf->next = buf;
708 // Flushed everything - add the eof to the end of the chain.
709 if ( last_buf == NULL )
718 // Not EOF - encode the packet & wrap it in a NAL
721 // if we're re-ordering frames, check if this frame is too large to reorder
722 if ( pv->init_delay && in->stop - in->start > pv->init_delay )
724 // This frame's duration is larger than the time allotted for b-frame
725 // reordering. That means that if it's used as a reference the decoder
726 // won't be able to move it early enough to render it in correct
727 // sequence & the playback will have odd jumps & twitches. To make
728 // sure this doesn't happen we pretend this frame is multiple
729 // frames, each with duration <= init_delay. Since each of these
730 // new frames contains the same image the visual effect is identical
731 // to the original but the resulting stream can now be coded without
732 // error. We take advantage of the fact that x264 buffers frame
733 // data internally to feed the same image into the encoder multiple
734 // times, just changing its start & stop times each time.
736 int64_t orig_stop = in->stop;
737 int64_t new_stop = in->start;
738 hb_buffer_t *last_buf = NULL;
740 // We want to spread the new frames uniformly over the total time
741 // so that we don't end up with a very short frame at the end.
742 // In the number of pieces calculation we add in init_delay-1 to
743 // round up but not add an extra piece if the frame duration is
744 // a multiple of init_delay. The final increment of frame_dur is
745 // to restore the bits that got truncated by the divide on the
746 // previous line. If we don't do this we end up with an extra tiny
747 // frame at the end whose duration is npieces-1.
748 int64_t frame_dur = orig_stop - new_stop;
749 int64_t npieces = ( frame_dur + pv->init_delay - 1 ) / pv->init_delay;
750 frame_dur /= npieces;
753 while ( in->start < orig_stop )
755 new_stop += frame_dur;
756 if ( new_stop > orig_stop )
757 new_stop = orig_stop;
759 hb_buffer_t *buf = x264_encode( w, in );
763 if ( last_buf == NULL )
766 last_buf->next = buf;
769 in->start = new_stop;
775 *buf_out = x264_encode( w, in );