diff options
Diffstat (limited to 'libmpdemux/demux_mov.c')
-rw-r--r-- | libmpdemux/demux_mov.c | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 8647355639..fd27ecd5cb 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -140,7 +140,7 @@ typedef struct { unsigned int nchannels; unsigned int samplebytes; // - int tkdata_len; // track data + int tkdata_len; // track data unsigned char* tkdata; int stdata_len; // stream data unsigned char* stdata; @@ -174,11 +174,11 @@ void mov_build_index(mov_track_t* trak,int timescale){ if (trak->chunks_size <= 0) { mp_msg(MSGT_DEMUX, MSGL_WARN, "No chunk offset table, trying to build one!\n"); - + trak->chunks_size = trak->samples_size; /* XXX: FIXME ! */ // audit: this code will be vulnerable if it is reenabled (currently #if 0) trak->chunks = realloc(trak->chunks, sizeof(mov_chunk_t)*trak->chunks_size); - + for (i=0; i < trak->chunks_size; i++) trak->chunks[i].pos = -1; } @@ -241,7 +241,7 @@ void mov_build_index(mov_track_t* trak,int timescale){ } else mp_msg(MSGT_DEMUX, MSGL_ERR, "*** constant samplesize & variable duration not yet supported! ***\nContact the author if you have such sample file!\n"); return; } - + if (trak->samples_size < s) { mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", @@ -261,7 +261,7 @@ void mov_build_index(mov_track_t* trak,int timescale){ pts+=trak->durmap[j].dur; } } - + // calc sample offsets s=0; for(j=0;j<trak->chunks_size;j++){ @@ -337,12 +337,12 @@ static int mov_check_file(demuxer_t* demuxer){ int flags=0; int no=0; mov_priv_t* priv=malloc(sizeof(mov_priv_t)); - + mp_msg(MSGT_DEMUX,MSGL_V,"Checking for MOV\n"); - + memset(priv,0,sizeof(mov_priv_t)); priv->current_sub = -1; - + while(1){ int i; int skipped=8; @@ -372,7 +372,7 @@ static int mov_check_file(demuxer_t* demuxer){ switch(id){ case MOV_FOURCC('f','t','y','p'): { unsigned int tmp; - // File Type Box (ftyp): + // File Type Box (ftyp): // char[4] major_brand (eg. 'isom') // int minor_version (eg. 0x00000000) // char[4] compatible_brands[] (eg. 'mp41') @@ -418,7 +418,7 @@ static int mov_check_file(demuxer_t* demuxer){ mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: Mobile ISO/IEC 14496-1 (MPEG-4 system)\n"); break; default: - tmp = be2me_32(tmp); + tmp = be2me_32(tmp); mp_msg(MSGT_DEMUX,MSGL_WARN,"ISO: Unknown File Type Major Brand: %.4s\n",(char *)&tmp); } mp_msg(MSGT_DEMUX,MSGL_V,"ISO: File Type Minor Version: %d\n", @@ -430,7 +430,7 @@ static int mov_check_file(demuxer_t* demuxer){ mp_msg(MSGT_DEMUX,MSGL_V,"ISO: File Type Compatible Brand #%d: %.4s\n",i,(char *)&tmp); skipped += 4; } -#endif +#endif } break; case MOV_FOURCC('m','o','o','v'): // case MOV_FOURCC('c','m','o','v'): @@ -461,14 +461,14 @@ static int mov_check_file(demuxer_t* demuxer){ 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, + ds_read_packet(demuxer->video, demuxer->stream, slen, 0, stream_tell(demuxer->stream), - 0 // no flags + 0 // no flags ); flags|=4; mp_msg(MSGT_DEMUX,MSGL_V,"Added reference to playlist\n"); @@ -597,13 +597,13 @@ static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, off_t pos, off_t len, mov_track_t* trak); static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { -#if 0 +#if 0 struct { int16_t version; // 0 or 1 (version 1 is qt3.0+) int16_t revision; // 0 int32_t vendor_id; // 0 int16_t channels; // 1 or 2 (Mono/Stereo) - int16_t samplesize; // 8 or 16 (8Bit/16Bit) + int16_t samplesize; // 8 or 16 (8Bit/16Bit) int16_t compression_id; // if version 0 then 0 // if version 1 and vbr then -2 else 0 int16_t packet_size; // 0 @@ -620,8 +620,8 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { // --- // optional additional atom-based fields // ([int32_t size,int32_t type,some data ],repeat) - } my_stdata; -#endif + } my_stdata; +#endif int version, adjust; int is_vorbis = 0; sh->format=trak->fourcc; @@ -642,7 +642,7 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { trak->nchannels=sh->channels=1; sh->samplerate=8000; break; - + case 0x62776173: /* sawb */ /* amr wideband */ trak->samplebytes=sh->samplesize=1; @@ -651,11 +651,11 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { break; default: - + // assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit -// XXX: 32bit fixed point numbers (intfp) are only 2 Byte! -// short values are usually one byte leftpadded by zero -// int values are usually two byte leftpadded by zero +// XXX: 32bit fixed point numbers (intfp) are only 2 Byte! +// short values are usually one byte leftpadded by zero +// int values are usually two byte leftpadded by zero // stdata[]: // 8 short version // 10 short revision @@ -672,10 +672,10 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { // 36 int bytes_per_frame // 40 int bytes_per_sample // there may be additional atoms following at 28 (version 0) -// or 44 (version 1), eg. esds atom of .MP4 files +// or 44 (version 1), eg. esds atom of .MP4 files // esds atom: // 28 int atom size (bytes of int size, int type and data) -// 32 char[4] atom type (fourc charater code -> esds) +// 32 char[4] atom type (fourc charater code -> esds) // 36 char[] atom data (len=size-8) // TODO: fix parsing for files using version 2. @@ -724,8 +724,8 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { "assuming 44.1kHz (got %d)\n", char2short(trak->stdata,24)/trak->durmap[0].dur); sh->samplerate = 44100; - } - } + } + } } mp_msg(MSGT_DEMUX, MSGL_V, "Audio bits: %d chans: %d rate: %d\n", sh->samplesize*8,sh->channels,sh->samplerate); @@ -741,7 +741,7 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { int fcc=char2int(trak->stdata,48); // we have extra audio headers!!! mp_msg(MSGT_DEMUX,MSGL_V,"Audio extra header: len=%d fcc=0x%X\n",len,fcc); - if((len >= 4) && + if((len >= 4) && (char2int(trak->stdata,52) >= 12) && (char2int(trak->stdata,52+4) == MOV_FOURCC('f','r','m','a'))) { switch(char2int(trak->stdata,52+8)) { @@ -799,7 +799,7 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { case MOV_FOURCC('e','s','d','s'): { mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found MPEG4 audio Elementary Stream Descriptor atom (%d)!\n", atom_len); if(atom_len > 8) { - esds_t esds; + esds_t esds; if(!mp4_parse_esds(&trak->stdata[36+adjust], atom_len-8, &esds)) { /* 0xdd is a "user private" id, not an official allocated id (see http://www.mp4ra.org/object.html), so perform some extra checks to be sure that this is really vorbis audio */ @@ -833,12 +833,12 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { sh->codecdata_len = len + len/255 + 64; sh->codecdata = malloc(sh->codecdata_len); ptr = sh->codecdata; - + ptr[0] = 2; offset = 1; offset += store_ughvlc(&ptr[offset], sizes[0]); offset += store_ughvlc(&ptr[offset], sizes[1]); - for(k = 0; k < 3; k++) + for(k = 0; k < 3; k++) { memcpy(&ptr[offset], buf[k], sizes[k]); offset += sizes[k]; @@ -851,7 +851,7 @@ static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { quit_vorbis_block: sh->format = mmioFOURCC('v', 'r', 'b', 's'); } - sh->i_bps = esds.avgBitrate/8; + sh->i_bps = esds.avgBitrate/8; // printf("######## audio format = %d ########\n",esds.objectTypeId); if(esds.objectTypeId==MP4OTI_MPEG1Audio || esds.objectTypeId==MP4OTI_MPEG2AudioPart3) @@ -880,7 +880,7 @@ quit_vorbis_block: { FILE* f=fopen("esds.dat","wb"); fwrite(&trak->stdata[36],atom_len-8,1,f); fclose(f); } -#endif +#endif } } break; case MOV_FOURCC('a','l','a','c'): { @@ -905,7 +905,7 @@ quit_vorbis_block: trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], atom_len); } - } + } mp_msg(MSGT_DEMUX, MSGL_V, "Fourcc: %.4s\n",(char *)&trak->fourcc); #if 0 { FILE* f=fopen("stdata.dat","wb"); @@ -1062,9 +1062,9 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { // beginning at stdata[86] to some variable to pass it // on to the decoder ::atmos if(atom_len > 8) { - esds_t esds; + esds_t esds; if(!mp4_parse_esds(trak->stdata+pos+8, atom_len-8, &esds)) { - + if(esds.objectTypeId==MP4OTI_MPEG2VisualSimple || esds.objectTypeId==MP4OTI_MPEG2VisualMain || esds.objectTypeId==MP4OTI_MPEG2VisualSNR || esds.objectTypeId==MP4OTI_MPEG2VisualSpatial || esds.objectTypeId==MP4OTI_MPEG2VisualHigh || esds.objectTypeId==MP4OTI_MPEG2Visual422) @@ -1078,7 +1078,7 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { memcpy(trak->stream_header, esds.decoderConfig, trak->stream_header_len); } mp4_free_esds(&esds); // freeup esds mem - } + } break; case MOV_FOURCC('a','v','c','C'): // AVC decoder configuration record @@ -1111,7 +1111,7 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { trak->stream_header_len = atom_len-8; trak->stream_header = malloc(trak->stream_header_len); memcpy(trak->stream_header, trak->stdata+pos+8, trak->stream_header_len); - } + } break; case MOV_FOURCC('d','2','6','3'): mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found H.263 decoder atom %c%c%c%c (%d)!\n", trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7],atom_len); @@ -1147,7 +1147,7 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { sh->aspect/=trak->tkdata[81]|(trak->tkdata[80]<<8); } } - + if(depth>32+8) mp_msg(MSGT_DEMUX, MSGL_INFO,"*** depth = 0x%X\n",depth); // palettized? @@ -1232,7 +1232,7 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4]; mp_dbg(MSGT_DEMUX, MSGL_DBG2, "QT palette: added entry: %d of %d (colors: R:%x G:%x B:%x)\n", entry, palette_count, - palette_map[entry * 4 + 2], + palette_map[entry * 4 + 2], palette_map[entry * 4 + 1], palette_map[entry * 4 + 0]); } @@ -1276,7 +1276,7 @@ static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { trak->tkdata[77]|(trak->tkdata[76]<<8), trak->tkdata[81]|(trak->tkdata[80]<<8)); mp_msg(MSGT_DEMUX, MSGL_V, "Fourcc: %.4s Codec: '%.*s'\n",(char *)&trak->fourcc,trak->stdata[42]&31,trak->stdata+43); - + // if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){ // // (auto)selected video track: // demuxer->video->id=priv->track_db; @@ -1371,7 +1371,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak int i; int fd; char name[20]; - + for (i=0; i<trak->samples_size; i++) { char buf[trak->samples[i].size]; @@ -1395,7 +1395,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak if (trak->samplesize > 0) { char *buf; - + buf = malloc(trak->samplesize); stream_seek(demuxer->stream, trak->chunks[0].pos); snprintf((char *)&name[0], 20, "trak%d", trak->id); @@ -1405,7 +1405,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak close(fd); } stream_seek(demuxer->stream, pos); - } + } #endif break; default: @@ -1462,7 +1462,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak zstrm.avail_in = cmov_sz; zstrm.next_out = moov_buf; zstrm.avail_out = moov_sz; - + zret = inflateInit(&zstrm); if (zret != Z_OK) { mp_msg(MSGT_DEMUX, MSGL_ERR, "QT cmov: inflateInit err %d\n",zret); @@ -1484,7 +1484,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak if(moov_sz != zstrm.total_out) mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! moov size differs cmov: %d zlib: %ld\n",moov_sz,zstrm.total_out); zret = inflateEnd(&zstrm); - + backup=demuxer->stream; demuxer->stream=new_memory_stream(moov_buf,moov_sz); stream_skip(demuxer->stream,8); @@ -1492,7 +1492,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak //free_stream(demuxer->stream); demuxer->stream=backup; free(cmov_buf); - free(moov_buf); + free(moov_buf); break; } #endif @@ -1501,7 +1501,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak unsigned int udta_id; off_t udta_len; off_t udta_size = len; - + mp_msg(MSGT_DEMUX, MSGL_DBG2, "mov: user data record found\n"); mp_msg(MSGT_DEMUX, MSGL_V, "Quicktime Clip Info:\n"); @@ -1827,7 +1827,7 @@ static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, av_unused int temp = stream_read_dword(demuxer->stream); int len = stream_read_dword(demuxer->stream); int i; - mp_msg(MSGT_DEMUX, MSGL_V, + mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sChunk offset table! (%d chunks)\n", level, "", len); // extend array if needed: @@ -1942,10 +1942,10 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ int t_no; int best_a_id=-1, best_a_len=0; int best_v_id=-1, best_v_len=0; - + mp_msg(MSGT_DEMUX, MSGL_DBG3, "mov_read_header!\n"); - // Parse header: + // Parse header: stream_reset(demuxer->stream); if(!stream_seek(demuxer->stream,priv->moov_start)) { @@ -1973,7 +1973,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ best_a_id,best_a_len,best_v_id,best_v_len); if(demuxer->audio->id==-1 && best_a_id>=0) demuxer->audio->id=best_a_id; if(demuxer->video->id==-1 && best_v_id>=0) demuxer->video->id=best_v_id; - + // setup sh pointers: if(demuxer->audio->id>=0){ sh_audio_t* sh=demuxer->a_streams[demuxer->audio->id]; @@ -2010,7 +2010,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ if(trak->media_handler == MOV_FOURCC('M','P','E','G')) { stream_t *s; demuxer_t *od; - + demuxer->video->id = t_no; s = new_ds_stream(demuxer->video); od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); @@ -2045,7 +2045,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ // } if( //trak->media_handler==MOV_FOURCC('s','p','r','t') && trak->stdata_len>=16 && - char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b') + char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b') ){ int newlen=stream_read_dword(demuxer->stream); #if CONFIG_ZLIB @@ -2069,7 +2069,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ zret = inflate(&zstrm, Z_NO_FLUSH); if(newlen != zstrm.total_out) mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! unzipped frame size differs hdr: %d zlib: %ld\n",newlen,zstrm.total_out); - + write(fd, buf2, newlen); } else { #else @@ -2113,7 +2113,7 @@ static int demux_mov_fill_buffer(demuxer_t *demuxer,demux_stream_t* ds){ float pts; int x; off_t pos; - + if (ds->eof) return 0; trak = stream_track(priv, ds); if (!trak) return 0; @@ -2196,7 +2196,7 @@ if(trak->pos==0 && trak->stream_header_len>0){ ds_add_packet(ds,dp); } else ds_read_packet(ds,demuxer->stream,x,pts,pos,0); - + ++trak->pos; trak = NULL; @@ -2223,7 +2223,7 @@ if(trak->pos==0 && trak->stream_header_len>0){ } return 1; - + } static float mov_seek_track(mov_track_t* trak,float pts,int flags){ @@ -2275,7 +2275,7 @@ static void demux_seek_mov(demuxer_t *demuxer,float pts,float audio_delay,int fl mov_track_t* trak; // printf("MOV seek called %5.3f flag=%d \n",pts,flags); - + ds=demuxer->video; trak = stream_track(priv, ds); if (trak) { |