Esempio n. 1
0
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;
}
Esempio n. 2
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;
}