summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-01-28 21:42:22 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-01-28 21:42:22 +0000
commit90654b8eff9f64602fd64d2f7aaee7964fd31d08 (patch)
treee46185cb8811a35c063a0bfe8bb4453512cd3ec5 /libmpdemux
parent106158f4f1a016c46dfd7161a8baf5643ecd324c (diff)
downloadmpv-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')
-rw-r--r--libmpdemux/demux_mpg.c30
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;
}