]> git.sesse.net Git - x264/commitdiff
Improve reference_invalid support
authorFiona Glaser <fiona@x264.com>
Thu, 22 Jul 2010 00:40:14 +0000 (17:40 -0700)
committerFiona Glaser <fiona@x264.com>
Thu, 22 Jul 2010 07:17:36 +0000 (00:17 -0700)
Reference invalidation can now be used to invalidate multiple frames at a time, rather than being limited to one per encoder_encode call.

common/common.h
encoder/encoder.c
x264.h

index 69e7152f8246ec6b883c66d15b19f62608460569..161f053277ecfe7df34dd36db7e6eafe509fe36f 100644 (file)
@@ -430,7 +430,6 @@ struct x264_t
     int             i_cpb_delay_lookahead;
 
     int             b_queued_intra_refresh;
-    int64_t         i_reference_invalidate_pts;
     int64_t         i_last_idr_pts;
 
     /* We use only one SPS and one PPS */
index 8b56d4df93cfe3cd1eaefe810216ffd9813af36d..983f70af3ad2e015a79b348ea9399ba5dc9cd5e8 100644 (file)
@@ -2230,7 +2230,10 @@ int x264_encoder_invalidate_reference( x264_t *h, int64_t pts )
         return -1;
     }
     h = h->thread[h->i_thread_phase];
-    h->i_reference_invalidate_pts = pts;
+    if( pts >= h->i_last_idr_pts )
+        for( int i = 0; h->frames.reference[i]; i++ )
+            if( pts <= h->frames.reference[i]->i_pts )
+                h->frames.reference[i]->b_corrupt = 1;
     return 0;
 }
 
@@ -2379,15 +2382,6 @@ int     x264_encoder_encode( x264_t *h,
             h->fenc->param->param_free( h->fenc->param );
     }
 
-    if( h->i_reference_invalidate_pts )
-    {
-        if( h->i_reference_invalidate_pts >= h->i_last_idr_pts )
-            for( int i = 0; h->frames.reference[i]; i++ )
-                if( h->i_reference_invalidate_pts <= h->frames.reference[i]->i_pts )
-                    h->frames.reference[i]->b_corrupt = 1;
-        h->i_reference_invalidate_pts = 0;
-    }
-
     if( !IS_X264_TYPE_I( h->fenc->i_type ) )
     {
         int valid_refs_left = 0;
diff --git a/x264.h b/x264.h
index 5710e64ed29931d6631dda2ff62d3136195683a2..683a0241118403ae1baa8841b4f20899d82c7965 100644 (file)
--- a/x264.h
+++ b/x264.h
@@ -744,7 +744,7 @@ void    x264_encoder_intra_refresh( x264_t * );
  *      In multi-pass encoding, if x264_encoder_invalidate_reference is called differently in each pass,
  *      behavior is undefined.
  *
- *      Should not be called during an x264_encoder_encode.
+ *      Should not be called during an x264_encoder_encode, but multiple calls can be made simultaneously.
  *
  *      Returns 0 on success, negative on failure. */
 int x264_encoder_invalidate_reference( x264_t *, int64_t pts );