From: Anton Mitrofanov Date: Thu, 13 Aug 2009 21:40:21 +0000 (+0000) Subject: new API function x264_encoder_delayed_frames. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=db724ac24e6a94c896e1bac6f4c7b5a5504ed773;p=libx264 new API function x264_encoder_delayed_frames. fix x264cli on streams whose total length is less than the encoder latency. --- diff --git a/encoder/encoder.c b/encoder/encoder.c index a7d52c16..f0ac2070 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -2137,3 +2137,20 @@ void x264_encoder_close ( x264_t *h ) x264_free( h->thread[i] ); } } + +/**************************************************************************** + * x264_encoder_delayed_frames: + ****************************************************************************/ +int x264_encoder_delayed_frames( x264_t *h ) +{ + int delayed_frames = 0; + int i; + for( i=0; iparam.i_threads; i++ ) + delayed_frames += h->thread[i]->b_thread_active; + h = h->thread[ h->i_thread_phase % h->param.i_threads ]; + for( i=0; h->frames.current[i]; i++ ) + delayed_frames++; + for( i=0; h->frames.next[i]; i++ ) + delayed_frames++; + return delayed_frames; +} diff --git a/x264.c b/x264.c index f5073853..32e65705 100644 --- a/x264.c +++ b/x264.c @@ -1192,13 +1192,14 @@ static int Encode( x264_param_t *param, cli_opt_t *opt ) fflush( stderr ); // needed in windows } } - /* Flush delayed B-frames */ - do { + /* Flush delayed frames */ + while( x264_encoder_delayed_frames( h ) ) + { i_frame_size = Encode_frame( h, opt->hout, NULL ); if( i_frame_size < 0 ) return -1; i_file += i_frame_size; - } while( i_frame_size ); + } i_end = x264_mdate(); x264_picture_clean( &pic ); diff --git a/x264.h b/x264.h index 14162483..964e0930 100644 --- a/x264.h +++ b/x264.h @@ -35,7 +35,7 @@ #include -#define X264_BUILD 70 +#define X264_BUILD 71 /* x264_t: * opaque handler for encoder */ @@ -431,5 +431,9 @@ int x264_encoder_encode ( x264_t *, x264_nal_t **, int *, x264_picture_t *, /* x264_encoder_close: * close an encoder handler */ void x264_encoder_close ( x264_t * ); +/* x264_encoder_delayed_frames: + * return the number of currently delayed (buffered) frames + * this should be used at the end of the stream, to know when you have all the encoded frames. */ +int x264_encoder_delayed_frames( x264_t * ); #endif