]> git.sesse.net Git - vlc/commitdiff
x264: place SEI in start of first block, also copy all nals at once
authorIlkka Ollakka <ileoo@videolan.org>
Sat, 3 Sep 2011 15:47:41 +0000 (18:47 +0300)
committerIlkka Ollakka <ileoo@videolan.org>
Sat, 3 Sep 2011 15:49:54 +0000 (18:49 +0300)
libavcodec seems to do the same and didn't actually found a reaso earlier
patch did what it did. Copying nals helps if you do slices, so it doesn't
do one nal at a time.

modules/codec/x264.c

index ae3247e07ac8c2245cdadd608211098c949b382d..967f2ef9d8344a663eff5c29f4e70eaaf4804d64 100644 (file)
@@ -1366,28 +1366,24 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
 
 
     /* Get size of block we need */
 
 
     /* Get size of block we need */
-    i_out = p_sys->i_sei_size;
     for( i = 0; i < i_nal; i++ )
         i_out += nal[i].i_payload;
 
     for( i = 0; i < i_nal; i++ )
         i_out += nal[i].i_payload;
 
-    p_block = block_New( p_enc, i_out );
+    p_block = block_New( p_enc, i_out + p_sys->i_sei_size );
     if( !p_block ) return NULL;
 
     if( !p_block ) return NULL;
 
-    /* copy encoded data directly to block */
-    for( i = 0, i_out = 0; i < i_nal; i++ )
+    unsigned int i_offset = 0;
+    if( unlikely( p_sys->i_sei_size && ( i_nal > 1 ) ) )
     {
     {
-        if( p_sys->i_sei_size && nal[i].i_type == NAL_SLICE )
-        {
-            /* insert x264 headers SEI nal before first SLICE nal */
-            memcpy( p_block->p_buffer, p_sys->p_sei, p_sys->i_sei_size );
-            i_out += p_sys->i_sei_size;
-            p_sys->i_sei_size = 0;
-            free( p_sys->p_sei );
-            p_sys->p_sei = NULL;
-        }
-        memcpy( p_block->p_buffer + i_out, nal[i].p_payload, nal[i].i_payload );
-        i_out += nal[i].i_payload;
+       /* insert x264 headers SEI nal into the first picture block at the start */
+       memcpy( p_block->p_buffer, p_sys->p_sei, p_sys->i_sei_size );
+       i_offset = p_sys->i_sei_size;
+       p_sys->i_sei_size = 0;
+       free( p_sys->p_sei );
+       p_sys->p_sei = NULL;
     }
     }
+    /* copy encoded data directly to block */
+    memcpy( p_block->p_buffer + i_offset, nal[0].p_payload, i_out );
 
     if( pic.b_keyframe )
         p_block->i_flags |= BLOCK_FLAG_TYPE_I;
 
     if( pic.b_keyframe )
         p_block->i_flags |= BLOCK_FLAG_TYPE_I;