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;
53 int chap_mark; // saved chap mark when we're propagating it
54 int64_t last_stop; // Debugging - stop time of previous input frame
60 } frame_info[FRAME_INFO_SIZE];
65 /***********************************************************************
66 * hb_work_encx264_init
67 ***********************************************************************
69 **********************************************************************/
70 int encx264Init( hb_work_object_t * w, hb_job_t * job )
77 hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
82 memset( pv->filename, 0, 1024 );
83 hb_get_tempory_filename( job->h, pv->filename, "x264.log" );
85 x264_param_default( ¶m );
87 param.i_threads = ( hb_get_cpu_count() * 3 / 2 );
88 param.i_width = job->width;
89 param.i_height = job->height;
90 param.i_fps_num = job->vrate;
91 param.i_fps_den = job->vrate_base;
93 if (job->vrate_base != 1080000)
95 /* If the fps isn't 25, adjust the key intervals. Add 1 because
96 we want 24, not 23 with a truncated remainder. */
97 param.i_keyint_min = (job->vrate / job->vrate_base) + 1;
98 param.i_keyint_max = (10 * job->vrate / job->vrate_base) + 1;
99 hb_log("encx264: keyint-min: %i, keyint-max: %i", param.i_keyint_min, param.i_keyint_max);
102 param.i_log_level = X264_LOG_INFO;
103 if( job->h264_level )
106 param.i_level_idc = job->h264_level;
107 hb_log( "encx264: encoding at level %i",
111 /* Slightly faster with minimal quality lost */
112 param.analyse.i_subpel_refine = 4;
115 This section passes the string x264opts to libx264 for parsing into
116 parameter names and values.
118 The string is set up like this:
119 option1=value1:option2=value 2
121 So, you have to iterate through based on the colons, and then put
122 the left side of the equals sign in "name" and the right side into
123 "value." Then you hand those strings off to x264 for interpretation.
125 This is all based on the universal x264 option handling Loren
126 Merritt implemented in the Mplayer/Mencoder project.
129 if( job->x264opts != NULL && *job->x264opts != '\0' )
131 char *x264opts, *x264opts_start;
133 x264opts = x264opts_start = strdup(job->x264opts);
135 while( x264opts_start && *x264opts )
137 char *name = x264opts;
141 x264opts += strcspn( x264opts, ":" );
148 value = strchr( name, '=' );
156 When B-frames are enabled, the max frame count increments
157 by 1 (regardless of the number of B-frames). If you don't
158 change the duration of the video track when you mux, libmp4
159 barfs. So, check if the x264opts are using B-frames, and
160 when they are, set the boolean job->areBframes as true.
163 if( !( strcmp( name, "bframes" ) ) )
165 if( atoi( value ) > 0 )
171 /* Note b-pyramid here, so the initial delay can be doubled */
172 if( !( strcmp( name, "b-pyramid" ) ) )
176 if( atoi( value ) > 0 )
187 /* Here's where the strings are passed to libx264 for parsing. */
188 ret = x264_param_parse( ¶m, name, value );
190 /* Let x264 sanity check the options for us*/
191 if( ret == X264_PARAM_BAD_NAME )
192 hb_log( "x264 options: Unknown suboption %s", name );
193 if( ret == X264_PARAM_BAD_VALUE )
194 hb_log( "x264 options: Bad argument %s=%s", name, value ? value : "(null)" );
196 free(x264opts_start);
199 /* set up the VUI color model & gamma to match what the COLR atom
200 * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
202 if ( job->title->height >= 720 )
204 // we guess that 720p or above is ITU BT.709 HD content
205 param.vui.i_colorprim = 1;
206 param.vui.i_transfer = 1;
207 param.vui.i_colmatrix = 1;
211 // ITU BT.601 DVD or SD TV content
212 param.vui.i_colorprim = 6;
213 param.vui.i_transfer = 1;
214 param.vui.i_colmatrix = 6;
217 if( job->pixel_ratio )
219 param.vui.i_sar_width = job->pixel_aspect_width;
220 param.vui.i_sar_height = job->pixel_aspect_height;
222 hb_log( "encx264: encoding with stored aspect %d/%d",
223 param.vui.i_sar_width, param.vui.i_sar_height );
227 if( job->vquality > 0.0 && job->vquality < 1.0 )
233 param.rc.i_rc_method = X264_RC_CRF;
234 param.rc.f_rf_constant = 51 - job->vquality * 51;
235 hb_log( "encx264: Encoding at constant RF %f",
236 param.rc.f_rf_constant );
241 param.rc.i_rc_method = X264_RC_CQP;
242 param.rc.i_qp_constant = 51 - job->vquality * 51;
243 hb_log( "encx264: encoding at constant QP %d",
244 param.rc.i_qp_constant );
248 else if( job->vquality == 0 || job->vquality >= 1.0 )
250 /* Use the vquality as a raw RF or QP
251 instead of treating it like a percentage. */
256 param.rc.i_rc_method = X264_RC_CRF;
257 param.rc.f_rf_constant = job->vquality;
258 hb_log( "encx264: Encoding at constant RF %f",
259 param.rc.f_rf_constant );
264 param.rc.i_rc_method = X264_RC_CQP;
265 param.rc.i_qp_constant = job->vquality;
266 hb_log( "encx264: encoding at constant QP %d",
267 param.rc.i_qp_constant );
274 param.rc.i_rc_method = X264_RC_ABR;
275 param.rc.i_bitrate = job->vbitrate;
279 param.rc.b_stat_write = 1;
280 param.rc.psz_stat_out = pv->filename;
283 param.rc.b_stat_read = 1;
284 param.rc.psz_stat_in = pv->filename;
289 hb_log( "encx264: opening libx264 (pass %d)", job->pass );
290 pv->x264 = x264_encoder_open( ¶m );
292 x264_encoder_headers( pv->x264, &nal, &nal_count );
294 /* Sequence Parameter Set */
295 x264_nal_encode( w->config->h264.sps, &nal_size, 0, &nal[1] );
296 w->config->h264.sps_length = nal_size;
298 /* Picture Parameter Set */
299 x264_nal_encode( w->config->h264.pps, &nal_size, 0, &nal[2] );
300 w->config->h264.pps_length = nal_size;
302 x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
303 job->width, job->height );
305 pv->x264_allocated_pic = pv->pic_in.img.plane[0];
309 /* Basic initDelay value is the clockrate divided by the FPS
310 -- the length of one frame in clockticks. */
311 pv->init_delay = 90000. / ((double)job->vrate / (double)job->vrate_base);
313 /* 23.976-length frames are 3753.75 ticks long on average but the DVD
314 creates that average rate by repeating 59.95 fields so the max
315 frame size is actually 4504.5 (3 field times). The field durations
316 are computed based on quantized times (see below) so we need an extra
317 two ticks to account for the rounding. */
318 if (pv->init_delay == 3753)
319 pv->init_delay = 4507;
321 /* frame rates are not exact in the DVD 90KHz PTS clock (they are
322 exact in the DVD 27MHz system clock but we never see that) so the
323 rates computed above are all +-1 due to quantization. Worst case
324 is when a clock-rounded-down frame is adjacent to a rounded-up frame
325 which makes one of the frames 2 ticks longer than the nominal
329 /* For VFR, libhb sees the FPS as 29.97, but the longest frames
330 will use the duration of frames running at 23.976fps instead.. */
333 pv->init_delay = 7506;
336 /* The delay is 1 frames for regular b-frames, 2 for b-pyramid. */
337 pv->init_delay *= job->areBframes;
339 w->config->h264.init_delay = pv->init_delay;
344 void encx264Close( hb_work_object_t * w )
346 hb_work_private_t * pv = w->private_data;
348 * Patch the x264 allocated data back in so that x264 can free it
349 * we have been using our own buffers during the encode to avoid copying.
351 pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
352 x264_picture_clean( &pv->pic_in );
353 x264_encoder_close( pv->x264 );
355 w->private_data = NULL;
361 * see comments in definition of 'frame_info' in pv struct for description
362 * of what these routines are doing.
364 static void save_frame_info( hb_work_private_t * pv, hb_buffer_t * in )
366 int i = (in->start >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
367 pv->frame_info[i].duration = in->stop - in->start;
370 static int64_t get_frame_duration( hb_work_private_t * pv, int64_t pts )
372 int i = (pts >> FRAME_INFO_MAX2) & FRAME_INFO_MASK;
373 return pv->frame_info[i].duration;
376 static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
377 int i_nal, x264_nal_t *nal )
379 hb_buffer_t *buf = NULL;
380 hb_work_private_t *pv = w->private_data;
381 hb_job_t *job = pv->job;
383 /* Should be way too large */
384 buf = hb_buffer_init( 3 * job->width * job->height / 2 );
388 // use the pts to get the original frame's duration.
389 int64_t duration = get_frame_duration( pv, pic_out->i_pts );
390 buf->start = pic_out->i_pts;
391 buf->stop = pic_out->i_pts + duration;
393 /* Encode all the NALs we were given into buf.
394 NOTE: This code assumes one video frame per NAL (but there can
395 be other stuff like SPS and/or PPS). If there are multiple
396 frames we only get the duration of the first which will
397 eventually screw up the muxer & decoder. */
399 for( i = 0; i < i_nal; i++ )
401 int data = buf->alloc - buf->size;
402 int size = x264_nal_encode( buf->data + buf->size, &data, 1, &nal[i] );
408 if( job->mux & HB_MUX_AVI )
410 if( nal[i].i_ref_idc == NAL_PRIORITY_HIGHEST )
412 buf->frametype = HB_FRAME_KEY;
418 /* H.264 in .mp4 or .mkv */
419 int naltype = buf->data[buf->size+4] & 0x1f;
420 if ( naltype == 0x7 || naltype == 0x8 )
422 // Sequence Parameter Set & Program Parameter Set go in the
423 // mp4 header so skip them here
427 /* H.264 in mp4 (stolen from mp4creator) */
428 buf->data[buf->size+0] = ( ( size - 4 ) >> 24 ) & 0xFF;
429 buf->data[buf->size+1] = ( ( size - 4 ) >> 16 ) & 0xFF;
430 buf->data[buf->size+2] = ( ( size - 4 ) >> 8 ) & 0xFF;
431 buf->data[buf->size+3] = ( ( size - 4 ) >> 0 ) & 0xFF;
433 /* Decide what type of frame we have. */
434 switch( pic_out->i_type )
437 buf->frametype = HB_FRAME_IDR;
438 /* if we have a chapter marker pending and this
439 frame's presentation time stamp is at or after
440 the marker's time stamp, use this as the
442 if( pv->next_chap != 0 && pv->next_chap <= pic_out->i_pts )
445 buf->new_chap = pv->chap_mark;
450 buf->frametype = HB_FRAME_I;
454 buf->frametype = HB_FRAME_P;
458 buf->frametype = HB_FRAME_B;
461 /* This is for b-pyramid, which has reference b-frames
462 However, it doesn't seem to ever be used... */
464 buf->frametype = HB_FRAME_BREF;
467 // If it isn't the above, what type of frame is it??
473 /* Since libx264 doesn't tell us when b-frames are
474 themselves reference frames, figure it out on our own. */
475 if( (buf->frametype == HB_FRAME_B) &&
476 (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
477 buf->frametype = HB_FRAME_BREF;
481 // make sure we found at least one video frame
482 if ( buf->size <= 0 )
484 // no video - discard the buf
485 hb_buffer_close( &buf );
490 static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
492 hb_work_private_t *pv = w->private_data;
493 hb_job_t *job = pv->job;
495 /* Point x264 at our current buffers Y(UV) data. */
496 pv->pic_in.img.plane[0] = in->data;
500 /* XXX x264 has currently no option for grayscale encoding */
501 memset( pv->pic_in.img.plane[1], 0x80, job->width * job->height / 4 );
502 memset( pv->pic_in.img.plane[2], 0x80, job->width * job->height / 4 );
506 /* Point x264 at our buffers (Y)UV data */
507 pv->pic_in.img.plane[1] = in->data + job->width * job->height;
508 pv->pic_in.img.plane[2] = in->data + 5 * job->width * job->height / 4;
510 if( in->new_chap && job->chapter_markers )
512 /* chapters have to start with an IDR frame so request that this
513 frame be coded as IDR. Since there may be up to 16 frames
514 currently buffered in the encoder remember the timestamp so
515 when this frame finally pops out of the encoder we'll mark
516 its buffer as the start of a chapter. */
517 pv->pic_in.i_type = X264_TYPE_IDR;
518 if( pv->next_chap == 0 )
520 pv->next_chap = in->start;
521 pv->chap_mark = in->new_chap;
523 /* don't let 'work_loop' put a chapter mark on the wrong buffer */
528 pv->pic_in.i_type = X264_TYPE_AUTO;
530 pv->pic_in.i_qpplus1 = 0;
532 /* XXX this is temporary debugging code to check that the upstream
533 * modules (render & sync) have generated a continuous, self-consistent
534 * frame stream with the current frame's start time equal to the
535 * previous frame's stop time.
537 if( pv->last_stop != in->start )
539 hb_log("encx264 input continuity err: last stop %lld start %lld",
540 pv->last_stop, in->start);
542 pv->last_stop = in->stop;
544 // Remember info about this frame that we need to pass across
545 // the x264_encoder_encode call (since it reorders frames).
546 save_frame_info( pv, in );
548 /* Feed the input PTS to x264 so it can figure out proper output PTS */
549 pv->pic_in.i_pts = in->start;
551 x264_picture_t pic_out;
555 x264_encoder_encode( pv->x264, &nal, &i_nal, &pv->pic_in, &pic_out );
558 return nal_encode( w, &pic_out, i_nal, nal );
563 int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
564 hb_buffer_t ** buf_out )
566 hb_work_private_t *pv = w->private_data;
567 hb_buffer_t *in = *buf_in;
573 // EOF on input. Flush any frames still in the decoder then
574 // send the eof downstream to tell the muxer we're done.
575 x264_picture_t pic_out;
578 hb_buffer_t *last_buf = NULL;
582 x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
586 hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
589 if ( last_buf == NULL )
592 last_buf->next = buf;
596 // Flushed everything - add the eof to the end of the chain.
597 if ( last_buf == NULL )
606 // Not EOF - encode the packet & wrap it in a NAL
608 // if we're re-ordering frames, check if this frame is too large to reorder
609 if ( pv->init_delay && in->stop - in->start > pv->init_delay )
611 // This frame's duration is larger than the time allotted for b-frame
612 // reordering. That means that if it's used as a reference the decoder
613 // won't be able to move it early enough to render it in correct
614 // sequence & the playback will have odd jumps & twitches. To make
615 // sure this doesn't happen we pretend this frame is multiple
616 // frames, each with duration <= init_delay. Since each of these
617 // new frames contains the same image the visual effect is identical
618 // to the original but the resulting stream can now be coded without
619 // error. We take advantage of the fact that x264 buffers frame
620 // data internally to feed the same image into the encoder multiple
621 // times, just changing its start & stop times each time.
622 int64_t orig_stop = in->stop;
623 int64_t new_stop = in->start;
624 hb_buffer_t *last_buf = NULL;
626 // We want to spread the new frames uniformly over the total time
627 // so that we don't end up with a very short frame at the end.
628 // In the number of pieces calculation we add in init_delay-1 to
629 // round up but not add an extra piece if the frame duration is
630 // a multiple of init_delay. The final increment of frame_dur is
631 // to restore the bits that got truncated by the divide on the
632 // previous line. If we don't do this we end up with an extra tiny
633 // frame at the end whose duration is npieces-1.
634 int64_t frame_dur = orig_stop - new_stop;
635 int64_t npieces = ( frame_dur + pv->init_delay - 1 ) / pv->init_delay;
636 frame_dur /= npieces;
639 while ( in->start < orig_stop )
641 new_stop += frame_dur;
642 if ( new_stop > orig_stop )
643 new_stop = orig_stop;
645 hb_buffer_t *buf = x264_encode( w, in );
648 if ( last_buf == NULL )
651 last_buf->next = buf;
654 in->start = new_stop;
659 *buf_out = x264_encode( w, in );