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 + -
显示快捷键?