summaryrefslogtreecommitdiffstats
path: root/libmpdemux/video.c
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-02-24 20:02:41 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-02-24 20:02:41 +0000
commite0e161dd83fa694b3a3c03b10643dd311b1fc083 (patch)
tree3544719c5d9c321c31b7a12123e2ac2481874d91 /libmpdemux/video.c
parentbc52a8e25b2dd19153c4529a30f6d260379fa319 (diff)
downloadmpv-e0e161dd83fa694b3a3c03b10643dd311b1fc083.tar.bz2
mpv-e0e161dd83fa694b3a3c03b10643dd311b1fc083.tar.xz
framerate autodetection for H264 in raw/ts streams
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14799 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/video.c')
-rw-r--r--libmpdemux/video.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libmpdemux/video.c b/libmpdemux/video.c
index dc22ade845..5b98af0de9 100644
--- a/libmpdemux/video.c
+++ b/libmpdemux/video.c
@@ -206,6 +206,7 @@ switch(video_codec){
break;
}
case VIDEO_H264: {
+ int pos = 0;
videobuf_len=0; videobuf_code_len=0;
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");fflush(stdout);
while(1){
@@ -222,6 +223,12 @@ switch(video_codec){
mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
return 0;
}
+ pos = videobuf_len+4;
+ if(!read_video_packet(d_video)){
+ mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Can't read sequence parameter set\n");
+ return 0;
+ }
+ h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");fflush(stdout);
while(1){
int i=sync_video_packet(d_video);
@@ -243,6 +250,11 @@ switch(video_codec){
}
mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
sh_video->format=0x10000005;
+ if(picture.fps) {
+ sh_video->fps=picture.fps*0.0001f;
+ sh_video->frametime=10000.0f/(float)picture.fps;
+ mp_msg(MSGT_DECVIDEO,MSGL_INFO, "FPS seems to be: %d/10000\n", picture.fps);
+ }
break;
}
case VIDEO_MPEG12: {
@@ -495,7 +507,19 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
//
while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
int i=sync_video_packet(d_video);
+ int pos = videobuf_len+4;
+ if(!i) return -1;
if(!read_video_packet(d_video)) return -1; // EOF
+ if((i&~0x60) == 0x107 && i != 0x107) {
+ h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
+ if(picture.fps > 0) {
+ sh_video->fps=picture.fps*0.0001f;
+ sh_video->frametime=10000.0f/(float)picture.fps;
+ }
+ i=sync_video_packet(d_video);
+ if(!i) return -1;
+ if(!read_video_packet(d_video)) return -1; // EOF
+ }
if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break;
}
*start=videobuffer; in_size=videobuf_len;