[MPlayer-dev-eng] [PATCH] reorganized demux_{asf,avi,mpg,xmms}_control
seru
seru at gmx.net
Mon Dec 23 00:34:28 CET 2002
Compiled and tested with asf, avi and mpg, all show total time and percentage correctly.
Also, this will allow us to create demux_control functions for other formats (mov, mp3, ogg, ...) more easily.
As a side note, mpeg total time seems a little strange (with or without this patch). I tried a file which is 13379840 bytes, and MPlayer says it's '2304,0 kbps (288,0 kbyte/s)' -- that must be in the header, right? So I guess the header has something wrong though, because DEMUXER_CTRL_GET_TIME_LENGTH gives 46 seconds, while 13379840/1024/288=45,37 secs, and the OSD says it's 53 secs. :-?? What can we do about this? Nothing?
-------------- next part --------------
Index: libmpdemux/demuxer.h
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demuxer.h,v
retrieving revision 1.52
diff -u -r1.52 demuxer.h
--- libmpdemux/demuxer.h 22 Dec 2002 21:01:01 -0000 1.52
+++ libmpdemux/demuxer.h 22 Dec 2002 23:58:18 -0000
@@ -245,7 +245,7 @@
int demux_info_print(demuxer_t *demuxer);
int demux_control(demuxer_t *demuxer, int cmd, void *arg);
-#endif
-
extern unsigned long demuxer_get_time_length(demuxer_t *demuxer);
extern int demuxer_get_percent_pos(demuxer_t *demuxer);
+#endif
+
Index: libmpdemux/demuxer.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demuxer.c,v
retrieving revision 1.126
diff -u -r1.126 demuxer.c
--- libmpdemux/demuxer.c 22 Dec 2002 21:01:01 -0000 1.126
+++ libmpdemux/demuxer.c 22 Dec 2002 23:58:22 -0000
@@ -16,6 +16,7 @@
#include "stream.h"
#include "demuxer.h"
#include "stheader.h"
+#include "aviheader.h"
#include "mf.h"
#include "../libvo/fastmemcpy.h"
@@ -1274,31 +1275,104 @@
return NULL;
}
-extern int demux_mpg_control(demuxer_t *demuxer, int cmd, void *arg);
-extern int demux_asf_control(demuxer_t *demuxer, int cmd, void *arg);
-extern int demux_avi_control(demuxer_t *demuxer, int cmd, void *arg);
-extern int demux_xmms_control(demuxer_t *demuxer, int cmd, void *arg);
-
-int demux_control(demuxer_t *demuxer, int cmd, void *arg) {
- switch(demuxer->type) {
- case DEMUXER_TYPE_MPEG_ES:
- case DEMUXER_TYPE_MPEG_PS:
- return demux_mpg_control(demuxer,cmd,arg);
- case DEMUXER_TYPE_ASF:
- return demux_asf_control(demuxer,cmd,arg);
- case DEMUXER_TYPE_AVI:
- case DEMUXER_TYPE_AVI_NI:
- case DEMUXER_TYPE_AVI_NINI:
- return demux_avi_control(demuxer,cmd,arg);
+int demux_control(demuxer_t *demuxer,int cmd, void *arg){
+ int asf_movielength=0;
+/* demux_stream_t *d_audio=demuxer->audio;
+ sh_audio_t *sh_audio=d_audio->sh; */
+ demux_stream_t *d_video=demuxer->video;
+ sh_video_t *sh_video=d_video->sh;
+ avi_priv_t *priv=demuxer->priv;
#ifdef HAVE_XMMS
- case DEMUXER_TYPE_XMMS:
- return demux_xmms_control(demuxer,cmd,arg);
+ xmms_priv_t *xpriv=demuxer->priv;
#endif
- default:
- return DEMUXER_CTRL_NOTIMPL;
+ switch(cmd) {
+
+ case DEMUXER_CTRL_GET_TIME_LENGTH:
+ switch(demuxer->type) {
+ case DEMUXER_TYPE_ASF:
+ *((unsigned long *)arg)=(unsigned long)(asf_movielength);
+ break;
+
+ case DEMUXER_TYPE_AVI:
+ case DEMUXER_TYPE_AVI_NI:
+ case DEMUXER_TYPE_AVI_NINI:
+ if (!priv->numberofframes) {
+ return DEMUXER_CTRL_DONTKNOW;
+ }
+ *((unsigned long *)arg)=priv->numberofframes/sh_video->fps;
+ if (sh_video->video.dwLength<=1) {
+ return DEMUXER_CTRL_GUESS;
+ }
+ return DEMUXER_CTRL_OK;
+ break;
+
+ case DEMUXER_TYPE_MPEG_ES:
+ case DEMUXER_TYPE_MPEG_PS:
+ if(!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;
+ break;
+
+#ifdef HAVE_XMMS
+ case DEMUXER_TYPE_XMMS:
+ if (xmms_length<=0) {
+ return DEMUXER_CTRL_DONTKNOW;
+ }
+ *((unsigned long *)arg)=(unsigned long)xmms_length/1000;
+ return DEMUXER_CTRL_GUESS;
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ case DEMUXER_CTRL_GET_PERCENT_POS:
+ if (demuxer->movi_end==demuxer->movi_start) {
+ return DEMUXER_CTRL_DONTKNOW;
+ }
+ switch(demuxer->type) {
+ case DEMUXER_TYPE_ASF:
+ *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
+ return DEMUXER_CTRL_OK;
+ break;
+
+ case DEMUXER_TYPE_AVI:
+ case DEMUXER_TYPE_AVI_NI:
+ case DEMUXER_TYPE_AVI_NINI:
+ if (!priv->numberofframes) {
+ *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
+ return DEMUXER_CTRL_OK;
+ }
+ *((int *)arg)=(int)(priv->video_pack_no*100/priv->numberofframes);
+ if (sh_video->video.dwLength<=1) {
+ return DEMUXER_CTRL_GUESS;
+ }
+ return DEMUXER_CTRL_OK;
+ break;
+
+ case DEMUXER_TYPE_MPEG_ES:
+ case DEMUXER_TYPE_MPEG_PS:
+ *((int *)arg)=(int)((demuxer->filepos-demuxer->movi_start)/((demuxer->movi_end-demuxer->movi_start)/100));
+ return DEMUXER_CTRL_OK;
+ break;
+
+#ifdef HAVE_XMMS
+ case DEMUXER_TYPE_XMMS:
+ if (xmms_length<=0) {
+ return DEMUXER_CTRL_DONTKNOW;
+ }
+ *((int *)arg)=(int)( xpriv->spos / (float)(sh_audio->wf->nAvgBytesPerSec) / xmms_length );
+ return DEMUXER_CTRL_OK;
+ break;
+#endif
+ }
+ default:
+ return DEMUXER_CTRL_NOTIMPL;
}
}
-
unsigned long demuxer_get_time_length(demuxer_t *demuxer){
Index: libmpdemux/demux_asf.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_asf.c,v
retrieving revision 1.26
diff -u -r1.26 demux_asf.c
--- libmpdemux/demux_asf.c 23 Nov 2002 10:58:08 -0000 1.26
+++ libmpdemux/demux_asf.c 22 Dec 2002 23:58:23 -0000
@@ -12,7 +12,6 @@
#include "asf.h"
#include "demuxer.h"
-
/*
* Load 16/32-bit values in little endian byte order
* from an unaligned address
@@ -396,25 +395,3 @@
}
-int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
-/* demux_stream_t *d_audio=demuxer->audio;
- demux_stream_t *d_video=demuxer->video;
- sh_audio_t *sh_audio=d_audio->sh;
- sh_video_t *sh_video=d_video->sh;
-*/
- switch(cmd) {
- case DEMUXER_CTRL_GET_TIME_LENGTH:
- *((unsigned long *)arg)=(unsigned long)(asf_movielength);
- 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.53
diff -u -r1.53 demux_avi.c
--- libmpdemux/demux_avi.c 21 Dec 2002 22:11:48 -0000 1.53
+++ libmpdemux/demux_avi.c 22 Dec 2002 23:58:25 -0000
@@ -823,34 +823,3 @@
free(priv);
}
-
-int demux_avi_control(demuxer_t *demuxer,int cmd, void *arg){
- avi_priv_t *priv=demuxer->priv;
-/* demux_stream_t *d_audio=demuxer->audio;*/
- demux_stream_t *d_video=demuxer->video;
-/* sh_audio_t *sh_audio=d_audio->sh;*/
- sh_video_t *sh_video=d_video->sh;
-
-
-
- switch(cmd) {
- case DEMUXER_CTRL_GET_TIME_LENGTH:
- if (!priv->numberofframes) return DEMUXER_CTRL_DONTKNOW;
- *((unsigned long *)arg)=priv->numberofframes/sh_video->fps;
- if (sh_video->video.dwLength<=1) return DEMUXER_CTRL_GUESS;
- return DEMUXER_CTRL_OK;
-
- 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;
- }
- *((int *)arg)=(int)(priv->video_pack_no*100/priv->numberofframes);
- if (sh_video->video.dwLength<=1) return DEMUXER_CTRL_GUESS;
- return DEMUXER_CTRL_OK;
-
- default:
- return DEMUXER_CTRL_NOTIMPL;
- }
-}
Index: libmpdemux/demux_mpg.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mpg.c,v
retrieving revision 1.46
diff -u -r1.46 demux_mpg.c
--- libmpdemux/demux_mpg.c 23 Nov 2002 10:58:08 -0000 1.46
+++ libmpdemux/demux_mpg.c 22 Dec 2002 23:58:26 -0000
@@ -405,26 +405,3 @@
}
}
-int demux_mpg_control(demuxer_t *demuxer,int cmd, void *arg){
-/* demux_stream_t *d_audio=demuxer->audio;*/
- demux_stream_t *d_video=demuxer->video;
-/* sh_audio_t *sh_audio=d_audio->sh;*/
- sh_video_t *sh_video=d_video->sh;
-
- switch(cmd) {
- case DEMUXER_CTRL_GET_TIME_LENGTH:
- if(!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;
- *((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_xmms.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_xmms.c,v
retrieving revision 1.1
diff -u -r1.1 demux_xmms.c
--- libmpdemux/demux_xmms.c 22 Dec 2002 21:01:01 -0000 1.1
+++ libmpdemux/demux_xmms.c 22 Dec 2002 23:58:26 -0000
@@ -313,24 +313,3 @@
return 1;
}
-int demux_xmms_control(demuxer_t *demuxer,int cmd, void *arg){
- demux_stream_t *d_video=demuxer->video;
- sh_audio_t *sh_audio=demuxer->audio->sh;
- xmms_priv_t *priv=demuxer->priv;
-
- switch(cmd) {
- case DEMUXER_CTRL_GET_TIME_LENGTH:
- if (xmms_length<=0) return DEMUXER_CTRL_DONTKNOW;
- *((unsigned long *)arg)=(unsigned long)xmms_length/1000;
- return DEMUXER_CTRL_GUESS;
-
- case DEMUXER_CTRL_GET_PERCENT_POS:
- if (xmms_length<=0)
- return DEMUXER_CTRL_DONTKNOW;
- *((int *)arg)=(int)( priv->spos / (float)(sh_audio->wf->nAvgBytesPerSec) / xmms_length );
- return DEMUXER_CTRL_OK;
-
- default:
- return DEMUXER_CTRL_NOTIMPL;
- }
-}
More information about the MPlayer-dev-eng
mailing list