[x264-devel] commit: Use short startcodes whenever possible (Jason Garrett-Glaser )

git version control git at videolan.org
Tue Feb 23 11:05:37 CET 2010


x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Sun Feb 21 17:30:52 2010 -0800| [6823cbc5359981ff2d7a9c538b9e8f861b9cf36c] | committer: Jason Garrett-Glaser 

Use short startcodes whenever possible
Saves one byte per frame for every slice beyond the first.
Only applies to Annex-B output mode.

> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=6823cbc5359981ff2d7a9c538b9e8f861b9cf36c
---

 common/common.c   |    6 +++---
 common/common.h   |    2 +-
 encoder/encoder.c |   12 +++++++++---
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/common/common.c b/common/common.c
index 2faf139..0410588 100644
--- a/common/common.c
+++ b/common/common.c
@@ -985,17 +985,17 @@ void x264_picture_clean( x264_picture_t *pic )
 /****************************************************************************
  * x264_nal_encode:
  ****************************************************************************/
-int x264_nal_encode( uint8_t *dst, int b_annexb, x264_nal_t *nal )
+int x264_nal_encode( uint8_t *dst, x264_nal_t *nal, int b_annexb, int b_long_startcode )
 {
     uint8_t *src = nal->p_payload;
     uint8_t *end = nal->p_payload + nal->i_payload;
     uint8_t *orig_dst = dst;
     int i_count = 0, size;
 
-    /* long nal start code (we always use long ones) */
     if( b_annexb )
     {
-        *dst++ = 0x00;
+        if( b_long_startcode )
+            *dst++ = 0x00;
         *dst++ = 0x00;
         *dst++ = 0x00;
         *dst++ = 0x01;
diff --git a/common/common.h b/common/common.h
index 18c172e..d69ce65 100644
--- a/common/common.h
+++ b/common/common.h
@@ -121,7 +121,7 @@ int64_t x264_mdate( void );
  * the encoding options */
 char *x264_param2string( x264_param_t *p, int b_res );
 
-int x264_nal_encode( uint8_t *dst, int b_annexb, x264_nal_t *nal );
+int x264_nal_encode( uint8_t *dst, x264_nal_t *nal, int b_annexb, int b_long_startcode );
 
 /* log */
 void x264_log( x264_t *h, int i_level, const char *psz_fmt, ... );
diff --git a/encoder/encoder.c b/encoder/encoder.c
index 89bf457..c76938c 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -1228,10 +1228,14 @@ static int x264_encoder_encapsulate_nals( x264_t *h )
     }
 
     uint8_t *nal_buffer = h->nal_buffer;
+    int long_startcode = 1;
 
     for( i = 0; i < h->out.i_nal; i++ )
     {
-        int size = x264_nal_encode( nal_buffer, h->param.b_annexb, &h->out.nal[i] );
+        int size = x264_nal_encode( nal_buffer, &h->out.nal[i], h->param.b_annexb, long_startcode );
+        /* Don't use long startcodes for any slice beyond the first. */
+        if( h->out.nal[i].i_type >= NAL_SLICE && h->out.nal[i].i_type <= NAL_SLICE_IDR )
+            long_startcode = 0;
         h->out.nal[i].i_payload = size;
         h->out.nal[i].p_payload = nal_buffer;
         nal_buffer += size;
@@ -1715,8 +1719,10 @@ static int x264_slice_write( x264_t *h )
     bs_t bs_bak;
     x264_cabac_t cabac_bak;
     uint8_t cabac_prevbyte_bak = 0; /* Shut up GCC. */
-    /* Assume no more than 3 bytes of NALU escaping. */
-    int slice_max_size = h->param.i_slice_max_size > 0 ? (h->param.i_slice_max_size-3-NALU_OVERHEAD)*8 : INT_MAX;
+    /* Assume no more than 3 bytes of NALU escaping.
+     * Slices other than the first use a 3-byte startcode. */
+    int overhead_guess = (NALU_OVERHEAD - (h->param.b_annexb && h->sh.i_first_mb)) + 3;
+    int slice_max_size = h->param.i_slice_max_size > 0 ? (h->param.i_slice_max_size-overhead_guess)*8 : INT_MAX;
     int starting_bits = bs_pos(&h->out.bs);
     bs_realign( &h->out.bs );
 



More information about the x264-devel mailing list