]> git.sesse.net Git - vlc/blobdiff - src/video_decoder/vpar_blocks.c
Fixed a stupid bug in buffer management with field pictures.
[vlc] / src / video_decoder / vpar_blocks.c
index 08af1417e2429a18ca189d3694288f1d34312796..42734fb9953efab2ccfa6104aa4a02bda67e05d6 100644 (file)
@@ -2,7 +2,7 @@
  * vpar_blocks.c : blocks parsing
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: vpar_blocks.c,v 1.1 2001/07/16 16:39:00 massiot Exp $
+ * $Id: vpar_blocks.c,v 1.4 2001/07/18 17:05:39 massiot Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Jean-Marc Dressler <polux@via.ecp.fr>
 #include "video.h"
 #include "video_output.h"
 
-#include "video_decoder.h"
-#include "vdec_motion.h"
-
-#include "vpar_blocks.h"
-#include "vpar_headers.h"
-#include "vpar_synchro.h"
+#include "vdec_ext-plugins.h"
+#include "vpar_pool.h"
 #include "video_parser.h"
-#include "video_fifo.h"
 
 /*
  * Welcome to vpar_blocks.c ! Here's where the heavy processor-critical parsing
@@ -1352,6 +1347,9 @@ static __inline__ void MotionVector( vpar_thread_t * p_vpar,
         }
 
         /* Dual Prime Arithmetic (ISO/IEC 13818-2 section 7.6.3.6). */
+        /* FIXME */
+        intf_Msg( "Your stream uses Dual Prime Arithmetic. Please send a mail"
+                  "to massiot@via.ecp.fr for debugging purposes. Thank you." );
 
 #define i_mv_x  p_mb->pppi_motion_vectors[0][0][0]
         if( i_structure == FRAME_STRUCTURE )
@@ -1644,14 +1642,7 @@ static __inline__ void SkippedMacroblock( vpar_thread_t * p_vpar, int i_mb,
         return;
     }
 
-    if( (p_mb = vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
-    {
-        /* b_die == 1 */
-        return;
-    }
-#ifdef VDEC_SMP
-    p_vpar->picture.pp_mb[i_mb_base + i_mb] = p_mb;
-#endif
+    p_mb = p_vpar->pool.pf_new_mb( &p_vpar->pool );
 
     InitMacroblock( p_vpar, p_mb, i_coding_type, i_structure );
 
@@ -1679,10 +1670,8 @@ static __inline__ void SkippedMacroblock( vpar_thread_t * p_vpar, int i_mb,
 
     UpdateContext( p_vpar, i_structure );
 
-#ifndef VDEC_SMP
     /* Decode the macroblock NOW ! */
-    vpar_DecodeMacroblock ( &p_vpar->vfifo, p_mb );
-#endif
+    p_vpar->pool.pf_decode_mb( &p_vpar->pool, p_mb );
 }
 
 /*****************************************************************************
@@ -1776,7 +1765,7 @@ static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
 if( p_vpar->picture.b_error )                                           \
 {                                                                       \
     /* Go to the next slice. */                                         \
-    vpar_FreeMacroblock( &p_vpar->vfifo, p_mb );                        \
+    p_vpar->pool.pf_free_mb( &p_vpar->pool, p_mb );                     \
     return;                                                             \
 }
 
@@ -1830,14 +1819,7 @@ static __inline__ void ParseMacroblock(
     }
 
     /* Get a macroblock structure. */
-    if( (p_mb = vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
-    {
-        /* b_die == 1 */
-        return;
-    }
-#ifdef VDEC_SMP
-    p_vpar->picture.pp_mb[i_mb_base + *pi_mb_address] = p_mb;
-#endif
+    p_mb = p_vpar->pool.pf_new_mb( &p_vpar->pool );
 
     InitMacroblock( p_vpar, p_mb, i_coding_type, i_structure );
 
@@ -1960,24 +1942,27 @@ static __inline__ void ParseMacroblock(
          * Effectively decode blocks.
          */
         if( b_mpeg2 )
+        {
             DecodeMPEG2IntraMB( p_vpar, p_mb );
+        }
         else
+        {
             DecodeMPEG1IntraMB( p_vpar, p_mb );
+        }
         PARSEERROR
     }
 
     if( !p_vpar->picture.b_error )
     {
         UpdateContext( p_vpar, i_structure );
-#ifndef VDEC_SMP
+
         /* Decode the macroblock NOW ! */
-        vpar_DecodeMacroblock ( &p_vpar->vfifo, p_mb );
-#endif
+        p_vpar->pool.pf_decode_mb( &p_vpar->pool, p_mb );
     }
     else
     {
         /* Go to the next slice. */
-        vpar_FreeMacroblock( &p_vpar->vfifo, p_mb );
+        p_vpar->pool.pf_free_mb( &p_vpar->pool, p_mb );
     }
 }
 
@@ -2090,7 +2075,7 @@ static __inline__ void vpar_PictureData( vpar_thread_t * p_vpar,
     }
 
 #if 0
-    /* Buggy */
+    /* BUGGY */
     /* Try to recover from error. If we missed less than half the
      * number of macroblocks of the picture, mark the missed ones
      * as skipped. */