[vlc-devel] commit: Fixed syntax for VC1 coming from some ASF (packetizer). ( Laurent Aimar )

git version control git at videolan.org
Thu Apr 30 22:19:22 CEST 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Tue Apr 28 23:04:35 2009 +0200| [553ed2287158f9dc8c054df2894cd3a47a932830] | committer: Laurent Aimar 

Fixed syntax for VC1 coming from some ASF (packetizer).

The sequence header/entry point are not repeated yet.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=553ed2287158f9dc8c054df2894cd3a47a932830
---

 modules/packetizer/vc1.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/modules/packetizer/vc1.c b/modules/packetizer/vc1.c
index 3bd126e..d5f6c63 100644
--- a/modules/packetizer/vc1.c
+++ b/modules/packetizer/vc1.c
@@ -89,6 +89,7 @@ struct decoder_sys_t
 
 
     mtime_t i_interpolated_dts;
+    bool    b_check_startcode;
 };
 
 typedef enum
@@ -151,6 +152,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->pp_last = &p_sys->p_frame;
 
     p_sys->i_interpolated_dts = -1;
+    p_sys->b_check_startcode = p_dec->fmt_in.b_packetized;
 
     if( p_dec->fmt_out.i_extra > 0 )
     {
@@ -193,7 +195,37 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    return packetizer_Packetize( &p_sys->packetizer, pp_block );
+    if( p_sys->b_check_startcode && pp_block && *pp_block )
+    {
+        /* Fix syntax for (some?) VC1 from asf */
+        const int i_startcode = sizeof(p_vc1_startcode);
+
+        block_t *p_block = *pp_block;
+        if( p_block->i_buffer > 0 &&
+            ( p_block->i_buffer < i_startcode ||
+              memcmp( p_block->p_buffer, p_vc1_startcode, i_startcode ) ) )
+        {
+            *pp_block = p_block = block_Realloc( p_block, i_startcode+1, p_block->i_buffer );
+            if( p_block )
+            {
+                memcpy( p_block->p_buffer, p_vc1_startcode, i_startcode );
+
+                if( p_sys->b_sequence_header && p_sys->sh.b_interlaced &&
+                    p_block->i_buffer > i_startcode+1 &&
+                    (p_block->p_buffer[i_startcode+1] & 0xc0) == 0xc0 )
+                    p_block->p_buffer[i_startcode] = IDU_TYPE_FIELD;
+                else
+                    p_block->p_buffer[i_startcode] = IDU_TYPE_FRAME;
+            }
+        }
+        p_sys->b_check_startcode = false;
+    }
+
+    block_t *p_au = packetizer_Packetize( &p_sys->packetizer, pp_block );
+    if( !p_au )
+        p_sys->b_check_startcode = p_dec->fmt_in.b_packetized;
+
+    return p_au;
 }
 
 static void PacketizeReset( void *p_private, bool b_broken )




More information about the vlc-devel mailing list