]> git.sesse.net Git - vlc/blobdiff - modules/codec/libmpeg2.c
Missing item to translate.
[vlc] / modules / codec / libmpeg2.c
index 24ae6cc8497c9765fe9bf874e687bbc9519f81ca..13ec4c512a79b7a56c3e5c6e9c826636b7f715bd 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <vlc/vlc.h>
-#include <vlc/vout.h>
-#include <vlc/decoder.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_vout.h>
+#include <vlc_codec.h>
 
-#include <mpeg2dec/mpeg2.h>
+#include <mpeg2.h>
 
-#include "vout_synchro.h"
+#include <vlc_codec_synchro.h>
 
 /* Aspect ratio (ISO/IEC 13818-2 section 6.3.3, table 6-3) */
 #define AR_SQUARE_PICTURE       1                           /* square pixels */
-#define AR_3_4_PICTURE          2                        /* 3:4 picture (TV) */
+#define AR_4_3_PICTURE          2                        /* 4:3 picture (TV) */
 #define AR_16_9_PICTURE         3              /* 16:9 picture (wide screen) */
 #define AR_221_1_PICTURE        4                  /* 2.21:1 picture (movie) */
 
@@ -49,7 +54,7 @@ struct decoder_sys_t
      */
     mpeg2dec_t          *p_mpeg2dec;
     const mpeg2_info_t  *p_info;
-    vlc_bool_t          b_skip;
+    bool                b_skip;
 
     /*
      * Input properties
@@ -60,17 +65,18 @@ struct decoder_sys_t
     mtime_t          i_current_dts;
     int              i_current_rate;
     picture_t *      p_picture_to_destroy;
-    vlc_bool_t       b_garbage_pic;
-    vlc_bool_t       b_after_sequence_header; /* is it the next frame after
+    bool             b_garbage_pic;
+    bool             b_after_sequence_header; /* is it the next frame after
                                                * the sequence header ?    */
-    vlc_bool_t       b_slice_i;             /* intra-slice refresh stream */
+    bool             b_slice_i;             /* intra-slice refresh stream */
+    bool             b_second_field;
 
-    vlc_bool_t      b_preroll;
+    bool             b_preroll;
 
     /*
      * Output properties
      */
-    vout_synchro_t *p_synchro;
+    decoder_synchro_t *p_synchro;
     int            i_aspect;
     int            i_sar_num;
     int            i_sar_den;
@@ -93,7 +99,7 @@ static void GetAR( decoder_t *p_dec );
  * Module descriptor
  *****************************************************************************/
 vlc_module_begin();
