summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-29 20:25:32 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-29 20:25:32 +0000
commit1ad664ff860a70b86241bbfe91f870903a693e13 (patch)
tree3d7fd45e3d75d1cf22f76716709900ac4c1ffb3a /libmpdemux
parentc21e5653931e9ed3ca8780bc5915985b6d590f45 (diff)
downloadmpv-1ad664ff860a70b86241bbfe91f870903a693e13.tar.bz2
mpv-1ad664ff860a70b86241bbfe91f870903a693e13.tar.xz
- parsing the handler reference atom (hnlr), save handler fourccs
- support for dumping raw or un-zlib-ed packets of generic tracks (verbose>=3) - fixed a sig11 caused by too small stsd of video track git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8315 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_mov.c102
1 files changed, 98 insertions, 4 deletions
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index e8e315061b..c7f20d8b50 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -104,6 +104,9 @@ typedef struct {
int type;
off_t pos;
//
+ unsigned int media_handler;
+ unsigned int data_handler;
+ //
int timescale;
unsigned int length;
int samplesize; // 0 = variable
@@ -187,7 +190,7 @@ void mov_build_index(mov_track_t* trak,int timescale){
}
// workaround for fixed-size video frames (dv and uncompressed)
- if(!trak->samples_size && trak->type==MOV_TRAK_VIDEO){
+ if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){
trak->samples_size=s;
trak->samples=malloc(sizeof(mov_sample_t)*s);
for(i=0;i<s;i++)
@@ -480,6 +483,29 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
trak->length=stream_read_dword(demuxer->stream);
break;
}
+ case MOV_FOURCC('h','d','l','r'): {
+ unsigned int tmp=stream_read_dword(demuxer->stream);
+ unsigned int type=stream_read_dword_le(demuxer->stream);
+ unsigned int subtype=stream_read_dword_le(demuxer->stream);
+ unsigned int manufact=stream_read_dword_le(demuxer->stream);
+ unsigned int comp_flags=stream_read_dword(demuxer->stream);
+ unsigned int comp_mask=stream_read_dword(demuxer->stream);
+ int len=stream_read_char(demuxer->stream);
+ char* str=malloc(len+1);
+ stream_read(demuxer->stream,str,len);
+ str[len]=0;
+ mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sHandler header: %.4s/%.4s (%.4s) %s\n",level,"",&type,&subtype,&manufact,str);
+ free(str);
+ switch(bswap_32(type)){
+ case MOV_FOURCC('m','h','l','r'):
+ trak->media_handler=bswap_32(subtype); break;
+ case MOV_FOURCC('d','h','l','r'):
+ trak->data_handler=bswap_32(subtype); break;
+ default:
+ mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown handler class: 0x%X (%.4s)\n",bswap_32(type),&type);
+ }
+ break;
+ }
case MOV_FOURCC('v','m','h','d'): {
mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sVideo header!\n",level,"");
trak->type=MOV_TRAK_VIDEO;
@@ -934,7 +960,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
memcpy(&id->name,trak->stdata+42,32);
id->depth=char2short(trak->stdata,74);
id->clutID=char2short(trak->stdata,76);
- memcpy(((char*)&id->clutID)+2,trak->stdata+78,trak->stdata_len-78);
+ if(trak->stdata_len>78) memcpy(((char*)&id->clutID)+2,trak->stdata+78,trak->stdata_len-78);
sh->ImageDesc=id;
#if 0
{ FILE *f=fopen("ImageDescription","wb");
@@ -1123,14 +1149,14 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
mp_msg(MSGT_DEMUX, MSGL_INFO, "Generic track - not completly understood! (id: %d)\n",
trak->id);
/* XXX: 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];
@@ -1388,6 +1414,74 @@ int mov_read_header(demuxer_t* demuxer){
lschunks(demuxer, 0, priv->moov_end, NULL);
// mp_msg(MSGT_DEMUX, MSGL_INFO, "--------------\n");
+#if 1
+ if(verbose>2){
+ int t_no;
+ for(t_no=0;t_no<priv->track_db;t_no++){
+ mov_track_t* trak=priv->tracks[t_no];
+ if(trak->type==MOV_TRAK_GENERIC){
+ int i;
+ int fd;
+ char name[20];
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: Track #%d: Extracting %d data chunks to files\n",t_no,trak->samples_size);
+ for (i=0; i<trak->samples_size; i++)
+ {
+ int len=trak->samples[i].size;
+ char buf[len];
+ stream_seek(demuxer->stream, trak->samples[i].pos);
+ snprintf(name, 20, "t%02d-s%03d.%s", t_no,i,
+ (trak->media_handler==MOV_FOURCC('f','l','s','h')) ?
+ "swf":"dump");
+ fd = open(name, O_CREAT|O_WRONLY);
+// { int j;
+// for(j=0;j<trak->stdata_len-3; j++)
+// printf("stdata[%d]=0x%X ize=0x%X\n",j,char2int(trak->stdata,j),MOV_FOURCC('z','l','i','b'));
+// }
+ if( //trak->media_handler==MOV_FOURCC('s','p','r','t') &&
+ trak->stdata_len>=16 &&
+ char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b')
+ ){
+ int newlen=stream_read_dword(demuxer->stream);
+#ifdef HAVE_ZLIB
+ // unzip:
+ z_stream zstrm;
+ int zret;
+ char buf2[newlen];
+
+ len-=4;
+ stream_read(demuxer->stream, buf, len);
+
+ zstrm.zalloc = (alloc_func)0;
+ zstrm.zfree = (free_func)0;
+ zstrm.opaque = (voidpf)0;
+ zstrm.next_in = buf;
+ zstrm.avail_in = len;
+ zstrm.next_out = buf2;
+ zstrm.avail_out = newlen;
+
+ zret = inflateInit(&zstrm);
+ zret = inflate(&zstrm, Z_NO_FLUSH);
+ if(newlen != zstrm.total_out)
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! unzipped frame size differs hdr: %d zlib: %d\n",newlen,zstrm.total_out);
+
+ write(fd, buf2, newlen);
+ } else {
+#else
+ len-=4;
+ printf("******* ZLIB COMPRESSED SAMPLE!!!!! (%d->%d bytes) *******\n",len,newlen);
+ }
+ {
+#endif
+ stream_read(demuxer->stream, buf, len);
+ write(fd, buf, len);
+ }
+ close(fd);
+ }
+ }
+ }
+ }
+#endif
+
return 1;
}