static int32_t mp4ff_read_mdhd(mp4ff_t *f) { uint32_t version; version = mp4ff_read_int32(f); if (version==1) { mp4ff_read_int64(f);//creation-time mp4ff_read_int64(f);//modification-time f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration } else //version == 0 { uint32_t temp; mp4ff_read_int32(f);//creation-time mp4ff_read_int32(f);//modification-time f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale temp = mp4ff_read_int32(f); f->track[f->total_tracks - 1]->duration = (temp == (uint32_t)(-1)) ? (uint64_t)(-1) : (uint64_t)(temp); } mp4ff_read_int16(f); mp4ff_read_int16(f); return 1; }
/* read atom header, return atom size, atom size is with header included */ uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size) { uint64_t size; int32_t ret; int8_t atom_header[8]; ret = mp4ff_read_data(f, atom_header, 8); if (ret != 8) return 0; size = mp4ff_atom_get_size(atom_header); *header_size = 8; /* check for 64 bit atom size */ if (size == 1) { *header_size = 16; size = mp4ff_read_int64(f); } //printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]); *atom_type = mp4ff_atom_name_to_type(atom_header[4], atom_header[5], atom_header[6], atom_header[7]); return size; }
static int32_t mp4ff_read_tkhd(mp4ff_t *f) { uint8_t version; uint32_t flags; version = mp4ff_read_char(f); /* version */ flags = mp4ff_read_int24(f); /* flags */ if (version==1) { mp4ff_read_int64(f);//creation-time mp4ff_read_int64(f);//modification-time mp4ff_read_int32(f);//track-id mp4ff_read_int32(f);//reserved f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration } else //version == 0 { mp4ff_read_int32(f);//creation-time mp4ff_read_int32(f);//modification-time mp4ff_read_int32(f);//track-id mp4ff_read_int32(f);//reserved f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF) f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF; } mp4ff_read_int32(f);//reserved mp4ff_read_int32(f);//reserved mp4ff_read_int16(f);//layer mp4ff_read_int16(f);//pre-defined mp4ff_read_int16(f);//volume mp4ff_read_int16(f);//reserved //matrix mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f);//width mp4ff_read_int32(f);//height return 1; }
static int32_t mp4ff_read_chpl(mp4ff_t *f, const uint64_t size) { int i; int i_read = size; mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ mp4ff_chapterdata_t *p_chpl = &f->chapters; p_chpl->i_chapter = mp4ff_read_char (f); i_read -= 5; for( i = 0; i < p_chpl->i_chapter; i++ ) { uint64_t i_start; uint8_t i_len; int i_copy; i_start = mp4ff_read_int64 (f); i_read -= 8; i_len = mp4ff_read_char (f); i_read -= 1; p_chpl->chapter[i].psz_name = malloc( i_len + 1 ); if( !p_chpl->chapter[i].psz_name ) goto error; i_copy = i_len < i_read ? i_len : i_read; if( i_copy > 0 ) mp4ff_read_data (f, p_chpl->chapter[i].psz_name, i_copy); p_chpl->chapter[i].psz_name[i_copy] = '\0'; p_chpl->chapter[i].i_start = i_start; i_read -= i_copy; } /* Bubble sort by increasing start date */ do { for( i = 0; i < p_chpl->i_chapter - 1; i++ ) { if( p_chpl->chapter[i].i_start > p_chpl->chapter[i+1].i_start ) { char *psz = p_chpl->chapter[i+1].psz_name; int64_t i64 = p_chpl->chapter[i+1].i_start; p_chpl->chapter[i+1].psz_name = p_chpl->chapter[i].psz_name; p_chpl->chapter[i+1].i_start = p_chpl->chapter[i].i_start; p_chpl->chapter[i].psz_name = psz; p_chpl->chapter[i].i_start = i64; i = -1; break; } } } while( i == -1 ); return 0; error: return -1; }