Mercurial > mplayer.hg
comparison libmpdemux/demux_avi.c @ 16175:6b86089c2edd
Demuxer modularization
Demuxer selection by name with -demuxer command (bakward compatible)
author | rtognimp |
---|---|
date | Fri, 05 Aug 2005 19:57:47 +0000 |
parents | 8769fa370f83 |
children | acb7885f916d |
comparison
equal
deleted
inserted
replaced
16174:b118c000ddd2 | 16175:6b86089c2edd |
---|---|
11 #include "stream.h" | 11 #include "stream.h" |
12 #include "demuxer.h" | 12 #include "demuxer.h" |
13 #include "stheader.h" | 13 #include "stheader.h" |
14 | 14 |
15 #include "aviheader.h" | 15 #include "aviheader.h" |
16 | |
17 extern demuxer_t* init_avi_with_ogg(demuxer_t* demuxer); | |
18 extern int demux_ogg_open(demuxer_t* demuxer); | |
16 | 19 |
17 // PTS: 0=interleaved 1=BPS-based | 20 // PTS: 0=interleaved 1=BPS-based |
18 int pts_from_bps=1; | 21 int pts_from_bps=1; |
19 | 22 |
20 // Select ds from ID | 23 // Select ds from ID |
171 } | 174 } |
172 | 175 |
173 // return value: | 176 // return value: |
174 // 0 = EOF or no stream found | 177 // 0 = EOF or no stream found |
175 // 1 = successfully read a packet | 178 // 1 = successfully read a packet |
176 int demux_avi_fill_buffer(demuxer_t *demux){ | 179 static int demux_avi_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ |
177 avi_priv_t *priv=demux->priv; | 180 avi_priv_t *priv=demux->priv; |
178 unsigned int id=0; | 181 unsigned int id=0; |
179 unsigned int len; | 182 unsigned int len; |
180 //int max_packs=128; | 183 //int max_packs=128; |
181 int ret=0; | 184 int ret=0; |
428 char *index_file_save = NULL, *index_file_load = NULL; | 431 char *index_file_save = NULL, *index_file_load = NULL; |
429 int force_ni=0; // force non-interleaved AVI parsing | 432 int force_ni=0; // force non-interleaved AVI parsing |
430 | 433 |
431 void read_avi_header(demuxer_t *demuxer,int index_mode); | 434 void read_avi_header(demuxer_t *demuxer,int index_mode); |
432 | 435 |
433 demuxer_t* demux_open_avi(demuxer_t* demuxer){ | 436 static demuxer_t* demux_open_avi(demuxer_t* demuxer){ |
434 demux_stream_t *d_audio=demuxer->audio; | 437 demux_stream_t *d_audio=demuxer->audio; |
435 demux_stream_t *d_video=demuxer->video; | 438 demux_stream_t *d_video=demuxer->video; |
436 sh_audio_t *sh_audio=NULL; | 439 sh_audio_t *sh_audio=NULL; |
437 sh_video_t *sh_video=NULL; | 440 sh_video_t *sh_video=NULL; |
438 avi_priv_t* priv=malloc(sizeof(avi_priv_t)); | 441 avi_priv_t* priv=malloc(sizeof(avi_priv_t)); |
854 | 857 |
855 default: | 858 default: |
856 return DEMUXER_CTRL_NOTIMPL; | 859 return DEMUXER_CTRL_NOTIMPL; |
857 } | 860 } |
858 } | 861 } |
862 | |
863 | |
864 static int avi_check_file(demuxer_t *demuxer) | |
865 { | |
866 int id=stream_read_dword_le(demuxer->stream); // "RIFF" | |
867 | |
868 if((id==mmioFOURCC('R','I','F','F')) || (id==mmioFOURCC('O','N','2',' '))) { | |
869 stream_read_dword_le(demuxer->stream); //filesize | |
870 id=stream_read_dword_le(demuxer->stream); // "AVI " | |
871 if(id==formtypeAVI) | |
872 return DEMUXER_TYPE_AVI; | |
873 if(id==mmioFOURCC('O','N','2','f')){ | |
874 mp_msg(MSGT_DEMUXER,MSGL_INFO,"ON2 AVI format"); | |
875 return DEMUXER_TYPE_AVI; | |
876 } | |
877 } | |
878 | |
879 return 0; | |
880 } | |
881 | |
882 | |
883 static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) | |
884 { | |
885 sh_audio_t* sh_a; | |
886 | |
887 demuxer = (demuxer_t*) demux_open_avi(demuxer); | |
888 if(!demuxer) return NULL; // failed to open | |
889 sh_a = (sh_audio_t*)demuxer->audio->sh; | |
890 if(demuxer->audio->id != -2 && sh_a) { | |
891 #ifdef HAVE_OGGVORBIS | |
892 // support for Ogg-in-AVI: | |
893 if(sh_a->format == 0xFFFE) | |
894 demuxer = init_avi_with_ogg(demuxer); | |
895 else if(sh_a->format == 0x674F) { | |
896 stream_t* s; | |
897 demuxer_t *od; | |
898 s = new_ds_stream(demuxer->audio); | |
899 od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); | |
900 if(!demux_ogg_open(od)) { | |
901 mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer); | |
902 free_stream(s); | |
903 demuxer->audio->id = -2; | |
904 } else | |
905 demuxer = new_demuxers_demuxer(demuxer,od,demuxer); | |
906 } | |
907 #endif | |
908 } | |
909 | |
910 return demuxer; | |
911 } | |
912 | |
913 | |
914 demuxer_desc_t demuxer_desc_avi = { | |
915 "AVI demuxer", | |
916 "avi", | |
917 "AVI", | |
918 "Arpi?", | |
919 "AVI files, including non interleaved files", | |
920 DEMUXER_TYPE_AVI, | |
921 1, // safe autodetect | |
922 avi_check_file, | |
923 demux_avi_fill_buffer, | |
924 demux_open_hack_avi, | |
925 demux_close_avi, | |
926 demux_seek_avi, | |
927 NULL | |
928 }; |