summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_asf.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-05 19:57:47 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-05 19:57:47 +0000
commitcd68e1618b17b525bd49757b2f5e245a6cb1a495 (patch)
treec67656ff189654b818ade76a8f5bd0b7d1bf7f91 /libmpdemux/demux_asf.c
parentadfe956dc385d6588eb2ab74828f9a905821adf4 (diff)
downloadmpv-cd68e1618b17b525bd49757b2f5e245a6cb1a495.tar.bz2
mpv-cd68e1618b17b525bd49757b2f5e245a6cb1a495.tar.xz
Demuxer modularization
Demuxer selection by name with -demuxer command (bakward compatible) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16176 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_asf.c')
-rw-r--r--libmpdemux/demux_asf.c63
1 files changed, 60 insertions, 3 deletions
diff --git a/libmpdemux/demux_asf.c b/libmpdemux/demux_asf.c
index 40066fa718..48408dd2d4 100644
--- a/libmpdemux/demux_asf.c
+++ b/libmpdemux/demux_asf.c
@@ -38,6 +38,8 @@ extern int asf_scrambling_b;
extern int asf_packetsize;
extern double asf_packetrate;
extern int asf_movielength;
+extern int asf_check_header(demuxer_t *demuxer);
+extern int read_asf_header(demuxer_t *demuxer);
// based on asf file-format doc by Eugene [http://divx.euro.ru]
@@ -140,7 +142,7 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
// return value:
// 0 = EOF or no stream found
// 1 = successfully read a packet
-int demux_asf_fill_buffer(demuxer_t *demux){
+static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
demux->filepos=stream_tell(demux->stream);
// Brodcast stream have movi_start==movi_end
@@ -360,7 +362,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
extern void resync_audio_stream(sh_audio_t *sh_audio);
extern void skip_audio_frame(sh_audio_t *sh_audio);
-void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
+static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
demux_stream_t *d_audio=demuxer->audio;
demux_stream_t *d_video=demuxer->video;
sh_audio_t *sh_audio=d_audio->sh;
@@ -412,7 +414,7 @@ void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
}
-int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
+static 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;
@@ -430,3 +432,58 @@ int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
return DEMUXER_CTRL_NOTIMPL;
}
}
+
+
+static demuxer_t* demux_open_asf(demuxer_t* demuxer)
+{
+ sh_audio_t *sh_audio=NULL;
+ sh_video_t *sh_video=NULL;
+
+ //---- ASF header:
+ read_asf_header(demuxer);
+ stream_reset(demuxer->stream);
+ stream_seek(demuxer->stream,demuxer->movi_start);
+// demuxer->idx_pos=0;
+// demuxer->endpos=avi_header.movi_end;
+ if(demuxer->video->id != -2) {
+ if(!ds_fill_buffer(demuxer->video)){
+ mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream);
+ demuxer->video->sh=NULL;
+ //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
+ } else {
+ sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
+ sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms
+ //sh_video->i_bps=10*asf_packetsize; // FIXME!
+ }
+ }
+
+ if(demuxer->audio->id!=-2){
+ mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id);
+ if(!ds_fill_buffer(demuxer->audio)){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream);
+ demuxer->audio->sh=NULL;
+ } else {
+ sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
+ sh_audio->format=sh_audio->wf->wFormatTag;
+ }
+ }
+
+ return demuxer;
+}
+
+
+demuxer_desc_t demuxer_desc_asf = {
+ "ASF demuxer",
+ "asv",
+ "ASF",
+ "A'rpi",
+ "ASF, WMV, WMA",
+ DEMUXER_TYPE_ASF,
+ 1, // safe autodetect
+ asf_check_header,
+ demux_asf_fill_buffer,
+ demux_open_asf,
+ NULL, //demux_close_asf,
+ demux_seek_asf,
+ demux_asf_control
+};