int quicktime_update_positions(quicktime_t *file) { /* Get the sample position from the file offset */ /* for routines that change the positions of all tracks, like */ /* seek_end and seek_start but not for routines that reposition one track, like */ /* set_audio_position. */ int64_t mdat_offset = quicktime_position(file) - file->mdat.atom.start; int64_t sample, chunk, chunk_offset; int i; if(file->total_atracks) { sample = quicktime_offset_to_sample(file->atracks[0].track, mdat_offset); chunk = quicktime_offset_to_chunk(&chunk_offset, file->atracks[0].track, mdat_offset); for(i = 0; i < file->total_atracks; i++) { file->atracks[i].current_position = sample; file->atracks[i].current_chunk = chunk; } } if(file->total_vtracks) { sample = quicktime_offset_to_sample(file->vtracks[0].track, mdat_offset); chunk = quicktime_offset_to_chunk(&chunk_offset, file->vtracks[0].track, mdat_offset); for(i = 0; i < file->total_vtracks; i++) { file->vtracks[i].current_position = sample; file->vtracks[i].current_chunk = chunk; } } return 0; }
long quicktime_offset_to_sample(quicktime_trak_t *trak, long offset) { long chunk_offset; long chunk = quicktime_offset_to_chunk(&chunk_offset, trak, offset); long chunk_sample = quicktime_sample_of_chunk(trak, chunk); long sample, sample_offset; quicktime_stsz_table_t *table = trak->mdia.minf.stbl.stsz.table; long total_samples = trak->mdia.minf.stbl.stsz.total_entries; if(trak->mdia.minf.stbl.stsz.sample_size) { sample = chunk_sample + (offset - chunk_offset) / trak->mdia.minf.stbl.stsz.sample_size; } else for(sample = chunk_sample, sample_offset = chunk_offset; sample_offset < offset && sample < total_samples; ) { sample_offset += table[sample].size; if(sample_offset < offset) sample++; } return sample; }