diff options
author | nicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-01-28 21:42:22 +0000 |
---|---|---|
committer | nicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-01-28 21:42:22 +0000 |
commit | 90654b8eff9f64602fd64d2f7aaee7964fd31d08 (patch) | |
tree | e46185cb8811a35c063a0bfe8bb4453512cd3ec5 /libmpdemux/demux_mpg.c | |
parent | 106158f4f1a016c46dfd7161a8baf5643ecd324c (diff) | |
download | mpv-90654b8eff9f64602fd64d2f7aaee7964fd31d08.tar.bz2 mpv-90654b8eff9f64602fd64d2f7aaee7964fd31d08.tar.xz |
added code to scan the video stream to search the actual video codec used;
triggered only if requested by the user with option -psprobe.
Evo files require this option because H264 is stored like MPEG2
without using the PSM
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22055 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_mpg.c')
-rw-r--r-- | libmpdemux/demux_mpg.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libmpdemux/demux_mpg.c b/libmpdemux/demux_mpg.c index 4e21a3e074..6b4a5c4e93 100644 --- a/libmpdemux/demux_mpg.c +++ b/libmpdemux/demux_mpg.c @@ -41,6 +41,7 @@ typedef struct mpg_demuxer { extern char* dvdsub_lang; static int mpeg_pts_error=0; +off_t ps_probe = 0; static int parse_psm(demuxer_t *demux, int len) { unsigned char c, id, type; @@ -1051,6 +1052,35 @@ static demuxer_t* demux_mpg_ps_open(demuxer_t* demuxer) } } + if(!sh_video->format && ps_probe > 0) { + int mpeg2, h264, mpeg4, head; + off_t pos = stream_tell(demuxer->stream); + + clear_stats(); + do { + head=sync_video_packet(demuxer->video); + update_stats(head); + skip_video_packet(demuxer->video); + } while(stream_tell(demuxer->stream) < pos + ps_probe); + + ds_free_packs(demuxer->video); + stream_seek(demuxer->stream, pos); + mp_msg(MSGT_DEMUX,MSGL_INFO,"MPEG packet stats: p100: %d p101: %d p1B6: %d p12x: %d sli: %d a: %d b: %d c: %d idr: %d sps: %d pps: %d\n", + num_elementary_packets100, num_elementary_packets101, + num_elementary_packets1B6, num_elementary_packets12x, + num_h264_slice, num_h264_dpa, num_h264_dpb, num_h264_dpc, + num_h264_idr, num_h264_sps, num_h264_pps); + + if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 && + num_elementary_packets100<=num_elementary_packets12x) + sh_video->format = 0x10000004; + else if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) && + num_h264_sps>=1 && num_h264_pps>=1 && num_h264_idr>=1 && + num_elementary_packets1B6==0) + sh_video->format = 0x10000005; + else sh_video->format = 0x10000002; + } + return demuxer; } |