diff 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
line wrap: on
line diff
--- a/libmpdemux/demux_avi.c	Fri Aug 05 13:37:32 2005 +0000
+++ b/libmpdemux/demux_avi.c	Fri Aug 05 19:57:47 2005 +0000
@@ -14,6 +14,9 @@
 
 #include "aviheader.h"
 
+extern demuxer_t* init_avi_with_ogg(demuxer_t* demuxer);
+extern int demux_ogg_open(demuxer_t* demuxer);
+
 // PTS:  0=interleaved  1=BPS-based
 int pts_from_bps=1;
 
@@ -173,7 +176,7 @@
 // return value:
 //     0 = EOF or no stream found
 //     1 = successfully read a packet
-int demux_avi_fill_buffer(demuxer_t *demux){
+static int demux_avi_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){
 avi_priv_t *priv=demux->priv;
 unsigned int id=0;
 unsigned int len;
@@ -430,7 +433,7 @@
 
 void read_avi_header(demuxer_t *demuxer,int index_mode);
 
-demuxer_t* demux_open_avi(demuxer_t* demuxer){
+static demuxer_t* demux_open_avi(demuxer_t* demuxer){
     demux_stream_t *d_audio=demuxer->audio;
     demux_stream_t *d_video=demuxer->video;
     sh_audio_t *sh_audio=NULL;
@@ -856,3 +859,70 @@
 	    return DEMUXER_CTRL_NOTIMPL;
     }
 }
+
+
+static int avi_check_file(demuxer_t *demuxer)
+{
+  int id=stream_read_dword_le(demuxer->stream); // "RIFF"
+
+  if((id==mmioFOURCC('R','I','F','F')) || (id==mmioFOURCC('O','N','2',' '))) {
+    stream_read_dword_le(demuxer->stream); //filesize
+    id=stream_read_dword_le(demuxer->stream); // "AVI "
+    if(id==formtypeAVI)
+      return DEMUXER_TYPE_AVI;
+    if(id==mmioFOURCC('O','N','2','f')){
+      mp_msg(MSGT_DEMUXER,MSGL_INFO,"ON2 AVI format");
+      return DEMUXER_TYPE_AVI;
+    }
+  }
+
+  return 0;
+}
+
+
+static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer)
+{
+   sh_audio_t* sh_a;
+
+   demuxer = (demuxer_t*) demux_open_avi(demuxer);
+   if(!demuxer) return NULL; // failed to open
+   sh_a = (sh_audio_t*)demuxer->audio->sh;
+   if(demuxer->audio->id != -2 && sh_a) {
+#ifdef HAVE_OGGVORBIS
+    // support for Ogg-in-AVI:
+    if(sh_a->format == 0xFFFE)
+      demuxer = init_avi_with_ogg(demuxer);
+    else if(sh_a->format == 0x674F) {
+      stream_t* s;
+      demuxer_t  *od;
+      s = new_ds_stream(demuxer->audio);
+      od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL);
+      if(!demux_ogg_open(od)) {
+        mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer);
+        free_stream(s);
+        demuxer->audio->id = -2;
+      } else
+        demuxer = new_demuxers_demuxer(demuxer,od,demuxer);
+   }
+#endif
+   }
+
+   return demuxer;
+}
+
+
+demuxer_desc_t demuxer_desc_avi = {
+  "AVI demuxer",
+  "avi",
+  "AVI",
+  "Arpi?",
+  "AVI files, including non interleaved files",
+  DEMUXER_TYPE_AVI,
+  1, // safe autodetect
+  avi_check_file,
+  demux_avi_fill_buffer,
+  demux_open_hack_avi,
+  demux_close_avi,
+  demux_seek_avi,
+  NULL
+};