-    set_description( _("MPEG I/II video decoder (using libmpeg2)") );
+    set_description( N_("MPEG I/II video decoder (using libmpeg2)") );
     set_capability( "decoder", 150 );
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_VCODEC );
@@ -114,8 +120,7 @@ static int OpenDecoder( vlc_object_t *p_this )
         p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','1') &&
         /* Pinnacle hardware-mpeg1 */
         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') )
     {
@@ -125,10 +130,7 @@ static int OpenDecoder( vlc_object_t *p_this )
     /* Allocate the memory needed to store the decoder's structure */
     if( ( p_dec->p_sys = p_sys =
           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
-    {
-        msg_Err( p_dec, "out of memory" );
-        return VLC_EGENERIC;
-    }
+        return VLC_ENOMEM;
 
     /* Initialize the thread properties */
     memset( p_sys, 0, sizeof(decoder_sys_t) );
@@ -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;
+    p_sys->b_preroll = false;
 
 #if defined( __i386__ ) || defined( __x86_64__ )
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMX )
+    if( vlc_CPU() & CPU_CAPABILITY_MMX )
     {
         i_accel |= MPEG2_ACCEL_X86_MMX;
     }
 
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW )
+    if( vlc_CPU() & CPU_CAPABILITY_3DNOW )
     {
         i_accel |= MPEG2_ACCEL_X86_3DNOW;
     }
 
-    if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT )
+    if( vlc_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( vlc_CPU() & CPU_CAPABILITY_ALTIVEC )
     {
         i_accel |= MPEG2_ACCEL_PPC_ALTIVEC;
     }
@@ -226,7 +229,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 p_sys->p_info->sequence &&
                 p_sys->p_info->sequence->width != (unsigned)-1 )
             {
-                vout_SynchroReset( p_sys->p_synchro );
+                decoder_SynchroReset( p_sys->p_synchro );
                 if( p_sys->p_info->current_fbuf != NULL
                     && p_sys->p_info->current_fbuf->id != NULL )
                 {
@@ -240,28 +243,29 @@ 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->p[Y_PLANE].i_pitch );
                 }
                 p_sys->p_picture_to_destroy = p_pic;
 
                 if ( p_sys->b_slice_i )
                 {
-                    vout_SynchroNewPicture( p_sys->p_synchro,
+                    decoder_SynchroNewPicture( p_sys->p_synchro,
                         I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate,
                         p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
-                    vout_SynchroDecode( p_sys->p_synchro );
-                    vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
+                    decoder_SynchroDecode( p_sys->p_synchro );
+                    decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
                 }
             }
 
             if( p_block->i_flags & BLOCK_FLAG_PREROLL )
             {
-                p_sys->b_preroll = VLC_TRUE;
+                p_sys->b_preroll = true;
             }
             else if( p_sys->b_preroll )
             {
-                p_sys->b_preroll = VLC_FALSE;
+                p_sys->b_preroll = false;
                 /* Reset synchro */
-                vout_SynchroReset( p_sys->p_synchro );
+                decoder_SynchroReset( p_sys->p_synchro );
             }
 
 #ifdef PIC_FLAG_PTS
@@ -290,7 +294,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             p_block->i_buffer = 0;
             break;
 
-#ifdef STATE_SEQUENCE_MODIFIED
+#if MPEG2_RELEASE >= MPEG2_VERSION (0, 5, 0)
+
         case STATE_SEQUENCE_MODIFIED:
             GetAR( p_dec );
             break;
@@ -316,6 +321,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->p[Y_PLANE].i_pitch );
 
             /* This picture will never go through display_picture. */
             p_pic->date = 0;
@@ -326,9 +332,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
             if( p_sys->p_synchro )
             {
-                vout_SynchroRelease( p_sys->p_synchro );
+                decoder_SynchroRelease( p_sys->p_synchro );
             }
