summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_avi.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-16 03:42:14 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-16 03:42:14 +0000
commit422b0d2a4c936d87ed27ee7b56e21d2d60752194 (patch)
tree1a739173121ee09271ab441c058fc5ec7b0857bb /libmpdemux/demux_avi.c
parent4bda81ad1667ff2f6fd888a5010c375fde8e5038 (diff)
downloadmpv-422b0d2a4c936d87ed27ee7b56e21d2d60752194.tar.bz2
mpv-422b0d2a4c936d87ed27ee7b56e21d2d60752194.tar.xz
demuxer_control(), percent position and time length query implemented in
asf, avi, mpeg demuxers. patch by Balatoni Denes <pnis@coder.hu> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8209 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_avi.c')
-rw-r--r--libmpdemux/demux_avi.c53
1 files changed, 42 insertions, 11 deletions
diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c
index 2394179b51..8406e8f794 100644
--- a/libmpdemux/demux_avi.c
+++ b/libmpdemux/demux_avi.c
@@ -552,6 +552,15 @@ demuxer_t* demux_open_avi(demuxer_t* demuxer){
if(sh_audio) sh_video->i_bps-=sh_audio->audio.dwLength;
mp_msg(MSGT_DEMUX,MSGL_V,"AVI video length=%lu\n",(unsigned long)sh_video->i_bps);
sh_video->i_bps=((float)sh_video->i_bps/(float)sh_video->video.dwLength)*sh_video->fps;
+
+ if((priv->numberofframes=sh_video->video.dwLength)<=1)
+ // bad video header, try to get number of frames from audio
+ if(sh_audio && sh_audio->wf->nAvgBytesPerSec) priv->numberofframes=sh_video->fps*sh_audio->audio.dwLength/sh_audio->wf->nAvgBytesPerSec;
+ if(priv->numberofframes<=1){
+ mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CouldntDetFNo);
+ priv->numberofframes=0;
+ }
+
mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %ldx%ld %dbpp %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n",
(char *)&sh_video->bih->biCompression,
sh_video->bih->biWidth,
@@ -588,17 +597,7 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
}
if(flags&2){
- // float 0..1
- int total=sh_video->video.dwLength;
- if(total<=1){
- // bad video header, try to get it from audio
- if(sh_audio) total=sh_video->fps*sh_audio->audio.dwLength/sh_audio->wf->nAvgBytesPerSec;
- if(total<=1){
- mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CouldntDetFNo);
- total=0;
- }
- }
- rel_seek_frames=rel_seek_secs*total;
+ rel_seek_frames=rel_seek_secs*priv->numberofframes;
}
priv->skip_video_frames=0;
@@ -785,3 +784,35 @@ void demux_close_avi(demuxer_t *demuxer) {
free(priv->idx);
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;
+ }
+}