]> git.sesse.net Git - vlc/blobdiff - src/video_parser/vpar_headers.c
* Coding style fixes here and there.
[vlc] / src / video_parser / vpar_headers.c
index 9de90abbba7714a18ba2586f0fd89c619d32276b..74b2e8dfb708bdc436772938b690a126c48a1d6b 100644 (file)
@@ -2,7 +2,7 @@
  * vpar_headers.c : headers parsing
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: vpar_headers.c,v 1.75 2001/01/21 01:36:26 massiot Exp $
+ * $Id: vpar_headers.c,v 1.82 2001/04/28 03:36:26 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Stéphane Borel <stef@via.ecp.fr>
 #include "defs.h"
 
 #include <stdlib.h>                                                /* free() */
+#include <string.h>                                    /* memcpy(), memset() */
 
 #include "config.h"
 #include "common.h"
 #include "threads.h"
 #include "mtime.h"
-#include "plugins.h"
 
 #include "intf_msg.h"
 
@@ -283,6 +283,7 @@ int vpar_ParseHeader( vpar_thread_t * p_vpar )
             break;
 
         default:
+            break;
         }
     }
 
@@ -343,7 +344,7 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
                     p_vpar->pi_default_intra_quant );
     }
 
-    if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */
+    if( GetBits(&p_vpar->bit_stream, 1) ) /* load_non_intra_quantizer_matrix */
     {
         LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
     }
@@ -380,7 +381,8 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
         p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
         p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
         p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
-        /* bit_rate_extension, marker_bit, vbv_buffer_size_extension, low_delay */
+        /* bit_rate_extension, marker_bit, vbv_buffer_size_extension,
+         * low_delay */
         RemoveBits( &p_vpar->bit_stream, 22 );
         /* frame_rate_extension_n */
         i_dummy = GetBits( &p_vpar->bit_stream, 2 );
@@ -470,6 +472,28 @@ static void PictureHeader( vpar_thread_t * p_vpar )
     int                 i_mb;
 #endif
 
+    /* Recover in case of stream discontinuity. */
+    if( p_vpar->sequence.b_expect_discontinuity )
+    {
+        ReferenceUpdate( p_vpar, I_CODING_TYPE, NULL );
+        ReferenceUpdate( p_vpar, I_CODING_TYPE, NULL );
+        if( p_vpar->picture.p_picture != NULL )
+        {
+#ifdef VDEC_SMP
+            int     i_mb;
+
+            for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
+            {
+                vpar_DestroyMacroblock( &p_vpar->vfifo,
+                                        p_vpar->picture.pp_mb[i_mb] );
+            }
+#endif
+            vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
+        }
+        p_vpar->sequence.b_expect_discontinuity = 0;
+    }
+
+    /* Parse the picture header. */
     RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
     p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
     RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
@@ -540,8 +564,7 @@ static void PictureHeader( vpar_thread_t * p_vpar )
         p_vpar->picture.b_q_scale_type = 0;
         p_vpar->picture.b_intra_vlc_format = 0;
         p_vpar->picture.b_alternate_scan = 0; /* zigzag */
-        p_vpar->picture.b_repeat_first_field = 1; /* FIXME! this contradicts
-                                                   * ISO/IEC */
+        p_vpar->picture.b_repeat_first_field = 0;
         p_vpar->picture.b_progressive = 1;
     }
 
@@ -572,7 +595,7 @@ static void PictureHeader( vpar_thread_t * p_vpar )
 
         p_vpar->picture.i_current_structure = 0;
 
-        intf_ErrMsg("vpar error: odd number of field pictures.");
+        intf_WarnMsg( 2, "Odd number of field pictures." );
     }
 
     /* Do we have the reference pictures ? */
@@ -597,11 +620,11 @@ static void PictureHeader( vpar_thread_t * p_vpar )
         int     i_repeat_field;
 
         /* Compute the number of times the frame will be emitted by the
-         * decoder (number of periods). */
+         * decoder (number of half-periods). */
         if( p_vpar->sequence.b_progressive )
         {
-            i_repeat_field = 1 + p_vpar->picture.b_repeat_first_field
-                               + p_vpar->picture.b_top_field_first;
+            i_repeat_field = (1 + p_vpar->picture.b_repeat_first_field
+                                + p_vpar->picture.b_top_field_first) * 2;
         }
         else
         {
@@ -671,7 +694,7 @@ static void PictureHeader( vpar_thread_t * p_vpar )
     {
         /* This is a new frame. Get a structure from the video_output. */
         while( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
-                                        99+p_vpar->sequence.i_chroma_format, /*XXX??*/
+                              /* XXX */ 99+p_vpar->sequence.i_chroma_format,
                                         p_vpar->sequence.i_width,
                                         p_vpar->sequence.i_height ) )
              == NULL )
@@ -705,7 +728,8 @@ static void PictureHeader( vpar_thread_t * p_vpar )
 
 #ifdef VDEC_SMP
         /* Link referenced pictures for the decoder
-         * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
+         * They are unlinked in vpar_ReleaseMacroblock() &
+         * vpar_DestroyMacroblock() */
         if( p_vpar->picture.i_coding_type == P_CODING_TYPE ||
             p_vpar->picture.i_coding_type == B_CODING_TYPE )
         {
@@ -890,6 +914,7 @@ static void ExtensionAndUserData( vpar_thread_t * p_vpar )
                 CopyrightExtension( p_vpar );
                 break;
             default:
+                break;
             }
             break;