]> git.sesse.net Git - vlc/blobdiff - modules/codec/libmpeg2.c
A bit of headers cleanup
[vlc] / modules / codec / libmpeg2.c
index e11fbe0b914234f0b18775bed0080566d89f7ae1..5fdeb49f4a20d736ee62ee0f7e5371ef5902deec 100644 (file)
  * Preamble
  *****************************************************************************/
 #include <vlc/vlc.h>
-#include <vlc/vout.h>
-#include <vlc/decoder.h>
+#include <vlc_vout.h>
+#include <vlc_codec.h>
 
 #include <mpeg2dec/mpeg2.h>
 
-#include "vout_synchro.h"
+#include <vlc_vout_synchro.h>
 
 /* Aspect ratio (ISO/IEC 13818-2 section 6.3.3, table 6-3) */
 #define AR_SQUARE_PICTURE       1                           /* square pixels */
@@ -64,8 +64,9 @@ struct decoder_sys_t
     vlc_bool_t       b_after_sequence_header; /* is it the next frame after
                                                * the sequence header ?    */
     vlc_bool_t       b_slice_i;             /* intra-slice refresh stream */
+    vlc_bool_t       b_second_field;
 
-    vlc_bool_t      b_preroll;
+    vlc_bool_t       b_preroll;
 
     /*
      * Output properties
@@ -116,6 +117,7 @@ static int OpenDecoder( vlc_object_t *p_this )
         p_dec->fmt_in.i_codec != VLC_FOURCC('P','I','M','1') &&
         /* ATI Video */
         p_dec->fmt_in.i_codec != VLC_FOURCC('V','C','R','2') &&
+        p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','2','v') &&
         p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','2') &&
         p_dec->fmt_in.i_codec != VLC_FOURCC('h','d','v','2') )
     {
@@ -142,27 +144,28 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_sys->p_picture_to_destroy = NULL;
     p_sys->b_garbage_pic = 0;
     p_sys->b_slice_i  = 0;
+    p_sys->b_second_field = 0;
     p_sys->b_skip     = 0;
     p_sys->b_preroll = VLC_FALSE;
 
 #if defined( __i386__ ) || defined( __x86_64__ )
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMX )
+    if( p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMX )
     {
         i_accel |= MPEG2_ACCEL_X86_MMX;
     }
 
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW )
+    if( p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_3DNOW )
     {
         i_accel |= MPEG2_ACCEL_X86_3DNOW;
     }
 
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT )
+    if( p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMXEXT )
     {
         i_accel |= MPEG2_ACCEL_X86_MMXEXT;
     }
 
-#elif defined( __powerpc__ ) || defined( SYS_DARWIN )
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_ALTIVEC )
+#elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ )
+    if( p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_ALTIVEC )
     {
         i_accel |= MPEG2_ACCEL_PPC_ALTIVEC;
     }
@@ -240,6 +243,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                     if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )
                         break;
                     mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
+                    mpeg2_stride( p_sys->p_mpeg2dec, p_pic->format.i_width );
                 }
                 p_sys->p_picture_to_destroy = p_pic;
 
@@ -316,6 +320,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             }
 
             mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
+            mpeg2_stride( p_sys->p_mpeg2dec, p_pic->format.i_width );
 
             /* This picture will never go through display_picture. */
             p_pic->date = 0;
@@ -336,20 +341,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         break;
 
         case STATE_PICTURE_2ND:
-            vout_SynchroNewPicture( p_sys->p_synchro,
-                p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE,
-                p_sys->p_info->current_picture->nb_fields,
-                0, 0, p_sys->i_current_rate,
-                p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
-
-            if( p_sys->b_skip )
-            {
-                vout_SynchroTrash( p_sys->p_synchro );
-            }
-            else
-            {
-                vout_SynchroDecode( p_sys->p_synchro );
-            }
+            p_sys->b_second_field = 1;
             break;
 
         case STATE_PICTURE:
@@ -405,8 +397,15 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                   p_sys->i_current_dts : p_sys->i_previous_dts ) : 0;
 #endif
 
+            /* If nb_fields == 1, it is a field picture, and it will be
+             * followed by another field picture for which we won't call
+             * vout_SynchroNewPicture() because this would have other 
+             * problems, so we take it into account here.
+             * This kind of sucks, but I didn't think better. --Meuuh
+             */
             vout_SynchroNewPicture( p_sys->p_synchro,
                 p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE,
+                p_sys->p_info->current_picture->nb_fields == 1 ? 2 :
                 p_sys->p_info->current_picture->nb_fields, i_pts, i_dts,
                 p_sys->i_current_rate,
                 p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
@@ -439,6 +438,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 }
 
                 mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
+                mpeg2_stride( p_sys->p_mpeg2dec, p_pic->format.i_width );
             }
         }
         break;
@@ -520,6 +520,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )
                     break;
                 mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
+                mpeg2_stride( p_sys->p_mpeg2dec, p_pic->format.i_width );
             }
             p_sys->p_picture_to_destroy = p_pic;