changeset 30639:102ae81b5dc8

Parse and use the information from the frame rate extension header for MPEG-2. -identify still does not show the right values though. Fixes bug #1636.
author reimar
date Sun, 21 Feb 2010 13:53:41 +0000
parents a7b908875c14
children 34e3d7d697d9
files libmpdemux/mpeg_hdr.c libmpdemux/mpeg_hdr.h libmpdemux/video.c
diffstat 3 files changed, 11 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/mpeg_hdr.c	Sun Feb 21 13:40:49 2010 +0000
+++ b/libmpdemux/mpeg_hdr.c	Sun Feb 21 13:53:41 2010 +0000
@@ -81,6 +81,9 @@
 	return 1;
 
     picture->progressive_sequence = (buffer[1] >> 3) & 1;
+    picture->frame_rate_extension_n = ((buffer[5] >> 5) & 3) + 1;
+    picture->frame_rate_extension_d = (buffer[5] & 0x1f) + 1;
+
     picture->mpeg1 = 0;
     return 0;
 }
--- a/libmpdemux/mpeg_hdr.h	Sun Feb 21 13:40:49 2010 +0000
+++ b/libmpdemux/mpeg_hdr.h	Sun Feb 21 13:53:41 2010 +0000
@@ -27,6 +27,8 @@
     int aspect_ratio_information;
     int frame_rate_code;
     float fps;
+    int frame_rate_extension_n;
+    int frame_rate_extension_d;
     int bitrate; // 0x3FFFF==VBR
     // timing:
     int picture_structure;
--- a/libmpdemux/video.c	Sun Feb 21 13:40:49 2010 +0000
+++ b/libmpdemux/video.c	Sun Feb 21 13:53:41 2010 +0000
@@ -433,6 +433,7 @@
     float frame_time=1;
     float pts1=d_video->pts;
     float pts=0;
+    float fps;
     int picture_coding_type=0;
     int in_size=0;
     video_codec_t video_codec = find_video_codec(sh_video);
@@ -469,14 +470,15 @@
             case 0x100: picture_coding_type=(videobuffer[start+1] >> 3) & 7;break;
           }
         }
+        fps = picture.fps * picture.frame_rate_extension_n / picture.frame_rate_extension_d;
 
         *start=videobuffer; in_size=videobuf_len;
 
     // get mpeg fps:
-    if(sh_video->fps!=picture.fps) if(!force_fps && !telecine){
-            mp_msg(MSGT_CPLAYER,MSGL_WARN,"Warning! FPS changed %5.3f -> %5.3f  (%f) [%d]  \n",sh_video->fps,picture.fps,sh_video->fps-picture.fps,picture.frame_rate_code);
-            sh_video->fps=picture.fps;
-            sh_video->frametime=1.0/picture.fps;
+    if(sh_video->fps!=fps) if(!force_fps && !telecine){
+            mp_msg(MSGT_CPLAYER,MSGL_WARN,"Warning! FPS changed %5.3f -> %5.3f  (%f) [%d]  \n",sh_video->fps,fps,sh_video->fps-fps,picture.frame_rate_code);
+            sh_video->fps=fps;
+            sh_video->frametime=1.0/fps;
     }
 
     // fix mpeg2 frametime: