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 )
79 hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
84 memset( pv->filename, 0, 1024 );
85 hb_get_tempory_filename( job->h, pv->filename, "x264.log" );
87 x264_param_default( ¶m );
89 /* Default weightp to off for baseline,
90 overridable through x264 option strings. */
91 if( job->x264opts != NULL && *job->x264opts != '\0' )
93 char *x264opts, *x264opts_start;
95 x264opts = x264opts_start = strdup(job->x264opts);
97 while( x264opts_start && *x264opts )
99 char *name = x264opts;
102 x264opts += strcspn( x264opts, ":" );
109 value = strchr( name, '=' );
116 if( !( strcmp( name, "bframes" ) ) )
118 if( atoi( value ) == 0 )
120 param.analyse.i_weighted_pred = X264_WEIGHTP_NONE;
121 hb_log("encx264: no bframes, disabling weight-p unless told otherwise");
128 param.analyse.b_psnr = 1;
129 param.analyse.b_ssim = 1;
131 param.i_threads = ( hb_get_cpu_count() * 3 / 2 );
132 param.i_width = job->width;
133 param.i_height = job->height;
134 param.i_fps_num = job->vrate;
135 param.i_fps_den = job->vrate_base;
137 /* Disable annexb. Inserts size into nal header instead of start code */
140 /* Set min:max key intervals ratio to 1:10 of fps.
141 * This section is skipped if fps=25 (default).
143 if (job->vrate_base != 1080000)
145 if (job->pass == 2 && !job->cfr )
147 /* Even though the framerate might be different due to VFR,
148 we still want the same keyframe intervals as the 1st pass,
149 so the 1st pass stats won't conflict on frame decisions. */
150 hb_interjob_t * interjob = hb_interjob_get( job->h );
151 param.i_keyint_min = ( interjob->vrate / interjob->vrate_base ) + 1;
152 param.i_keyint_max = ( 10 * interjob->vrate / interjob->vrate_base ) + 1;
156 int fps = job->vrate / job->vrate_base;
158 /* adjust +1 when fps has remainder to bump
159 { 23.976, 29.976, 59.94 } to { 24, 30, 60 } */
160 if (job->vrate % job->vrate_base)
163 param.i_keyint_min = fps;
164 param.i_keyint_max = fps * 10;
168 param.i_log_level = X264_LOG_INFO;
169 if( job->h264_level )
172 param.i_level_idc = job->h264_level;
173 hb_log( "encx264: encoding at level %i",
178 This section passes the string x264opts to libx264 for parsing into
179 parameter names and values.
181 The string is set up like this:
182 option1=value1:option2=value 2
184 So, you have to iterate through based on the colons, and then put
185 the left side of the equals sign in "name" and the right side into
186 "value." Then you hand those strings off to x264 for interpretation.
188 This is all based on the universal x264 option handling Loren
189 Merritt implemented in the Mplayer/Mencoder project.
192 if( job->x264opts != NULL && *job->x264opts != '\0' )
194 char *x264opts, *x264opts_start;
196 x264opts = x264opts_start = strdup(job->x264opts);
198 while( x264opts_start && *x264opts )
200 char *name = x264opts;
204 x264opts += strcspn( x264opts, ":" );
211 value = strchr( name, '=' );
218 if( !( strcmp( name, "b-pyramid" ) ) )
220 if( value == NULL || !strcmp( value, "1" ) )
224 else if( !strcmp( value, "0" ) )
230 /* Here's where the strings are passed to libx264 for parsing. */
231 ret = x264_param_parse( ¶m, name, value );
233 /* Let x264 sanity check the options for us*/
234 if( ret == X264_PARAM_BAD_NAME )
235 hb_log( "x264 options: Unknown suboption %s", name );
236 if( ret == X264_PARAM_BAD_VALUE )
237 hb_log( "x264 options: Bad argument %s=%s", name, value ? value : "(null)" );
239 free(x264opts_start);
242 /* B-frames are on by default.*/
245 if( param.i_bframe && param.i_bframe_pyramid )
247 /* Note b-pyramid here, so the initial delay can be doubled */
250 else if( !param.i_bframe )
253 When B-frames are enabled, the max frame count increments
254 by 1 (regardless of the number of B-frames). If you don't
255 change the duration of the video track when you mux, libmp4
256 barfs. So, check if the x264opts aren't using B-frames, and
257 when they aren't, set the boolean job->areBframes as false.
262 if( param.i_keyint_min != 25 || param.i_keyint_max != 250 )
263 hb_log("encx264: keyint-min: %i, keyint-max: %i", param.i_keyint_min, param.i_keyint_max);
265 /* set up the VUI color model & gamma to match what the COLR atom
266 * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
267 if( job->color_matrix == 1 )
269 // ITU BT.601 DVD or SD TV content
270 param.vui.i_colorprim = 6;
271 param.vui.i_transfer = 1;
272 param.vui.i_colmatrix = 6;
274 else if( job->color_matrix == 2 )
276 // ITU BT.709 HD content
277 param.vui.i_colorprim = 1;
278 param.vui.i_transfer = 1;
279 param.vui.i_colmatrix = 1;
281 else if ( job->title->width >= 1280 || job->title->height >= 720 )
283 // we guess that 720p or above is ITU BT.709 HD content
284 param.vui.i_colorprim = 1;
285 param.vui.i_transfer = 1;
286 param.vui.i_colmatrix = 1;
290 // ITU BT.601 DVD or SD TV content
291 param.vui.i_colorprim = 6;
292 param.vui.i_transfer = 1;
293 param.vui.i_colmatrix = 6;
296 if( job->anamorphic.mode )
298 param.vui.i_sar_width = job->anamorphic.par_width;
299 param.vui.i_sar_height = job->anamorphic.par_height;
301 hb_log( "encx264: encoding with stored aspect %d/%d",
302 param.vui.i_sar_width, param.vui.i_sar_height );
306 if( job->vquality > 0.0 && job->vquality < 1.0 )
309 param.rc.i_rc_method = X264_RC_CRF;
310 param.rc.f_rf_constant = 51 - job->vquality * 51;
311 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
313 else if( job->vquality == 0 || job->vquality >= 1.0 )
315 /* Use the vquality as a raw RF or QP
316 instead of treating it like a percentage. */
318 param.rc.i_rc_method = X264_RC_CRF;
319 param.rc.f_rf_constant = job->vquality;
320 hb_log( "encx264: Encoding at constant RF %f", param.rc.f_rf_constant );
325 param.rc.i_rc_method = X264_RC_ABR;
326 param.rc.i_bitrate = job->vbitrate;
330 param.rc.b_stat_write = 1;
331 param.rc.psz_stat_out = pv->filename;
334 param.rc.b_stat_read = 1;
335 param.rc.psz_stat_in = pv->filename;
340 hb_deep_log( 2, "encx264: opening libx264 (pass %d)", job->pass );
341 pv->x264 = x264_encoder_open( ¶m );
343 x264_encoder_headers( pv->x264, &nal, &nal_count );
345 /* Sequence Parameter Set */
346 memcpy(w->config->h264.sps, nal[1].p_payload + 4, nal[1].i_payload - 4);
347 w->config->h264.sps_length = nal[1].i_payload - 4;
349 /* Picture Parameter Set */
350 memcpy(w->config->h264.pps, nal[2].p_payload + 4, nal[2].i_payload - 4);
351 w->config->h264.pps_length = nal[2].i_payload - 4;
353 x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
354 job->width, job->height );
356 pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
357 pv->x264_allocated_pic = pv->pic_in.img.plane[0];
361 /* Basic initDelay value is the clockrate divided by the FPS
362 -- the length of one frame in clockticks. */
363 pv->init_delay = 90000. / ((double)job->vrate / (double)job->vrate_base);
365 /* 23.976-length frames are 3753.75 ticks long on average but the DVD
366 creates that average rate by repeating 59.95 fields so the max
367 frame size is actually 4504.5 (3 field times). The field durations
368 are computed based on quantized times (see below) so we need an extra
369 two ticks to account for the rounding. */
370 if (pv->init_delay == 3753)
371 pv->init_delay = 4507;
373 /* frame rates are not exact in the DVD 90KHz PTS clock (they are
374 exact in the DVD 27MHz system clock but we never see that) so the
375 rates computed above are all +-1 due to quantization. Worst case
376 is when a clock-rounded-down frame is adjacent to a rounded-up frame
377 which makes one of the frames 2 ticks longer than the nominal
381 /* For VFR, libhb sees the FPS as 29.97, but the longest frames
382 will use the duration of frames running at 23.976fps instead.
383 Since detelecine occasionally makes mistakes and since we have
384 to deal with some really horrible timing jitter from mkvs and
385 mp4s encoded with low resolution clocks, make the delay very
386 conservative if we're not doing CFR. */
392 /* The delay is 1 frames for regular b-frames, 2 for b-pyramid. */
393 pv->init_delay *= job->areBframes;
395 w->config->h264.init_delay = pv->init_delay;
400 void encx264Close( hb_work_object_t * w )
402 hb_work_private_t * pv = w->private_data;
404 if ( pv->frames_split )
406 hb_log( "encx264: %u frames had to be split (%u in, %u out)",
407 pv->frames_split, pv->frames_in, pv->frames_out );
410 * Patch the x264 allocated data back in so that x264 can free it
411 * we have been using our own buffers during the encode to avoid copying.
413 pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
414 x264_picture_clean( &pv->pic_in );
415 x264_encoder_close( pv->x264 );
417 w->private_data = NULL;
423 * see comments in definition of 'frame_info' in pv struct for description
424 * of what these routines are doing.
426 static void save_frame_info( hb_work_private_t * pv, hb_buffer_t * in )
428 int i = (in->start >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
429 pv->frame_info[i].duration = in->stop - in->start;
432 static int64_t get_frame_duration( hb_work_private_t * pv, int64_t pts )
434 int i = (pts >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
435 return pv->frame_info[i].duration;
438 static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
439 int i_nal, x264_nal_t *nal )
441 hb_buffer_t *buf = NULL;
442 hb_work_private_t *pv = w->private_data;
443 hb_job_t *job = pv->job;
445 /* Should be way too large */
446 buf = hb_video_buffer_init( job->width, job->height );
450 // use the pts to get the original frame's duration.
451 int64_t duration = get_frame_duration( pv, pic_out->i_pts );
452 buf->start = pic_out->i_pts;
453 buf->stop = pic_out->i_pts + duration;
455 /* Encode all the NALs we were given into buf.
456 NOTE: This code assumes one video frame per NAL (but there can
457 be other stuff like SPS and/or PPS). If there are multiple
458 frames we only get the duration of the first which will
459 eventually screw up the muxer & decoder. */
461 for( i = 0; i < i_nal; i++ )
463 int size = nal[i].i_payload;
464 memcpy(buf->data + buf->size, nal[i].p_payload, size);
470 if( job->mux & HB_MUX_AVI )
472 if( nal[i].i_ref_idc == NAL_PRIORITY_HIGHEST )
474 buf->frametype = HB_FRAME_KEY;
480 /* H.264 in .mp4 or .mkv */
481 switch( nal[i].i_type )
483 /* Sequence Parameter Set & Program Parameter Set go in the
484 * mp4 header so skip them here
497 /* Decide what type of frame we have. */
498 switch( pic_out->i_type )
501 buf->frametype = HB_FRAME_IDR;
502 /* if we have a chapter marker pending and this
503 frame's presentation time stamp is at or after
504 the marker's time stamp, use this as the
506 if( pv->next_chap != 0 && pv->next_chap <= pic_out->i_pts )
509 buf->new_chap = pv->chap_mark;
514 buf->frametype = HB_FRAME_I;
518 buf->frametype = HB_FRAME_P;
522 buf->frametype = HB_FRAME_B;
525 /* This is for b-pyramid, which has reference b-frames
526 However, it doesn't seem to ever be used... */
528 buf->frametype = HB_FRAME_BREF;
531 // If it isn't the above, what type of frame is it??
537 /* Since libx264 doesn't tell us when b-frames are
538 themselves reference frames, figure it out on our own. */
539 if( (buf->frametype == HB_FRAME_B) &&
540 (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
541 buf->frametype = HB_FRAME_BREF;
543 /* Expose disposable bit to muxer. */
544 if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
545 buf->flags &= ~HB_FRAME_REF;
547 buf->flags |= HB_FRAME_REF;
551 // make sure we found at least one video frame
552 if ( buf->size <= 0 )
554 // no video - discard the buf
555 hb_buffer_close( &buf );
560 static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
562 hb_work_private_t *pv = w->private_data;
563 hb_job_t *job = pv->job;
565 /* Point x264 at our current buffers Y(UV) data. */
566 pv->pic_in.img.plane[0] = in->data;
568 int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
571 /* XXX x264 has currently no option for grayscale encoding */
572 memset( pv->pic_in.img.plane[1], 0x80, uvsize );
573 memset( pv->pic_in.img.plane[2], 0x80, uvsize );
577 /* Point x264 at our buffers (Y)UV data */
578 pv->pic_in.img.plane[1] = in->data + job->width * job->height;
579 pv->pic_in.img.plane[2] = pv->pic_in.img.plane[1] + uvsize;
581 if( in->new_chap && job->chapter_markers )
583 /* chapters have to start with an IDR frame so request that this
584 frame be coded as IDR. Since there may be up to 16 frames
585 currently buffered in the encoder remember the timestamp so
586 when this frame finally pops out of the encoder we'll mark
587 its buffer as the start of a chapter. */
588 pv->pic_in.i_type = X264_TYPE_IDR;
589 if( pv->next_chap == 0 )
591 pv->next_chap = in->start;
592 pv->chap_mark = in->new_chap;
594 /* don't let 'work_loop' put a chapter mark on the wrong buffer */
599 pv->pic_in.i_type = X264_TYPE_AUTO;
601 pv->pic_in.i_qpplus1 = 0;
603 /* XXX this is temporary debugging code to check that the upstream
604 * modules (render & sync) have generated a continuous, self-consistent
605 * frame stream with the current frame's start time equal to the
606 * previous frame's stop time.
608 if( pv->last_stop != in->start )
610 hb_log("encx264 input continuity err: last stop %"PRId64" start %"PRId64,
611 pv->last_stop, in->start);
613 pv->last_stop = in->stop;
615 // Remember info about this frame that we need to pass across
616 // the x264_encoder_encode call (since it reorders frames).
617 save_frame_info( pv, in );
619 /* Feed the input PTS to x264 so it can figure out proper output PTS */
620 pv->pic_in.i_pts = in->start;
622 x264_picture_t pic_out;
626 x264_encoder_encode( pv->x264, &nal, &i_nal, &pv->pic_in, &pic_out );
629 return nal_encode( w, &pic_out, i_nal, nal );
634 int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
635 hb_buffer_t ** buf_out )
637 hb_work_private_t *pv = w->private_data;
638 hb_buffer_t *in = *buf_in;
644 // EOF on input. Flush any frames still in the decoder then
645 // send the eof downstream to tell the muxer we're done.
646 x264_picture_t pic_out;
649 hb_buffer_t *last_buf = NULL;
653 x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
657 hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
661 if ( last_buf == NULL )
664 last_buf->next = buf;
668 // Flushed everything - add the eof to the end of the chain.
669 if ( last_buf == NULL )
678 // Not EOF - encode the packet & wrap it in a NAL
681 // if we're re-ordering frames, check if this frame is too large to reorder
682 if ( pv->init_delay && in->stop - in->start > pv->init_delay )
684 // This frame's duration is larger than the time allotted for b-frame
685 // reordering. That means that if it's used as a reference the decoder
686 // won't be able to move it early enough to render it in correct
687 // sequence & the playback will have odd jumps & twitches. To make
688 // sure this doesn't happen we pretend this frame is multiple
689 // frames, each with duration <= init_delay. Since each of these
690 // new frames contains the same image the visual effect is identical
691 // to the original but the resulting stream can now be coded without
692 // error. We take advantage of the fact that x264 buffers frame
693 // data internally to feed the same image into the encoder multiple
694 // times, just changing its start & stop times each time.
696 int64_t orig_stop = in->stop;
697 int64_t new_stop = in->start;
698 hb_buffer_t *last_buf = NULL;
700 // We want to spread the new frames uniformly over the total time
701 // so that we don't end up with a very short frame at the end.
702 // In the number of pieces calculation we add in init_delay-1 to
703 // round up but not add an extra piece if the frame duration is
704 // a multiple of init_delay. The final increment of frame_dur is
705 // to restore the bits that got truncated by the divide on the
706 // previous line. If we don't do this we end up with an extra tiny
707 // frame at the end whose duration is npieces-1.
708 int64_t frame_dur = orig_stop - new_stop;
709 int64_t npieces = ( frame_dur + pv->init_delay - 1 ) / pv->init_delay;
710 frame_dur /= npieces;
713 while ( in->start < orig_stop )
715 new_stop += frame_dur;
716 if ( new_stop > orig_stop )
717 new_stop = orig_stop;
719 hb_buffer_t *buf = x264_encode( w, in );
723 if ( last_buf == NULL )
726 last_buf->next = buf;
729 in->start = new_stop;
735 *buf_out = x264_encode( w, in );