[MPlayer-dev-eng] PATCH 2: large (.mov) files
Alex Beregszaszi
alex at naxine.org
Sat Jan 5 20:23:40 CET 2002
Hi,
On Sat, Jan 05, 2002 at 12:44:15AM -0600, Chris Bednar wrote:
> On Fri, 4 Jan 2002, Chris Bednar wrote:
>
> > Actually, the problem is in the .mov code. An atom can
> > have a size bigger than 4GB, in which case, the size is set
> > to 1, and a 64-bit number follows. Also, the big file I have
>
> <snip some nonsense; sorry>
>
> OK; here's a patch to the .mov code that handles atoms with 64-bit
> sizes. I'm not sure if it's pretty, and you may not want my initials
> in there, but it does work, and I can watch/encode huge QT movies.
Thanx, i applied your patch, and fixed the co64 chunk parser.
>
> Enjoy
>
>
> ---- ``Windows: It does that sometimes.'' -mattdm
> Chris J. Bednar
> Director, Distributed Computing Product Group
> http://AdvancedDataSolutions.com/
>
> ------------------------------
> --- MPlayer-0.60/libmpdemux/stream.h.extendedsize Sat Jan 5 00:04:07 2002
> +++ MPlayer-0.60/libmpdemux/stream.h Sat Jan 5 00:04:07 2002
> @@ -80,6 +80,19 @@
> return y;
> }
>
> +inline static uint64_t stream_read_qword(stream_t *s){
> + uint64_t y;
> + y=stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + y=(y<<8)|stream_read_char(s);
> + return y;
> +}
> +
> inline static unsigned int stream_read_word_le(stream_t *s){
> int x,y;
> x=stream_read_char(s);
> --- MPlayer-0.60/libmpdemux/demux_mov.c.extendedsize Fri Dec 21 18:33:35 2001
> +++ MPlayer-0.60/libmpdemux/demux_mov.c Sat Jan 5 00:11:47 2002
> @@ -200,19 +200,25 @@
> while(1){
> off_t len=stream_read_dword(demuxer->stream);
> unsigned int id=stream_read_dword(demuxer->stream);
> - if(stream_eof(demuxer->stream)) break; // EOF
> - if(len<8) break; // invalid chunk
> + int scoot = 8;
> + if(stream_eof(demuxer->stream)) break; //EOF
> + if (len == 1) /* Real size is 64 bits - cjb */
> + {
> + len = stream_read_qword (demuxer->stream);
> + scoot += 8;
> + }
> + else if(len<8) break; //Actually, 0 has a meaning; ``This is the last chunk'' - cjb
> switch(id){
> case MOV_FOURCC('m','o','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-8;
> + priv->moov_end=priv->moov_start+len-scoot;
> 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-8;
> + priv->mdat_end=priv->mdat_start+len-scoot;
> flags|=2;
> break;
> case MOV_FOURCC('f','r','e','e'):
> @@ -226,7 +232,7 @@
> id = bswap_32(id);
> mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",&id,(int)len);
> }
> - if(!stream_skip(demuxer->stream,len-8)) break;
> + if(!stream_skip(demuxer->stream,len-scoot)) break;
> ++no;
> }
>
>
> _______________________________________________
> MPlayer-dev-eng mailing list
> MPlayer-dev-eng at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
More information about the MPlayer-dev-eng
mailing list