diff options
author | nicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-02-24 20:02:41 +0000 |
---|---|---|
committer | nicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-02-24 20:02:41 +0000 |
commit | e0e161dd83fa694b3a3c03b10643dd311b1fc083 (patch) | |
tree | 3544719c5d9c321c31b7a12123e2ac2481874d91 /libmpdemux/video.c | |
parent | bc52a8e25b2dd19153c4529a30f6d260379fa319 (diff) | |
download | mpv-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.c | 24 |
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; |