demux_mov.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,854 行 · 第 1/5 页

C
1,854
字号
		switch (udta_id)		{		    case MOV_FOURCC(0xa9,'c','p','y'):		    case MOV_FOURCC(0xa9,'d','a','y'):		    case MOV_FOURCC(0xa9,'d','i','r'):		    /* 0xa9,'e','d','1' - '9' : edit timestamps */		    case MOV_FOURCC(0xa9,'f','m','t'):		    case MOV_FOURCC(0xa9,'i','n','f'):		    case MOV_FOURCC(0xa9,'p','r','d'):		    case MOV_FOURCC(0xa9,'p','r','f'):		    case MOV_FOURCC(0xa9,'r','e','q'):		    case MOV_FOURCC(0xa9,'s','r','c'):		    case MOV_FOURCC('n','a','m','e'):		    case MOV_FOURCC(0xa9,'n','a','m'):		    case MOV_FOURCC(0xa9,'A','R','T'):		    case MOV_FOURCC(0xa9,'c','m','t'):		    case MOV_FOURCC(0xa9,'a','u','t'):		    case MOV_FOURCC(0xa9,'s','w','r'):		    {			off_t text_len = stream_read_word(demuxer->stream);			char text[text_len+2+1];			stream_read(demuxer->stream, (char *)&text, text_len+2);			text[text_len+2] = 0x0;			switch(udta_id)			{			    case MOV_FOURCC(0xa9,'a','u','t'):				demux_info_add(demuxer, "author", &text[2]);				mp_msg(MSGT_DEMUX, MSGL_V, " Author: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'c','p','y'):				demux_info_add(demuxer, "copyright", &text[2]);				mp_msg(MSGT_DEMUX, MSGL_V, " Copyright: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'i','n','f'):				mp_msg(MSGT_DEMUX, MSGL_V, " Info: %s\n", &text[2]);				break;			    case MOV_FOURCC('n','a','m','e'):			    case MOV_FOURCC(0xa9,'n','a','m'):				demux_info_add(demuxer, "name", &text[2]);				mp_msg(MSGT_DEMUX, MSGL_V, " Name: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'A','R','T'):				mp_msg(MSGT_DEMUX, MSGL_V, " Artist: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'d','i','r'):				mp_msg(MSGT_DEMUX, MSGL_V, " Director: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'c','m','t'):				demux_info_add(demuxer, "comments", &text[2]);				mp_msg(MSGT_DEMUX, MSGL_V, " Comment: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'r','e','q'):				mp_msg(MSGT_DEMUX, MSGL_V, " Requirements: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'s','w','r'):				demux_info_add(demuxer, "encoder", &text[2]);				mp_msg(MSGT_DEMUX, MSGL_V, " Software: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'d','a','y'):				mp_msg(MSGT_DEMUX, MSGL_V, " Creation timestamp: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'f','m','t'):				mp_msg(MSGT_DEMUX, MSGL_V, " Format: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'p','r','d'):				mp_msg(MSGT_DEMUX, MSGL_V, " Producer: %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'p','r','f'):				mp_msg(MSGT_DEMUX, MSGL_V, " Performer(s): %s\n", &text[2]);				break;			    case MOV_FOURCC(0xa9,'s','r','c'):				mp_msg(MSGT_DEMUX, MSGL_V, " Source providers: %s\n", &text[2]);				break;			}			udta_size -= 4+text_len;			break;		    }		    /* some other shits:    WLOC - window location,					    LOOP - looping style,					    SelO - play only selected frames					    AllF - play all frames		    */		    case MOV_FOURCC('W','L','O','C'):		    case MOV_FOURCC('L','O','O','P'):		    case MOV_FOURCC('S','e','l','O'):		    case MOV_FOURCC('A','l','l','F'):		    default:		    {			if( udta_len>udta_size)				udta_len=udta_size;			{			char dump[udta_len-4];			stream_read(demuxer->stream, (char *)&dump, udta_len-4-4);			udta_size -= udta_len;			}		    }		}	    }	    break;	} /* eof udta */	default:	  id = be2me_32(id);	  mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len);	} /* endof switch */	} /* endof else */	pos+=len+8;	if(pos>=endpos) break;	if(!stream_seek(demuxer->stream,pos)) break;    }}static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id,                           off_t pos, off_t len, mov_track_t* 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 -1;    }    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'): {      int version = stream_read_char(demuxer->stream);      mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia header!\n", level, "");      stream_skip(demuxer->stream, (version == 1) ? 19 : 11);      // read timescale      trak->timescale = stream_read_dword(demuxer->stream);      // read length      if (version == 1)          trak->length = stream_read_qword(demuxer->stream);      else          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, "",             (char *)&type, (char *)&subtype, (char *)&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), (char *)&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  (%"PRId64" bytes)\n", level, "",               i, (char *)&fourcc, (int64_t)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 = calloc(len, sizeof(mov_durmap_t));      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:%d)\n", level, "",             len, ver, flags);      // read data:      trak->chunkmap_size = len;      trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t));      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:%d)\n", level, "",             entries, ss, ver, flags);      trak->samplesize = ss;      if (!ss) {        // variable samplesize        trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t));        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_struct(trak->chunks, len, sizeof(mov_chunk_t));        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_struct(trak->chunks, len, sizeof(mov_chunk_t));        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:%d)\n", level, "",             entries, ver, flags);      trak->keyframes_size = entries;      trak->keyframes = calloc(entries, sizeof(unsigned int));      for (i = 0; i < entries; i++)        trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1;      break;    }    case MOV_FOURCC('m','d','i'

⌨️ 快捷键说明

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