summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-02-03 12:14:29 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-02-03 12:14:29 +0000
commit40dca58f37bab581ad156f03545efc4428a34cb3 (patch)
tree3e326d33050bc77e35c8f5d16c595a583299c231 /libmpdemux
parent8b068da7ad4cac7ebdb39bf645a53c44f2cf88b8 (diff)
downloadmpv-40dca58f37bab581ad156f03545efc4428a34cb3.tar.bz2
mpv-40dca58f37bab581ad156f03545efc4428a34cb3.tar.xz
Allow demuxers to choose a default value for correct_pts
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25951 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c4
-rw-r--r--libmpdemux/demux_mkv.c4
-rw-r--r--libmpdemux/demux_real.c2
-rw-r--r--libmpdemux/demuxer.c15
-rw-r--r--libmpdemux/demuxer.h2
5 files changed, 20 insertions, 7 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 90b4ba12c5..edb2b2e94c 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -463,7 +463,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
if (opt_cryptokey)
parse_cryptokey(avfc, opt_cryptokey);
- if (correct_pts)
+ if (user_correct_pts != 0)
avfc->flags |= AVFMT_FLAG_GENPTS;
if (index_mode == 0)
avfc->flags |= AVFMT_FLAG_IGNIDX;
@@ -644,6 +644,8 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
lavf_priv_t *priv = demuxer->priv;
switch (cmd) {
+ case DEMUXER_CTRL_CORRECT_PTS:
+ return DEMUXER_CTRL_OK;
case DEMUXER_CTRL_GET_TIME_LENGTH:
if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE)
return DEMUXER_CTRL_DONTKNOW;
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 3d3fed33b1..0d4113180f 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1827,7 +1827,7 @@ demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid)
bih = realloc (bih, bih->biSize);
memcpy (bih + 1, track->private_data, track->private_size);
}
- track->reorder_timecodes = !correct_pts;
+ track->reorder_timecodes = user_correct_pts == 0;
if (!vi->id) {
mp_msg (MSGT_DEMUX,MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownCodecID,
track->codec_id, track->tnum);
@@ -3456,6 +3456,8 @@ demux_mkv_control (demuxer_t *demuxer, int cmd, void *arg)
switch (cmd)
{
+ case DEMUXER_CTRL_CORRECT_PTS:
+ return DEMUXER_CTRL_OK;
case DEMUXER_CTRL_GET_TIME_LENGTH:
if (mkv_d->duration == 0)
return DEMUXER_CTRL_DONTKNOW;
diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c
index a3f1643210..0d4a114266 100644
--- a/libmpdemux/demux_real.c
+++ b/libmpdemux/demux_real.c
@@ -743,7 +743,7 @@ got_audio:
break;
}
priv->audio_need_keyframe = 0;
- priv->audio_timestamp[priv->sub_packet_cnt] = (priv->a_pts==timestamp) ? (correct_pts ? MP_NOPTS_VALUE : 0) : (timestamp/1000.0);
+ priv->audio_timestamp[priv->sub_packet_cnt] = (priv->a_pts==timestamp) ? (user_correct_pts > 0 ? MP_NOPTS_VALUE : 0) : (timestamp/1000.0);
priv->a_pts = timestamp;
if (priv->sub_packet_cnt == 0)
priv->audio_filepos = demuxer->filepos;
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index b8e96ecdb0..8b6873602a 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -684,6 +684,7 @@ int get_demuxer_type_from_name(char *demuxer_name, int *force)
int extension_parsing=1; // 0=off 1=mixed (used only for unstable formats)
int correct_pts=0;
+int user_correct_pts=-1;
/*
NOTE : Several demuxers may be opened at the same time so
@@ -869,6 +870,7 @@ extern float stream_cache_seek_min_percent;
demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){
stream_t *as = NULL,*ss = NULL;
demuxer_t *vd,*ad = NULL,*sd = NULL;
+ demuxer_t *res;
int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ;
int audio_demuxer_type = 0, sub_demuxer_type = 0;
int demuxer_force = 0, audio_demuxer_force = 0,
@@ -935,13 +937,18 @@ demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int
}
if(ad && sd)
- return new_demuxers_demuxer(vd,ad,sd);
+ res = new_demuxers_demuxer(vd,ad,sd);
else if(ad)
- return new_demuxers_demuxer(vd,ad,vd);
+ res = new_demuxers_demuxer(vd,ad,vd);
else if(sd)
- return new_demuxers_demuxer(vd,vd,sd);
+ res = new_demuxers_demuxer(vd,vd,sd);
else
- return vd;
+ res = vd;
+
+ correct_pts = user_correct_pts;
+ if (correct_pts < 0)
+ correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) == DEMUXER_CTRL_OK;
+ return res;
}
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 987aaac3a8..d640d0e807 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -82,6 +82,7 @@
#define DEMUXER_CTRL_RESYNC 13
#define DEMUXER_CTRL_SWITCH_VIDEO 14
#define DEMUXER_CTRL_IDENTIFY_PROGRAM 15
+#define DEMUXER_CTRL_CORRECT_PTS 16
#define SEEK_ABSOLUTE (1 << 0)
#define SEEK_FACTOR (1 << 1)
@@ -143,6 +144,7 @@ typedef struct demuxer_info_st {
struct demuxer_st;
extern int correct_pts;
+extern int user_correct_pts;
/**
* Demuxer description structure