1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-28 10:02:17 +00:00

workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5086 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
alex 2002-03-15 15:57:57 +00:00
parent d8c34022bb
commit edf006b12f

View File

@ -99,7 +99,7 @@ void mov_build_index(mov_track_t* trak){
{
mp_msg(MSGT_DEMUX, MSGL_WARN, "No chunk offset table, trying to build one!\n");
trak->chunks_size = trak->samples_size;
trak->chunks_size = trak->samples_size; /* XXX: FIXME ! */
trak->chunks = realloc(trak->chunks, sizeof(mov_chunk_t)*trak->chunks_size);
for (i=0; i < trak->chunks_size; i++)
@ -223,32 +223,44 @@ int mov_check_file(demuxer_t* demuxer){
#endif
skipped += 8;
}
else if (len == 0) /* deleted chunk */
{
/* XXX: CJB! is this right? - alex */
goto skip_chunk;
}
else if(len<8) break; // invalid chunk
switch(id){
case MOV_FOURCC('m','o','o','v'):
// case MOV_FOURCC('c','m','o','v'):
mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie header found!\n");
priv->moov_start=stream_tell(demuxer->stream);
priv->moov_end=priv->moov_start+len-skipped;
priv->moov_start=(off_t)stream_tell(demuxer->stream);
priv->moov_end=(off_t)priv->moov_start+len-skipped;
mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: Movie header: start: %x end: %x\n",
priv->moov_start, priv->moov_end);
flags|=1;
break;
case MOV_FOURCC('m','d','a','t'):
mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie DATA found!\n");
priv->mdat_start=stream_tell(demuxer->stream);
priv->mdat_end=priv->mdat_start+len-skipped;
mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: Movie data: start: %x end: %x\n",
priv->mdat_start, priv->mdat_end);
flags|=2;
break;
case MOV_FOURCC('f','r','e','e'):
case MOV_FOURCC('s','k','i','p'):
/* unused, if you edit a mov, you can use space provided by free atoms (redefining it) */
break;
case MOV_FOURCC('w','i','d','e'):
case MOV_FOURCC('j','u','n','k'):
mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: free space (len: %d)\n", len);
/* unused, if you edit a mov, you can use space provided by free atoms (redefining it) */
break;
default:
if(no==0) return 0; // first chunk is bad!
id = be2me_32(id);
mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",&id,(int)len);
}
skip_chunk:
if(!stream_skip(demuxer->stream,len-skipped)) break;
++no;
}
@ -263,6 +275,7 @@ return (flags==3);
static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak){
mov_priv_t* priv=demuxer->priv;
// printf("lschunks (level=%d,endpos=%x)\n", level, endpos);
while(1){
off_t pos;
off_t len;
@ -281,6 +294,10 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
//
if(trak){
switch(id){
case MOV_FOURCC('m','d','a','t'): {
mp_msg(MSGT_DEMUX,MSGL_WARN,"Hmm, strange MOV, parsing mdat in lschunks?\n");
return;
}
case MOV_FOURCC('f','r','e','e'):
case MOV_FOURCC('u','d','t','a'):
/* here not supported :p */
@ -380,8 +397,8 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
if(i==0 && trak->type == MOV_TRAK_VIDEO)
{
sh_video_t* sh=new_sh_video(demuxer,priv->track_db);
if (!sh->fps)
sh_video_t* sh=get_sh_video(demuxer,priv->track_db);
if (sh && !sh->fps)
sh->fps = trak->timescale/trak->durmap[i].dur;
/* initial fps */
}
@ -521,7 +538,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
}
case MOV_FOURCC('c','o','d','e'):
{
#warning "Implement atom 'code' for FLASH support"
/* XXX: Implement atom 'code' for FLASH support */
}
default:
id = be2me_32(id);
@ -649,6 +666,12 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
end = BE_16(&trak->stdata[hdr_ptr]);
hdr_ptr += 2;
palette_map = (unsigned char *)sh->bih + 40;
mp_msg(MSGT_DEMUX, MSGL_INFO, "Allocated %d entries for palette\n",
palette_count);
mp_msg(MSGT_DEMUX, MSGL_DBG2, "QT palette: start: %x, end: %x, count flag: %d, flags: %x\n",
start, end, count_flag, flag);
/* XXX: problems with sample (statunit6.mov) with flag&0x4 set! - alex*/
// load default palette
if (flag & 0x08)
@ -673,9 +696,20 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
if (count_flag & 0x8000)
entry = i;
// only care about top 8 bits of 16-bit R, G, or B value
palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0];
palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2];
palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4];
if (entry <= palette_count && entry >= 0)
{
palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0];
palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2];
palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4];
mp_dbg(MSGT_DEMUX, MSGL_DBG2, "QT palette: added entry: %d of %d (colors: R:%x G:%x B:%x)\n",
entry, palette_count,
palette_map[entry * 4 + 2],
palette_map[entry * 4 + 1],
palette_map[entry * 4 + 0]);
}
else
mp_msg(MSGT_DEMUX, MSGL_V, "QT palette: skipped entry (out of count): %d of %d\n",
entry, palette_count);
hdr_ptr += 6;
}
}
@ -710,7 +744,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
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"
/* 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");
{
@ -770,6 +804,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
return;
}
#else
case MOV_FOURCC('m','o','o','v'):
case MOV_FOURCC('c','m','o','v'): {
// mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_MOVcomprhdr);
lschunks(demuxer,level+1,pos+len,NULL);
@ -777,8 +812,8 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
}
case MOV_FOURCC('d','c','o','m'): {
// int temp=stream_read_dword(demuxer->stream);
unsigned int len=be2me_32(stream_read_dword(demuxer->stream));
mp_msg(MSGT_DEMUX, MSGL_INFO, "Compressed header uses %.4s algo!\n",&len);
unsigned int algo=be2me_32(stream_read_dword(demuxer->stream));
mp_msg(MSGT_DEMUX, MSGL_INFO, "Compressed header uses %.4s algo!\n",&algo);
break;
}
case MOV_FOURCC('c','m','v','d'): {
@ -966,7 +1001,12 @@ int mov_read_header(demuxer_t* demuxer){
// Parse header:
stream_reset(demuxer->stream);
if(!stream_seek(demuxer->stream,priv->moov_start)) return 0; // ???
if(!stream_seek(demuxer->stream,priv->moov_start))
{
mp_msg(MSGT_DEMUX,MSGL_ERR,"MOV: Cannot seek to the beginning of the Movie header (0x%x)\n",
priv->moov_start);
return 0;
}
lschunks(demuxer, 0, priv->moov_end, NULL);
return 1;
@ -1014,9 +1054,9 @@ if(trak->samplesize){
x*=(trak->stdata[18]<<8)+trak->stdata[19];x/=8; // bits/sample
}
}
mp_msg(MSGT_DEMUX, MSGL_DBG2, "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts);
} /* MOV_TRAK_AUDIO */
ds_read_packet(ds,demuxer->stream,x,pts,trak->chunks[trak->pos].pos,0);
if(ds==demuxer->audio) mp_msg(MSGT_DEMUX, MSGL_DBG2, "sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts);
} else {
// read sample:
if(trak->pos>=trak->samples_size) return 0; // EOF