1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-02 04:11:03 +00:00

- 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
This commit is contained in:
arpi 2002-11-29 20:25:32 +00:00
parent c21e565393
commit 1ad664ff86

View File

@ -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;
}