]> granicus.if.org Git - libx264/commitdiff
new API function x264_encoder_delayed_frames.
authorAnton Mitrofanov <BugMaster@narod.ru>
Thu, 13 Aug 2009 21:40:21 +0000 (21:40 +0000)
committerLoren Merritt <pengvado@akuvian.org>
Thu, 13 Aug 2009 21:40:51 +0000 (21:40 +0000)
fix x264cli on streams whose total length is less than the encoder latency.

encoder/encoder.c
x264.c
x264.h

index a7d52c16c06442bc1adbdcfe82922868729f9e11..f0ac20709f81581e7a37691e2d392e7f7b872197 100644 (file)
@@ -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; i<h->param.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 f5073853d97279269faea7457f62ec97f5ccc3ef..32e65705129ddd857f58e8d72763ab0d9f475629 100644 (file)
--- 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 141624832d2010c62859d36129922a52a1c6fcac..964e093092259842dae2cb581019479e9dd26866 100644 (file)
--- a/x264.h
+++ b/x264.h
@@ -35,7 +35,7 @@
 
 #include <stdarg.h>
 
-#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