-            p_sys->p_synchro = vout_SynchroInit( p_dec,
+            p_sys->p_synchro = decoder_SynchroInit( p_dec,
                 (uint32_t)((uint64_t)1001000000 * 27 /
                 p_sys->p_info->sequence->frame_period) );
             p_sys->b_after_sequence_header = 1;
@@ -336,20 +342,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:
@@ -364,11 +357,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             {
                 /* Intra-slice refresh. Simulate a blank I picture. */
                 msg_Dbg( p_dec, "intra-slice refresh stream" );
-                vout_SynchroNewPicture( p_sys->p_synchro,
+                decoder_SynchroNewPicture( p_sys->p_synchro,
                     I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate,
                     p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
-                vout_SynchroDecode( p_sys->p_synchro );
-                vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
+                decoder_SynchroDecode( p_sys->p_synchro );
+                decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
                 p_sys->b_slice_i = 1;
             }
             p_sys->b_after_sequence_header = 0;
@@ -405,8 +398,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
 
-            vout_SynchroNewPicture( p_sys->p_synchro,
+            /* If nb_fields == 1, it is a field picture, and it will be
+             * followed by another field picture for which we won't call
+             * decoder_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
+             */
+            decoder_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 );
@@ -415,7 +415,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 !(p_sys->b_slice_i
                    && ((p_sys->p_info->current_picture->flags
                          & PIC_MASK_CODING_TYPE) == P_CODING_TYPE))
-                   && !vout_SynchroChoose( p_sys->p_synchro,
+                   && !decoder_SynchroChoose( p_sys->p_synchro,
                               p_sys->p_info->current_picture->flags
                                 & PIC_MASK_CODING_TYPE,
                               /*p_sys->p_vout->render_time*/ 0 /*FIXME*/,
@@ -423,14 +423,14 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             {
                 mpeg2_skip( p_sys->p_mpeg2dec, 1 );
                 p_sys->b_skip = 1;
-                vout_SynchroTrash( p_sys->p_synchro );
+                decoder_SynchroTrash( p_sys->p_synchro );
                 mpeg2_set_buf( p_sys->p_mpeg2dec, buf, NULL );
             }
             else
             {
                 mpeg2_skip( p_sys->p_mpeg2dec, 0 );
                 p_sys->b_skip = 0;
-                vout_SynchroDecode( p_sys->p_synchro );
+                decoder_SynchroDecode( p_sys->p_synchro );
 
                 if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )
                 {
@@ -439,6 +439,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->p[Y_PLANE].i_pitch );
             }
         }
         break;
@@ -451,7 +452,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             {
                 p_pic = (picture_t *)p_sys->p_info->display_fbuf->id;
 
-                vout_SynchroEnd( p_sys->p_synchro,
+                decoder_SynchroEnd( p_sys->p_synchro,
                             p_sys->p_info->display_picture->flags
                              & PIC_MASK_CODING_TYPE,
                             p_sys->b_garbage_pic );
@@ -459,7 +460,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
                 if ( p_sys->p_picture_to_destroy != p_pic )
                 {
-                    p_pic->date = vout_SynchroDate( p_sys->p_synchro );
+                    p_pic->date = decoder_SynchroDate( p_sys->p_synchro );
                 }
                 else
                 {
@@ -476,7 +477,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             }
 
             /* For still frames */
-            if( state == STATE_END && p_pic ) p_pic->b_force = VLC_TRUE;
+            if( state == STATE_END && p_pic ) p_pic->b_force = true;
 
             if( p_pic )
             {
@@ -500,7 +501,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                ( ( p_sys->p_info->current_picture->flags &
                    PIC_MASK_CODING_TYPE) != B_CODING_TYPE ) )
             {
-                if( p_sys->p_synchro ) vout_SynchroReset( p_sys->p_synchro );
+                if( p_sys->p_synchro ) decoder_SynchroReset( p_sys->p_synchro );
             }
             mpeg2_skip( p_sys->p_mpeg2dec, 1 );
             p_sys->b_skip = 1;
@@ -520,6 +521,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->p[Y_PLANE].i_pitch );
             }
             p_sys->p_picture_to_destroy = p_pic;
 
@@ -535,11 +537,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
             if( p_sys->b_slice_i )
             {
-                vout_SynchroNewPicture( p_sys->p_synchro,
+                decoder_SynchroNewPicture( p_sys->p_synchro,
                         I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate,
                         p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );
-                vout_SynchroDecode( p_sys->p_synchro );
-                vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
+                decoder_SynchroDecode( p_sys->p_synchro );
+                decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );
             }
             break;
         }
@@ -561,7 +563,7 @@ static void CloseDecoder( vlc_object_t *p_this )
     decoder_t *p_dec = (decoder_t *)p_this;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    if( p_sys->p_synchro ) vout_SynchroRelease( p_sys->p_synchro );
+    if( p_sys->p_synchro ) decoder_SynchroRelease( p_sys->p_synchro );
 
     if( p_sys->p_mpeg2dec ) mpeg2_close( p_sys->p_mpeg2dec );
 
@@ -625,35 +627,34 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
  *****************************************************************************/
 static void GetAR( decoder_t *p_dec )
 {
-    decoder_sys_t   *p_sys = p_dec->p_sys;
+    decoder_sys_t *p_sys = p_dec->p_sys;
 
     /* Check whether the input gave a particular aspect ratio */
     if( p_dec->fmt_in.video.i_aspect )
     {
-        /* AR is relative to width/height, not display_width/height */
         p_sys->i_aspect = p_dec->fmt_in.video.i_aspect;
         if( p_sys->i_aspect <= AR_221_1_PICTURE )
         switch( p_sys->i_aspect )
         {
-        case AR_3_4_PICTURE:
+        case AR_4_3_PICTURE:
             p_sys->i_aspect = VOUT_ASPECT_FACTOR * 4 / 3;
-            p_sys->i_sar_num = p_sys->p_info->sequence->height * 4;
-            p_sys->i_sar_den = p_sys->p_info->sequence->width * 3;
+            p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 4;
+            p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 3;
             break;
         case AR_16_9_PICTURE:
             p_sys->i_aspect = VOUT_ASPECT_FACTOR * 16 / 9;
-            p_sys->i_sar_num = p_sys->p_info->sequence->height * 16;
-            p_sys->i_sar_den = p_sys->p_info->sequence->width * 9;
+            p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 16;
+            p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 9;
             break;
         case AR_221_1_PICTURE:
             p_sys->i_aspect = VOUT_ASPECT_FACTOR * 221 / 100;
-            p_sys->i_sar_num = p_sys->p_info->sequence->height * 221;
-            p_sys->i_sar_den = p_sys->p_info->sequence->width * 100;
+            p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 221;
+            p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 100;
             break;
         case AR_SQUARE_PICTURE:
             p_sys->i_aspect = VOUT_ASPECT_FACTOR *
-                           p_sys->p_info->sequence->width /
-                           p_sys->p_info->sequence->height;
+                           p_sys->p_info->sequence->picture_width /
+                           p_sys->p_info->sequence->picture_height;
             p_sys->i_sar_num = p_sys->i_sar_den = 1;
             break;
         }
@@ -664,10 +665,10 @@ static void GetAR( decoder_t *p_dec )
         if( p_sys->p_info->sequence->pixel_height > 0 )
         {
             p_sys->i_aspect =
-                ((uint64_t)p_sys->p_info->sequence->display_width) *
+                ((uint64_t)p_sys->p_info->sequence->picture_width) *
                 p_sys->p_info->sequence->pixel_width *
                 VOUT_ASPECT_FACTOR /
-                p_sys->p_info->sequence->display_height /
+                p_sys->p_info->sequence->picture_height /
                 p_sys->p_info->sequence->pixel_height;
             p_sys->i_sar_num = p_sys->p_info->sequence->pixel_width;
             p_sys->i_sar_den = p_sys->p_info->sequence->pixel_height;
@@ -678,12 +679,14 @@ static void GetAR( decoder_t *p_dec )
              * This shouldn't happen and if it does it is a bug
              * in libmpeg2 (likely triggered by an invalid stream) */
             p_sys->i_aspect = VOUT_ASPECT_FACTOR * 4 / 3;
-            p_sys->i_sar_num = p_sys->p_info->sequence->display_height * 4;
-            p_sys->i_sar_den = p_sys->p_info->sequence->display_width * 3;
+            p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 4;
+            p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 3;
         }
     }
 
-    msg_Dbg( p_dec, "%dx%d, aspect %d, sar %i:%i, %u.%03u fps",
+    msg_Dbg( p_dec, "%dx%d (display %d,%d), aspect %d, sar %i:%i, %u.%03u fps",
+             p_sys->p_info->sequence->picture_width,
+             p_sys->p_info->sequence->picture_height,
              p_sys->p_info->sequence->display_width,
              p_sys->p_info->sequence->display_height,
              p_sys->i_aspect, p_sys->i_sar_num, p_sys->i_sar_den,