changeset 5067:54fe37e1f1a7

some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
author arpi
date Thu, 14 Mar 2002 02:26:49 +0000
parents b3d900e9a215
children 64bf084309cf
files libmpdemux/demux_mov.c
diffstat 1 files changed, 55 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mov.c	Wed Mar 13 15:33:55 2002 +0000
+++ b/libmpdemux/demux_mov.c	Thu Mar 14 02:26:49 2002 +0000
@@ -76,6 +76,7 @@
     unsigned char* tkdata;
     int stdata_len;  // stream data
     unsigned char* stdata;
+    //
     int samples_size;
     mov_sample_t* samples;
     int chunks_size;
@@ -347,18 +348,15 @@
 		    off_t len=stream_read_dword(demuxer->stream);
 		    unsigned int fourcc=stream_read_dword_le(demuxer->stream);
 		    if(len<8) break; // error
-		    mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s desc #%d: %.4s",level,"",i,&fourcc);
+		    mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s desc #%d: %.4s  (%d bytes)\n",level,"",i,&fourcc,len-16);
 		    if(!i){
 			trak->fourcc=fourcc;
-			// read codec data
+			// read type specific (audio/video/time/text etc) header
+			// NOTE: trak type is not yet known at this point :(((
 			trak->stdata_len=len-8;
 			trak->stdata=malloc(trak->stdata_len);
 			stream_read(demuxer->stream,trak->stdata,trak->stdata_len);
-			if(trak->type==MOV_TRAK_VIDEO && trak->stdata_len>43){
-			    mp_msg(MSGT_DEMUX,MSGL_V," '%.*s'",trak->stdata_len-43,trak->stdata+43);
-			}
 		    }
-		    mp_msg(MSGT_DEMUX,MSGL_V,"\n");
 		    if(fourcc!=trak->fourcc && i)
 			mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MOVvariableFourCC);
 		    if(!stream_seek(demuxer->stream,pos+len)) break;
@@ -549,6 +547,22 @@
 	    case MOV_TRAK_AUDIO: {
 		sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
 		sh->format=trak->fourcc;
+
+//  stdata[]:
+//	8   short	version
+//	10  short	revision
+//	12  int		vendor_id
+//	16  short	channels
+//	18  short	samplesize
+//	20  short	compression_id
+//	22  short	packet_size (==0)
+//	24  int		sample_rate
+//    ---- qt3.0+
+//	28  int		samples_per_packet
+//	32  int		bytes_per_packet
+//	36  int		bytes_per_frame
+//	40  int		bytes_per_sample
+
 		mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d  chans: %d\n",trak->stdata[19],trak->stdata[17]);
 		mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s\n",&trak->fourcc);
 #if 0
@@ -578,20 +592,44 @@
 	    case MOV_TRAK_VIDEO: {
 		int i, entry;
 		int flag, start, count_flag, end, palette_count;
-		int hdr_ptr = 43+33;  // the byte just after depth
+		int hdr_ptr = 76;  // the byte just after depth
 		unsigned char *palette_map;
 		sh_video_t* sh=new_sh_video(demuxer,priv->track_db);
-		int depth = trak->stdata[43+32]; /* requested by Mike Melanson for Apple RLE decoder -- alex */
+		int depth = trak->stdata[75]|(trak->stdata[74]<<8);
 		sh->format=trak->fourcc;
+
+//  stdata[]:
+//	8   short	version
+//	10  short	revision
+//	12  int		vendor_id
+//	16  int		temporal_quality
+//	20  int		spatial_quality
+//	24  short	width
+//	26  short	height
+//	28  int		h_dpi
+//	32  int		v_dpi
+//	36  int		0
+//	40  short	frames_per_sample
+//	42  char[32]	compressor_name
+//	74  short	depth
+//	76  short	color_table_id
+
 		if(!sh->fps) sh->fps=trak->timescale;
 		sh->frametime=1.0f/sh->fps;
+#if 0
 		sh->disp_w=trak->tkdata[77]|(trak->tkdata[76]<<8);
 		sh->disp_h=trak->tkdata[81]|(trak->tkdata[80]<<8);
+#else
+		sh->disp_w=trak->stdata[25]|(trak->stdata[24]<<8);
+		sh->disp_h=trak->stdata[27]|(trak->stdata[26]<<8);
+#endif		
+
+		if(depth&(~15)) printf("*** depht = 0x%X\n",depth);
 
 		// palettized?
-		if ((depth == 2) || (depth == 4) || (depth == 8) ||
-		  (depth == 34) || (depth == 36) || (depth == 40))
-		  palette_count = (1 << (depth & 0x0F));
+		depth&=31; // flag 32 means grayscale
+		if ((depth == 2) || (depth == 4) || (depth == 8))
+		  palette_count = (1 << depth);
 		else
 		  palette_count = 0;
 
@@ -655,8 +693,12 @@
 		sh->bih->biCompression=trak->fourcc;
 		sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight;
 
-		mp_msg(MSGT_DEMUX, MSGL_INFO, "Image size: %d x %d (%dbits)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount);
-		mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s  Codec: '%.*s'\n",&trak->fourcc,trak->stdata_len-43,trak->stdata+43);
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Image size: %d x %d (%d bpp)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount);
+		if(trak->tkdata_len>81)
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Display size: %d x %d\n",
+		    trak->tkdata[77]|(trak->tkdata[76]<<8),
+		    trak->tkdata[81]|(trak->tkdata[80]<<8));
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s  Codec: '%.*s'\n",&trak->fourcc,trak->stdata[42]&31,trak->stdata+43);
 		
 		if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){
 		    // (auto)selected video track: