[MPlayer-users] DVD lengths reported as 0 in pre6
Reimar Döffinger
Reimar.Doeffinger at stud.uni-karlsruhe.de
Sun Jan 9 11:05:14 CET 2005
Hi,
On Sun, Jan 09, 2005 at 02:08:46AM -0600, Ben Nemec wrote:
> I've recently discovered that in 1.0pre6a MPlayer reports the lengths of
> some DVD tracks as 0, while in earlier versions I got a too-short but
> non-zero value. Unfortunately this has also caused problems with seeking for
> me, as seeking to an absolute value doesn't work at all and seeking to a
> percent definitely is not working right either. I don't see any particular
> pattern to which tracks I'm having trouble with. On the same disc, one track
> shows up just fine and the next reports a length of 0. However, if a track
> shows up as 0, it always shows up as zero and if it has a time it always has
> a time.
>
> Has anyone else run into this and reported it? If not I'll submit a full bug
> report (if that's what it is).
Please try the attached patch.
Greetings,
Reimar Döffinger
-------------- next part --------------
Index: libmpdemux/demux_asf.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_asf.c,v
retrieving revision 1.30
diff -d -u -r1.30 demux_asf.c
--- libmpdemux/demux_asf.c 11 Sep 2004 09:40:34 -0000 1.30
+++ libmpdemux/demux_asf.c 9 Jan 2005 10:03:07 -0000
@@ -423,11 +423,7 @@
return DEMUXER_CTRL_OK;
case DEMUXER_CTRL_GET_PERCENT_POS:
- if (demuxer->movi_end==demuxer->movi_start) {
return DEMUXER_CTRL_DONTKNOW;
- }
- *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
- return DEMUXER_CTRL_OK;
default:
return DEMUXER_CTRL_NOTIMPL;
Index: libmpdemux/demux_avi.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_avi.c,v
retrieving revision 1.61
diff -d -u -r1.61 demux_avi.c
--- libmpdemux/demux_avi.c 17 Mar 2004 14:50:36 -0000 1.61
+++ libmpdemux/demux_avi.c 9 Jan 2005 10:03:11 -0000
@@ -846,9 +846,7 @@
case DEMUXER_CTRL_GET_PERCENT_POS:
if (!priv->numberofframes) {
- if (demuxer->movi_end==demuxer->movi_start) return DEMUXER_CTRL_DONTKNOW;
- *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
- return DEMUXER_CTRL_OK;
+ return DEMUXER_CTRL_DONTKNOW;
}
*((int *)arg)=(int)(priv->video_pack_no*100/priv->numberofframes);
if (sh_video->video.dwLength<=1) return DEMUXER_CTRL_GUESS;
Index: libmpdemux/demux_mkv.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mkv.c,v
retrieving revision 1.30
diff -d -u -r1.30 demux_mkv.c
--- libmpdemux/demux_mkv.c 28 Nov 2004 21:08:46 -0000 1.30
+++ libmpdemux/demux_mkv.c 9 Jan 2005 10:03:23 -0000
@@ -3314,12 +3314,7 @@
case DEMUXER_CTRL_GET_PERCENT_POS:
if (mkv_d->duration == 0)
{
- if (demuxer->movi_start == demuxer->movi_end)
return DEMUXER_CTRL_DONTKNOW;
-
- *((int *)arg) = (int)((demuxer->filepos - demuxer->movi_start) /
- ((demuxer->movi_end-demuxer->movi_start)/100));
- return DEMUXER_CTRL_OK;
}
*((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
Index: libmpdemux/demux_mpg.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mpg.c,v
retrieving revision 1.53
diff -d -u -r1.53 demux_mpg.c
--- libmpdemux/demux_mpg.c 8 Jan 2005 10:05:44 -0000 1.53
+++ libmpdemux/demux_mpg.c 9 Jan 2005 10:03:31 -0000
@@ -520,20 +520,14 @@
*((unsigned long *)arg)=(long)mpg_d->final_pts;
return DEMUXER_CTRL_GUESS;
}
- if(!sh_video || !sh_video->i_bps) // unspecified or VBR
return DEMUXER_CTRL_DONTKNOW;
- *((unsigned long *)arg)=(demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps;
- return DEMUXER_CTRL_GUESS;
case DEMUXER_CTRL_GET_PERCENT_POS:
- if (demuxer->movi_end==demuxer->movi_start)
- return DEMUXER_CTRL_DONTKNOW;
if (mpg_d && mpg_d->has_valid_timestamps && mpg_d->final_pts > 0.0) {
*((int *)arg)=(int)(100 * mpg_d->last_pts / mpg_d->final_pts);
return DEMUXER_CTRL_OK;
}
- *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
- return DEMUXER_CTRL_OK;
+ return DEMUXER_CTRL_DONTKNOW;
default:
return DEMUXER_CTRL_NOTIMPL;
Index: libmpdemux/demux_ty.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_ty.c,v
retrieving revision 1.3
diff -d -u -r1.3 demux_ty.c
--- libmpdemux/demux_ty.c 19 Jul 2004 23:17:37 -0000 1.3
+++ libmpdemux/demux_ty.c 9 Jan 2005 10:03:54 -0000
@@ -1027,12 +1027,7 @@
return DEMUXER_CTRL_GUESS;
case DEMUXER_CTRL_GET_PERCENT_POS:
- if (demuxer->movi_end==demuxer->movi_start)
return DEMUXER_CTRL_DONTKNOW;
- *((int *)arg)=
- (int)((demuxer->filepos-demuxer->movi_start)/
- ((demuxer->movi_end-demuxer->movi_start)/100));
- return DEMUXER_CTRL_OK;
default:
return DEMUXER_CTRL_NOTIMPL;
}
Index: libmpdemux/demuxer.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demuxer.c,v
retrieving revision 1.180
diff -d -u -r1.180 demuxer.c
--- libmpdemux/demuxer.c 29 Dec 2004 19:51:56 -0000 1.180
+++ libmpdemux/demuxer.c 9 Jan 2005 10:04:04 -0000
@@ -1717,7 +1717,11 @@
unsigned long demuxer_get_time_length(demuxer_t *demuxer){
unsigned long get_time_ans;
+ // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW
if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0) {
+ if (sh_video && sh_video->i_bps)
+ get_time_ans = (demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps;
+ else
get_time_ans=0;
}
return get_time_ans;
@@ -1727,9 +1731,14 @@
int ans = 0;
int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans);
int len = (demuxer->movi_end - demuxer->movi_start) / 100;
- if (res == DEMUXER_CTRL_NOTIMPL && len > 0)
+ if (res <= 0) {
+ if (len > 0)
ans = (demuxer->filepos - demuxer->movi_start) / len;
- if (ans>100 || ans<0) ans=0;
+ else
+ ans = 0;
+ }
+ if (ans < 0) ans = 0;
+ if (ans > 100) ans = 100;
return ans;
}
More information about the MPlayer-users
mailing list