]> git.sesse.net Git - vlc/blobdiff - plugins/mpeg_vdec/vpar_headers.c
* ALL: got rid of p_object->p_this which is now useless.
[vlc] / plugins / mpeg_vdec / vpar_headers.c
index 8e4d214d0f4470c72cd2c7382894180c8af80c92..bb863dad786a9b2459e006e82dfd370246aa22ba 100644 (file)
@@ -2,7 +2,7 @@
  * vpar_headers.c : headers parsing
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: vpar_headers.c,v 1.17 2002/03/17 17:00:38 sam Exp $
+ * $Id: vpar_headers.c,v 1.25 2002/06/01 18:04:49 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Stéphane Borel <stef@via.ecp.fr>
 #include <stdlib.h>                                                /* free() */
 #include <string.h>                                    /* memcpy(), memset() */
 
-#include <videolan/vlc.h>
-
-#include "video.h"
-#include "video_output.h"
-
-#include "stream_control.h"
-#include "input_ext-dec.h"
+#include <vlc/vlc.h>
+#include <vlc/vout.h>
+#include <vlc/decoder.h>
 
 #include "vdec_ext-plugins.h"
+#include "video_decoder.h"
 #include "vpar_pool.h"
 #include "video_parser.h"
-#include "video_decoder.h"
 
 /*
  * Local prototypes
  */
-static __inline__ void NextStartCode( bit_stream_t * );
+static inline void NextStartCode( bit_stream_t * );
 static void SequenceHeader( vpar_thread_t * p_vpar );
 static void GroupHeader( vpar_thread_t * p_vpar );
 static void PictureHeader( vpar_thread_t * p_vpar );
@@ -117,9 +113,8 @@ u8 pi_scan[2][64] ATTR_ALIGN(16) =
 /*****************************************************************************
  * ReferenceUpdate : Update the reference pointers when we have a new picture
  *****************************************************************************/
