changeset 2786:1907e5771e81

added pre-flash detecting support ;)
author alex
date Fri, 09 Nov 2001 17:00:12 +0000
parents c70b93e738e1
children 8dfe10c9f15d
files libmpdemux/demux_mov.c
diffstat 1 files changed, 68 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mov.c	Fri Nov 09 16:37:05 2001 +0000
+++ b/libmpdemux/demux_mov.c	Fri Nov 09 17:00:12 2001 +0000
@@ -22,6 +22,8 @@
 #include <zlib.h>
 #endif
 
+#include <fcntl.h>
+
 typedef struct {
     unsigned int pts; // duration
     unsigned int size;
@@ -140,6 +142,7 @@
 #define MOV_TRAK_VIDEO 1
 #define MOV_TRAK_AUDIO 2
 #define MOV_TRAK_FLASH 3
+#define MOV_TRAK_GENERIC 4
 
 typedef struct {
     off_t moov_start;
@@ -266,6 +269,11 @@
 		// read audio data
 		break;
 	    }
+	    case MOV_FOURCC('g','m','h','d'): {
+		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sGeneric header!\n",level,"");
+		trak->type=MOV_TRAK_GENERIC;
+		break;
+	    }
 	    case MOV_FOURCC('s','t','s','d'): {
 		int i=stream_read_dword(demuxer->stream); // temp!
 		int count=stream_read_dword(demuxer->stream);
@@ -308,7 +316,7 @@
 		    trak->durmap[i].dur=stream_read_dword(demuxer->stream);
 		    pts+=trak->durmap[i].num*trak->durmap[i].dur;
 		    
-		    if(i==0)
+		    if(i==0 && trak->type == MOV_TRAK_VIDEO)
 		    {
 		    sh_video_t* sh=new_sh_video(demuxer,priv->track_db);
 		    if (!sh->fps)
@@ -345,20 +353,16 @@
 		int entries=stream_read_dword(demuxer->stream);
 		int i;
 		
-		trak->samplesize=ss;
-		if (ss)
-		{
-		    mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample size table! (fixed ss=%d) (ver:%d,flags:%ld)\n",
-			level,"",ss,ver,flags);
-		    break;
-		}
 		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%ld)\n",
 		    level,"",entries,ss,ver,flags);
-		// variable samplesize
-		trak->samples=realloc(trak->samples,sizeof(mov_sample_t)*entries);
-		trak->samples_size=entries;
-		for(i=0;i<entries;i++)
+		trak->samplesize=ss;
+		if (!ss) {
+		  // variable samplesize
+		  trak->samples=realloc(trak->samples,sizeof(mov_sample_t)*entries);
+		  trak->samples_size=entries;
+		  for(i=0;i<entries;i++)
 		    trak->samples[i].size=stream_read_dword(demuxer->stream);
+		}
 		break;
 	    }
 	    case MOV_FOURCC('s','t','c','o'): {
@@ -430,6 +434,10 @@
 #endif
 		break;
 	    }
+	    case MOV_FOURCC('c','o','d','e'):
+	    {
+#warning Implement atom 'code' for FLASH
+	    }
 	    default:
 		id = bswap_32(id);
 		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",&id,(int)len);
@@ -509,6 +517,54 @@
 		}
 		break;
 	    }
+	    case MOV_TRAK_GENERIC:
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Generic track - not completly understood! (id: %d)\n",
+		    trak->id);
+#warning Also this contains the FLASH data
+#if 0
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Extracting samples to files (possibly this is an flash anim)\n");
+	    {
+		int pos = stream_tell(demuxer->stream);
+		int i;
+		int fd;
+		char name[20];
+		
+		for (i=0; i<trak->samples_size; i++)
+		{
+		    char buf[trak->samples[i].size];
+		    stream_seek(demuxer->stream, trak->samples[i].pos);
+		    snprintf((char *)&name[0], 20, "samp%d", i);
+		    fd = open((char *)&name[0], O_CREAT|O_WRONLY);
+		    stream_read(demuxer->stream, &buf[0], trak->samples[i].size);
+		    write(fd, &buf[0], trak->samples[i].size);
+		    close(fd);
+		 }
+		for (i=0; i<trak->chunks_size; i++)
+		{
+		    char buf[trak->length];
+		    stream_seek(demuxer->stream, trak->chunks[i].pos);
+		    snprintf((char *)&name[0], 20, "chunk%d", i);
+		    fd = open((char *)&name[0], O_CREAT|O_WRONLY);
+		    stream_read(demuxer->stream, &buf[0], trak->length);
+		    write(fd, &buf[0], trak->length);
+		    close(fd);
+		 }
+		 if (trak->samplesize > 0)
+		 {
+		    char *buf;
+		    
+		    buf = malloc(trak->samplesize);
+		    stream_seek(demuxer->stream, trak->chunks[0].pos);
+		    snprintf((char *)&name[0], 20, "trak%d", trak->id);
+		    fd = open((char *)&name[0], O_CREAT|O_WRONLY);
+		    stream_read(demuxer->stream, buf, trak->samplesize);
+		    write(fd, buf, trak->samplesize);
+		    close(fd);
+		 }
+		 stream_seek(demuxer->stream, pos);
+	    }		
+#endif
+		break;
 	    default:
 		mp_msg(MSGT_DEMUX, MSGL_INFO, "Unknown track type found (type: %d)\n", trak->type);
 		break;