]> git.sesse.net Git - vlc/blobdiff - modules/codec/libmpeg2.c
Woops
[vlc] / modules / codec / libmpeg2.c
index cb54199c51def103d8529bfdc776f7b66815b101..d6208ffadfc82cd6dc4e846958bdc95f23531a9d 100644 (file)
@@ -19,7 +19,7 @@
  *
  * 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.
  *****************************************************************************/
 
 /*****************************************************************************
@@ -35,7 +35,7 @@
 
 /* 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) */
 
@@ -72,6 +72,8 @@ struct decoder_sys_t
      */
     vout_synchro_t *p_synchro;
     int            i_aspect;
+    int            i_sar_num;
+    int            i_sar_den;
     mtime_t        i_last_frame_pts;
 
 };
@@ -114,7 +116,8 @@ 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','g','2') )
+        p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','2') &&
+        p_dec->fmt_in.i_codec != VLC_FOURCC('h','d','v','2') )
     {
         return VLC_EGENERIC;
     }
@@ -143,23 +146,23 @@ static int OpenDecoder( vlc_object_t *p_this )
     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;
     }
@@ -237,6 +240,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;
 
@@ -313,6 +317,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;
@@ -436,6 +441,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;
@@ -517,6 +523,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;
 
@@ -580,6 +587,8 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
     p_dec->fmt_out.video.i_visible_height =
         p_sys->p_info->sequence->picture_height;
     p_dec->fmt_out.video.i_aspect = p_sys->i_aspect;
+    p_dec->fmt_out.video.i_sar_num = p_sys->i_sar_num;
+    p_dec->fmt_out.video.i_sar_den = p_sys->i_sar_den;
 
     if( p_sys->p_info->sequence->frame_period > 0 )
     {
@@ -620,7 +629,7 @@ 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 )
@@ -629,19 +638,26 @@ static void GetAR( decoder_t *p_dec )
         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->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->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->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;
         }
     }
@@ -651,11 +667,13 @@ 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;
         }
         else
         {
@@ -663,15 +681,19 @@ 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->picture_height * 4;
+            p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 3;
         }
     }
 
-    msg_Dbg( p_dec, "%dx%d, aspect %d, %u.%03u fps",
-             p_sys->p_info->sequence->width,
-             p_sys->p_info->sequence->height, p_sys->i_aspect,
+    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,
              (uint32_t)((uint64_t)1001000000 * 27 /
                  p_sys->p_info->sequence->frame_period / 1001),
              (uint32_t)((uint64_t)1001000000 * 27 /
                  p_sys->p_info->sequence->frame_period % 1001) );
 }
-