-static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
-                                        int i_coding_type,
-                                        picture_t * p_newref )
+static void inline ReferenceUpdate( vpar_thread_t * p_vpar,
+                                    int i_coding_type, picture_t * p_newref )
 {
     if( i_coding_type != B_CODING_TYPE )
     {
@@ -150,9 +145,8 @@ static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
  * ReferenceReplace : Replace the last reference pointer when we destroy
  *                    a picture
  *****************************************************************************/
-static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
-                                         int i_coding_type,
-                                         picture_t * p_newref )
+static void inline ReferenceReplace( vpar_thread_t * p_vpar,
+                                     int i_coding_type, picture_t * p_newref )
 {
     if( i_coding_type != B_CODING_TYPE )
     {
@@ -171,8 +165,8 @@ static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
 /*****************************************************************************
  * LoadMatrix : Load a quantization matrix
  *****************************************************************************/
-static __inline__ void LoadMatrix( vpar_thread_t * p_vpar,
-                                   quant_matrix_t * p_matrix )
+static inline void LoadMatrix( vpar_thread_t * p_vpar,
+                               quant_matrix_t * p_matrix )
 {
     int i_dummy;
 
@@ -181,7 +175,7 @@ static __inline__ void LoadMatrix( vpar_thread_t * p_vpar,
         /* Allocate a piece of memory to load the matrix. */
         if( (p_matrix->pi_matrix = (u8 *)malloc( 64*sizeof(u8) )) == NULL )
         {
-            intf_ErrMsg( "vpar error: allocation error in LoadMatrix()" );
+            msg_Err( p_vpar->p_fifo, "out of memory" );
             p_vpar->p_fifo->b_error = 1;
             return;
         }
@@ -198,7 +192,7 @@ static __inline__ void LoadMatrix( vpar_thread_t * p_vpar,
 /*****************************************************************************
  * LinkMatrix : Link a quantization matrix to another
  *****************************************************************************/
-static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, u8 * pi_array )
+static inline void LinkMatrix( quant_matrix_t * p_matrix, u8 * pi_array )
 {
     if( p_matrix->b_allocated )
     {
@@ -213,7 +207,7 @@ static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, u8 * pi_array )
 /*****************************************************************************
  * ChromaToFourCC: Return a FourCC value used by the video output.
  *****************************************************************************/
-static __inline__ u64 ChromaToFourCC( int i_chroma )
+static inline u64 ChromaToFourCC( int i_chroma )
 {
     switch( i_chroma )
     {
@@ -265,22 +259,23 @@ int vpar_ParseHeader( vpar_thread_t * p_vpar )
         p_vpar->c_sequences++;
         SequenceHeader( p_vpar );
         return 0;
-        break;
 
     case GROUP_START_CODE:
         GroupHeader( p_vpar );
         return 0;
-        break;
 
     case PICTURE_START_CODE:
         PictureHeader( p_vpar );
         return 0;
-        break;
 
     case SEQUENCE_END_CODE:
-        intf_WarnMsg(3, "vpar warning: sequence end code received");
+        msg_Dbg( p_vpar->p_fifo, "sequence end code received" );
+        if( p_vpar->sequence.p_backward != NULL )
+        {
+            p_vpar->sequence.p_backward->b_force = 1;
+        }
+        ReferenceUpdate( p_vpar, I_CODING_TYPE, NULL );
         return 1;
-        break;
 
     default:
         break;
@@ -422,10 +417,10 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
     }
 
     /* check whether the input gives a particular aspect ratio */
-    if( p_vpar->p_config->p_demux_data
-         && *(int*)(p_vpar->p_config->p_demux_data) )
+    if( p_vpar->p_fifo->p_demux_data
+         && ( *(int*)(p_vpar->p_fifo->p_demux_data) & 0x7 ) )
     {
-        i_aspect = *(int*)(p_vpar->p_config->p_demux_data);
+        i_aspect = *(int*)(p_vpar->p_fifo->p_demux_data);
     }
 
     /* Store calculated aspect ratio */
@@ -491,46 +486,39 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
     /* Extension and User data */
     ExtensionAndUserData( p_vpar );
 
-    /* XXX: The vout request and fifo opening will eventually be here */
-
     /* Spawn a video output if there is none */
-    vlc_mutex_lock( &p_vout_bank->lock );
+
+    p_vpar->p_vout = vlc_object_find( p_vpar->p_fifo->p_vlc, VLC_OBJECT_VOUT,
+                                                             FIND_CHILD );
     
-    if( p_vout_bank->i_count != 0 )
+    if( p_vpar->p_vout )
     {
-        /* Take the first video output FIXME: take the best one */
-        p_vpar->p_vout = p_vout_bank->pp_vout[ 0 ];
-
         if( p_vpar->p_vout->render.i_width != p_vpar->sequence.i_width
              || p_vpar->p_vout->render.i_height != p_vpar->sequence.i_height
              || p_vpar->p_vout->render.i_chroma != ChromaToFourCC( p_vpar->sequence.i_chroma_format )
              || p_vpar->p_vout->render.i_aspect != p_vpar->sequence.i_aspect )
         {
-            p_vout_bank->pp_vout[ 0 ] = NULL;
-            p_vout_bank->i_count--;
-            vlc_mutex_unlock( &p_vout_bank->lock );
-            vout_DestroyThread( p_vpar->p_vout, NULL );
-            vlc_mutex_lock( &p_vout_bank->lock );
-
-            /* XXX: race condition here if p_vout_bank->i_count was updated */
-            if( p_vout_bank->i_count )
-            {
-                vlc_mutex_unlock( &p_vout_bank->lock );
-                intf_ErrMsg( "vpar error: can't open vout, aborting" );
-                p_vpar->p_fifo->b_error = 1;
-                return;
-            }
+            /* We are not interested in this format, close this vout */
+            vlc_object_unlink_all( p_vpar->p_vout );
+            vlc_object_release( p_vpar->p_vout );
+            vout_DestroyThread( p_vpar->p_vout );
+            p_vpar->p_vout = NULL;
+        }
+        else
+        {
+            /* This video output is cool! Hijack it. */
+            vlc_object_unlink_all( p_vpar->p_vout );
+            vlc_object_attach( p_vpar->p_vout, p_vpar->p_fifo );
+            vlc_object_release( p_vpar->p_vout );
         }
     }
 
-    if( p_vout_bank->i_count == 0 )
+    if( p_vpar->p_vout == NULL )
     {
-        intf_WarnMsg( 1, "vpar: no vout present, spawning one" );
-
-        vlc_mutex_unlock( &p_vout_bank->lock );
+        msg_Dbg( p_vpar->p_fifo, "no vout present, spawning one" );
 
-        p_vpar->p_vout = vout_CreateThread(
-                           NULL, p_vpar->sequence.i_width,
+        p_vpar->p_vout = vout_CreateThread( p_vpar->p_fifo,
+                           p_vpar->sequence.i_width,
                            p_vpar->sequence.i_height,
                            ChromaToFourCC( p_vpar->sequence.i_chroma_format ),
                            p_vpar->sequence.i_aspect );
@@ -538,18 +526,11 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
         /* Everything failed */
         if( p_vpar->p_vout == NULL )
         {
-            intf_ErrMsg( "vpar error: can't open vout, aborting" );
+            msg_Err( p_vpar->p_fifo, "cannot open vout, aborting" );
             p_vpar->p_fifo->b_error = 1;
             return;
         }
-        
-        vlc_mutex_lock( &p_vout_bank->lock );
-
-        p_vout_bank->pp_vout[ p_vout_bank->i_count ] = p_vpar->p_vout;
-        p_vout_bank->i_count++;
     }
-
-    vlc_mutex_unlock( &p_vout_bank->lock );
 }
 
 /*****************************************************************************
@@ -568,7 +549,7 @@ static void GroupHeader( vpar_thread_t * p_vpar )
 static void PictureHeader( vpar_thread_t * p_vpar )
 {
     int                 i_structure, i_previous_coding_type;
-    boolean_t           b_parsable = 0;
+    vlc_bool_t          b_parsable = 0;
 
     /* Retrieve the PTS. */
     CurrentPTS( &p_vpar->bit_stream, &p_vpar->sequence.next_pts,
@@ -692,7 +673,7 @@ static void PictureHeader( vpar_thread_t * p_vpar )
 
             p_vpar->picture.i_current_structure = 0;
 
-            intf_WarnMsg( 2, "Odd number of field pictures." );
+            msg_Warn( p_vpar->p_fifo, "odd number of field pictures" );
         }
         else
         {
@@ -843,8 +824,6 @@ static void PictureHeader( vpar_thread_t * p_vpar )
         /* Initialize values. */
         vpar_SynchroDecode( p_vpar, p_vpar->picture.i_coding_type, i_structure );
         P_picture->i_matrix_coefficients = p_vpar->sequence.i_matrix_coefficients;
-        p_vpar->picture.i_field_width = ( p_vpar->sequence.i_width
-                    << ( 1 - p_vpar->picture.b_frame_structure ) );
 
         /* Update the reference pointers. */
         ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
@@ -857,8 +836,15 @@ static void PictureHeader( vpar_thread_t * p_vpar )
         (i_structure != p_vpar->picture.i_current_structure);
     p_vpar->picture.b_current_field =
         (i_structure == BOTTOM_FIELD );
-
-    if( !p_vpar->p_config->p_stream_ctrl->b_grayscale )
+    p_vpar->picture.i_lum_stride = p_vpar->picture.p_picture->Y_PITCH
+        << ( 1 - p_vpar->picture.b_frame_structure );
+    p_vpar->picture.i_chrom_stride = p_vpar->picture.p_picture->U_PITCH
+        << ( 1 - p_vpar->picture.b_frame_structure );
+    /* We suppose the pitch is the same for U and V planes. */
+    p_vpar->picture.i_field_width = p_vpar->sequence.i_width
+        << ( 1 - p_vpar->picture.b_frame_structure );
+
+    if( !p_vpar->p_fifo->p_stream_ctrl->b_grayscale )
     {
         switch( p_vpar->sequence.i_chroma_format )
         {