⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demux_mov.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 5 页
字号:
	    skipped += 4;	  }#endif	  	  } break;	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=(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);	  skipped+=8;	  i = stream_read_dword(demuxer->stream)-8;	  if(stream_read_dword(demuxer->stream)==MOV_FOURCC('r','m','r','a')){	      int ref=0;	      skipped+=i;	      mp_msg(MSGT_DEMUX,MSGL_INFO,"MOV: Reference Media file!!!\n");	      //set demuxer type to playlist ...	      demuxer->type=DEMUXER_TYPE_PLAYLIST;	      while(i>0){	          int len=stream_read_dword(demuxer->stream)-8;		  int fcc=stream_read_dword(demuxer->stream);		  if(len<0) break; // EOF!?		  i-=8;//		  printf("i=%d  len=%d\n",i,len);		  switch(fcc){		  case MOV_FOURCC('r','m','d','a'):		      continue;		  case MOV_FOURCC('r','d','r','f'): {		      int tmp=stream_read_dword(demuxer->stream);		      int type=stream_read_dword_le(demuxer->stream);	              int slen=stream_read_dword(demuxer->stream);		      //char* s=malloc(slen+1);		      //stream_read(demuxer->stream,s,slen);		      		      //FIXME: also store type & data_rate ?		      ds_read_packet(demuxer->video, 			demuxer->stream,			slen,			0,			stream_tell(demuxer->stream),			0 // no flags 		      );		      flags|=4;		      mp_msg(MSGT_DEMUX,MSGL_V,"Added reference to playlist\n");		      //s[slen]=0;		      //mp_msg(MSGT_DEMUX,MSGL_INFO,"REF: [%.4s] %s\n",&type,s);		      len-=12+slen;i-=12+slen; break;		    }		  case MOV_FOURCC('r','m','d','r'): {		      int flags=stream_read_dword(demuxer->stream);		      int rate=stream_read_dword(demuxer->stream);		      mp_msg(MSGT_DEMUX,MSGL_V,"  min. data rate: %d bits/sec\n",rate);		      len-=8; i-=8; break;		    }		  case MOV_FOURCC('r','m','q','u'): {		      int q=stream_read_dword(demuxer->stream);		      mp_msg(MSGT_DEMUX,MSGL_V,"  quality index: %d\n",q);		      len-=4; i-=4; break;		    }		  }		  i-=len;stream_skip(demuxer->stream,len);	      }	  }	  flags|=1;	  break;	case MOV_FOURCC('w','i','d','e'):	  mp_msg(MSGT_DEMUX,MSGL_V,"MOV: 'WIDE' chunk found!\n");	  if(flags&2) 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;	  if(flags==3){	    // if we're over the headers, then we can stop parsing here!	    demuxer->priv=priv;	    return 1;	  }	  break;	case MOV_FOURCC('f','r','e','e'):	case MOV_FOURCC('s','k','i','p'):	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;	case MOV_FOURCC('p','n','o','t'):	case MOV_FOURCC('P','I','C','T'):	  /* dunno what, but we shoudl ignore it */	  break;	default:	  if(no==0){ free(priv); 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;    }    if(flags==3){	demuxer->priv=priv;	return 1;    }    free(priv);    if ((flags==5) || (flags==7)) // reference & header sent        return 1;    if(flags==1)	mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing data (mdat) chunk! Maybe broken file...\n");    else if(flags==2)	mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing header (moov/cmov) chunk! Maybe broken file...\n");    return 0;}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;	unsigned int id;	//	pos=stream_tell(demuxer->stream);//	printf("stream_tell==%d\n",pos);	if(pos>=endpos) return; // END	len=stream_read_dword(demuxer->stream);//	printf("len==%d\n",len);	if(len<8) return; // error	len-=8;	id=stream_read_dword(demuxer->stream);	//	mp_msg(MSGT_DEMUX,MSGL_DBG2,"lschunks %.4s  %d\n",&id,(int)len);	//	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 */		break;	    case MOV_FOURCC('t','k','h','d'): {		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sTrack header!\n",level,"");		// read codec data		trak->tkdata_len=len;		trak->tkdata=malloc(trak->tkdata_len);		stream_read(demuxer->stream,trak->tkdata,trak->tkdata_len);/*0  1 Version1  3 Flags4  4 Creation time8  4 Modification time12 4 Track ID16 4 Reserved20 4 Duration24 8 Reserved32 2 Layer34 2 Alternate group36 2 Volume38 2 Reserved40 36 Matrix structure76 4 Track width80 4 Track height*/		mp_msg(MSGT_DEMUX,MSGL_V,"tkhd len=%d ver=%d flags=0x%X id=%d dur=%d lay=%d vol=%d\n",		    trak->tkdata_len, trak->tkdata[0], trak->tkdata[1],		    char2int(trak->tkdata,12), // id		    char2int(trak->tkdata,20), // duration		    char2short(trak->tkdata,32), // layer		    char2short(trak->tkdata,36)); // volume		break;	    }	    case MOV_FOURCC('m','d','h','d'): {		unsigned int tmp;		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sMedia header!\n",level,"");#if 0		tmp=stream_read_dword(demuxer->stream);		printf("dword1: 0x%08X (%d)\n",tmp,tmp);		tmp=stream_read_dword(demuxer->stream);		printf("dword2: 0x%08X (%d)\n",tmp,tmp);		tmp=stream_read_dword(demuxer->stream);		printf("dword3: 0x%08X (%d)\n",tmp,tmp);		tmp=stream_read_dword(demuxer->stream);		printf("dword4: 0x%08X (%d)\n",tmp,tmp);		tmp=stream_read_dword(demuxer->stream);		printf("dword5: 0x%08X (%d)\n",tmp,tmp);		tmp=stream_read_dword(demuxer->stream);		printf("dword6: 0x%08X (%d)\n",tmp,tmp);#endif		stream_skip(demuxer->stream,12);		// read timescale		trak->timescale=stream_read_dword(demuxer->stream);		// read length		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;		// read video data		break;	    }	    case MOV_FOURCC('s','m','h','d'): {		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSound header!\n",level,"");		trak->type=MOV_TRAK_AUDIO;		// read audio data		break;	    }	    case MOV_FOURCC('g','m','h','d'): {		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sGeneric header!\n",level,"");		trak->type=MOV_TRAK_GENERIC;		break;	    }	    case MOV_FOURCC('n','m','h','d'): {		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sGeneric header!\n",level,"");		trak->type=MOV_TRAK_GENERIC;		break;	    }	    case MOV_FOURCC('s','t','s','d'): {		int i=stream_read_dword(demuxer->stream); // temp!		int count=stream_read_dword(demuxer->stream);		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sDescription list! (cnt:%d)\n",level,"",count);		for(i=0;i<count;i++){		    off_t pos=stream_tell(demuxer->stream);		    off_t len=stream_read_dword(demuxer->stream);		    unsigned int fourcc=stream_read_dword_le(demuxer->stream);		    /* some files created with Broadcast 2000 (e.g. ilacetest.mov)		       contain raw I420 video but have a yv12 fourcc */		    if(fourcc==mmioFOURCC('y','v','1','2')) fourcc=mmioFOURCC('I','4','2','0');		    if(len<8) break; // error		    mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s desc #%d: %.4s  (%d bytes)\n",level,"",i,&fourcc,len-16);		    if(fourcc!=trak->fourcc && i)			mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MOVvariableFourCC);//		    if(!i)		    {			trak->fourcc=fourcc;			// 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(!stream_seek(demuxer->stream,pos+len)) break;		}		break;	    }	    case MOV_FOURCC('s','t','t','s'): {		int temp=stream_read_dword(demuxer->stream);		int len=stream_read_dword(demuxer->stream);		int i;		unsigned int pts=0;		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample duration table! (%d blocks)\n",level,"",len);		trak->durmap=malloc(sizeof(mov_durmap_t)*len);		memset(trak->durmap,0,sizeof(mov_durmap_t)*len);		trak->durmap_size=len;		for(i=0;i<len;i++){		    trak->durmap[i].num=stream_read_dword(demuxer->stream);		    trak->durmap[i].dur=stream_read_dword(demuxer->stream);		    pts+=trak->durmap[i].num*trak->durmap[i].dur;		}		if(trak->length!=pts) mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! pts=%d  length=%d\n",pts,trak->length);		break;	    }	    case MOV_FOURCC('s','t','s','c'): {		int temp=stream_read_dword(demuxer->stream);		int len=stream_read_dword(demuxer->stream);		int ver = (temp << 24);		int flags = (temp << 16)|(temp<<8)|temp;		int i;		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample->Chunk mapping table!  (%d blocks) (ver:%d,flags:%ld)\n",		    level,"",len,ver,flags);		// read data:		trak->chunkmap_size=len;		trak->chunkmap=malloc(sizeof(mov_chunkmap_t)*len);		for(i=0;i<len;i++){		    trak->chunkmap[i].first=stream_read_dword(demuxer->stream)-1;		    trak->chunkmap[i].spc=stream_read_dword(demuxer->stream);		    trak->chunkmap[i].sdid=stream_read_dword(demuxer->stream);		}		break;	    }	    case MOV_FOURCC('s','t','s','z'): {		int temp=stream_read_dword(demuxer->stream);		int ss=stream_read_dword(demuxer->stream);		int ver = (temp << 24);		int flags = (temp << 16)|(temp<<8)|temp;		int entries=stream_read_dword(demuxer->stream);		int i;				mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%ld)\n",		    level,"",entries,ss,ver,flags);		trak->samplesize=ss;		if (!ss) {		  // variable samplesize		  trak->samples=realloc(trak->samples,sizeof(mov_sample_t)*entries);		  trak->samples_size=entries;		  for(i=0;i<entries;i++)		    trak->samples[i].size=stream_read_dword(demuxer->stream);		}		break;	    }	    case MOV_FOURCC('s','t','c','o'): {		int temp=stream_read_dword(demuxer->stream);		int len=stream_read_dword(demuxer->stream);		int i;		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sChunk offset table! (%d chunks)\n",level,"",len);		// extend array if needed:		if(len>trak->chunks_size){		    trak->chunks=realloc(trak->chunks,sizeof(mov_chunk_t)*len);		    trak->chunks_size=len;		}		// read elements:		for(i=0;i<len;i++) trak->chunks[i].pos=stream_read_dword(demuxer->stream);		break;	    }	    case MOV_FOURCC('c','o','6','4'): {		int temp=stream_read_dword(demuxer->stream);		int len=stream_read_dword(demuxer->stream);		int i;		mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s64bit chunk offset table! (%d chunks)\n",level,"",len);		// extend array if needed:		if(len>trak->chunks_size){		    trak->chunks=realloc(trak->chunks,sizeof(mov_chunk_t)*len);		    trak->chunks_size=len;		}		// read elements:		for(i=0;i<len;i++)		{#ifndef	_LARGEFILE_SOURCE		    if (stream_read_dword(demuxer->stream) != 0)			mp_msg(MSGT_DEMUX, MSGL_WARN, "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i);		    trak->chunks[i].pos = stream_read_dword(demuxer->stream);#else		    trak->chunks[i].pos = stream_read_qword(demuxer->stream);#endif		}		break;	    }	    case MOV_FOURCC('s','t','s','s'): {		int temp=stream_read_dword(demuxer->stream);		int entries=stream_read_dword(demuxer->stream);		int ver = (temp << 24);		int flags = (temp << 16)|(temp<<8)|temp;		int i;		mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%ld)\n",		    level, "",entries, ver, flags);		trak->keyframes_size=entries;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -