summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_nsv.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-30 19:06:55 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-30 19:06:55 +0000
commitb79c4cc29318c4070d49bf348319b5848a0eb4e8 (patch)
tree41835ff03eefc8e8f235054a3bc71b21db03481a /libmpdemux/demux_nsv.c
parent80add42cc209c87e0dd4bdc205bc59a84f6bc9d6 (diff)
downloadmpv-b79c4cc29318c4070d49bf348319b5848a0eb4e8.tar.bz2
mpv-b79c4cc29318c4070d49bf348319b5848a0eb4e8.tar.xz
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. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16319 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_nsv.c')
-rw-r--r--libmpdemux/demux_nsv.c77
1 files changed, 30 insertions, 47 deletions
diff --git a/libmpdemux/demux_nsv.c b/libmpdemux/demux_nsv.c
index 16a602fb1c..92942599e5 100644
--- a/libmpdemux/demux_nsv.c
+++ b/libmpdemux/demux_nsv.c
@@ -28,6 +28,9 @@ typedef struct {
unsigned char fps;
} nsv_priv_t;
+#define HEADER_SEARCH_SIZE 65000
+
+
/**
* Seeking still to be implemented
*/
@@ -152,42 +155,6 @@ static demuxer_t* demux_open_nsv ( demuxer_t* demuxer )
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 demuxer_t* demux_open_nsv ( demuxer_t* demuxer )
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;
+
+ 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 DEMUXER_TYPE_NSV;
+ return 0;
}
static void demux_close_nsv(demuxer_t* demuxer) {
@@ -352,7 +335,7 @@ demuxer_desc_t demuxer_desc_nsv = {
"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,