[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