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 };