]> git.sesse.net Git - vlc/blobdiff - modules/codec/libmpeg2.c
* modules/codec/libmpeg2.c: backport of 13063 from trunk.
[vlc] / modules / codec / libmpeg2.c
index 9f3f699fdfe2d839614bdd1f9734ea3ff6d6acf2..24ae6cc8497c9765fe9bf874e687bbc9519f81ca 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
  *****************************************************************************
- * Copyright (C) 1999-2001 VideoLAN (Centrale Réseaux) and its contributors
+ * Copyright (C) 1999-2001 the VideoLAN team
  * $Id$
  *
  * Authors: Gildas Bazin <gbazin@videolan.org>
@@ -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;
     }
@@ -580,6 +583,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 )
     {
@@ -625,23 +630,31 @@ static void GetAR( decoder_t *p_dec )
     /* 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:
             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;
             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;
             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;
             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->i_sar_num = p_sys->i_sar_den = 1;
             break;
         }
     }
@@ -656,6 +669,8 @@ static void GetAR( decoder_t *p_dec )
                 VOUT_ASPECT_FACTOR /
                 p_sys->p_info->sequence->display_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 +678,17 @@ 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;
         }
     }
 
-    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, aspect %d, sar %i:%i, %u.%03u fps",
+             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) );
 }
-