changeset 16318:e27998eeb54a

Fix nsv detection with new demuxer structure With old method there was an hack to skip detection for streamed nsv, because demuxer did the chek only on first 4 bytes and live nsv streams starts at random place in the file. The detection code was changed to search for nsv signature in the first 64k of the file. The check was changed to "unsafe" and thus moved later because now is more expensive.
author rtognimp
date Tue, 30 Aug 2005 19:06:55 +0000
parents 458c83408fd7
children 798d9be2337f
files libmpdemux/demux_nsv.c
diffstat 1 files changed, 30 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_nsv.c	Tue Aug 30 16:32:45 2005 +0000
+++ b/libmpdemux/demux_nsv.c	Tue Aug 30 19:06:55 2005 +0000
@@ -28,6 +28,9 @@
     unsigned char fps;            
 } nsv_priv_t;
 
+#define HEADER_SEARCH_SIZE 65000
+
+
 /**
  * Seeking still to be implemented
  */
@@ -152,42 +155,6 @@
     stream_read(demuxer->stream,hdr,4);
     if(stream_eof(demuxer->stream)) return 0;
     
-    /*** if we detected the file to be nsv and there was neither eof nor a header
-    **** that means that its most likely a shoutcast stream so we will need to seek
-    **** to the first occurance of the NSVs header                      ****/
-    if(!(hdr[0]==0x4E && hdr[1]==0x53 && hdr[2]==0x56)){
-        // todo: replace this with a decent string search algo 
-        while(1){
-            stream_read(demuxer->stream,hdr,1);
-            if(stream_eof(demuxer->stream)) 
-                return 0;
-            if(hdr[0]!=0x4E)
-                continue;
-                
-            stream_read(demuxer->stream,hdr+1,1);
-            
-            if(stream_eof(demuxer->stream)) 
-                return 0;
-            if(hdr[1]!=0x53)
-                continue;
-                
-            stream_read(demuxer->stream,hdr+2,1);
-            
-            if(stream_eof(demuxer->stream)) 
-                return 0;
-            if(hdr[2]!=0x56)
-                continue;
-                
-            stream_read(demuxer->stream,hdr+3,1);
-            
-            if(stream_eof(demuxer->stream)) 
-                return 0;
-            if(hdr[3]!=0x73)
-                continue;
-            
-            break;
-        }
-    }
     if(hdr[0]==0x4E && hdr[1]==0x53 && hdr[2]==0x56){
         // NSV header!
         if(hdr[3]==0x73){
@@ -316,23 +283,39 @@
 
 static int nsv_check_file ( demuxer_t* demuxer )
 {
-    unsigned int id;
+    unsigned char hdr;
+    int i;
 
     /* Store original position */
 //  off_t orig_pos = stream_tell(demuxer->stream);
 
     mp_msg ( MSGT_DEMUX, MSGL_V, "Checking for Nullsoft Streaming Video\n" );
    
-    //---- check NSVx header:
-    id=stream_read_dword_le(demuxer->stream);
-    if(id!=mmioFOURCC('N','S','V','f') && id!=mmioFOURCC('N','S','V','s'))
-        return 0; // not an NSV file
-    
-    stream_reset(demuxer->stream); // clear EOF
-    stream_seek(demuxer->stream,demuxer->stream->start_pos);
+    for (i = 0; i < HEADER_SEARCH_SIZE; i++) {
+        if (stream_read_char(demuxer->stream) != 'N')
+            continue;
+        if(stream_eof(demuxer->stream))
+            return 0;
 
-    
-    return DEMUXER_TYPE_NSV;
+        if (stream_read_char(demuxer->stream) != 'S')
+            continue;
+        if(stream_eof(demuxer->stream))
+            return 0;
+        if (stream_read_char(demuxer->stream) != 'V')
+            continue;
+        if(stream_eof(demuxer->stream))
+            return 0;
+
+        hdr = stream_read_char(demuxer->stream);
+        if(stream_eof(demuxer->stream)) 
+            return 0;
+        if((hdr == 'f') || (hdr == 's')) {
+            stream_seek(demuxer->stream,stream_tell(demuxer->stream)-4);
+            return DEMUXER_TYPE_NSV;
+        }
+    }
+
+    return 0;
 }
 
 static void demux_close_nsv(demuxer_t* demuxer) {
@@ -352,7 +335,7 @@
   "Reza Jelveh",
   "nsv and nsa streaming files",
   DEMUXER_TYPE_NSV,
-  1, // safe autodetect
+  0, // safe but expensive autodetect
   nsv_check_file,
   demux_nsv_fill_buffer,
   demux_open_nsv,