Пример #1
0
int quicktime_trak_duration(quicktime_trak_t *trak, long *duration, long *timescale)
{
    quicktime_stts_t *stts = &(trak->mdia.minf.stbl.stts);
    int i;
    *duration = 0;

    /* hint track duration is that of reference track */
    if (quicktime_trak_is_hint(trak)) {
#ifdef DEBUG
        if ((quicktime_trak_t*)trak->tref.hint.traks[0] == trak) {
            printf("quicktime_trak_duration: BUG, self reference loop!!!\n");
            *duration = 0;
            *timescale = 1;
            return 0;
        }
        if ((quicktime_trak_t*)trak->tref.hint.traks[0] == NULL) {
            printf("quicktime_trak_duration: BUG, NULL reference!!!\n");
            *duration = 0;
            *timescale = 1;
            return 0;
        }
#endif /* DEBUG */

        return quicktime_trak_duration(
            (quicktime_trak_t*)trak->tref.hint.traks[0], duration, timescale);
    }

    for(i = 0; i < stts->total_entries; i++) {
        *duration += stts->table[i].sample_duration * stts->table[i].sample_count;
    }

    *timescale = trak->mdia.mdhd.time_scale;
    return 0;
}
Пример #2
0
int quicktime_write_trak(quicktime_t *file, quicktime_trak_t *trak, long moov_time_scale)
{
    long duration;
    long timescale;
    quicktime_atom_t atom;
    quicktime_atom_write_header(file, &atom, "trak");
    quicktime_trak_duration(trak, &duration, &timescale);

    /* printf("quicktime_write_trak duration %d\n", duration); */

    /* get duration in movie's units */
    if (timescale) {
        trak->tkhd.duration = 
            (long)((float)duration / timescale * moov_time_scale);
    } else {
        trak->tkhd.duration = 0;
    }
    trak->mdia.mdhd.duration = duration;
    trak->mdia.mdhd.time_scale = timescale;

    if (trak->mdia.minf.is_hint) {
        if (duration && timescale) {
            trak->mdia.minf.hmhd.avgbitrate =
                (trak->hint_udta.hinf.trpy.numBytes * 8)
                / (duration / timescale);
        } else {
            trak->mdia.minf.hmhd.avgbitrate = 0;
        }
    }

    quicktime_write_tkhd(file, &(trak->tkhd));
    quicktime_write_edts(file, &(trak->edts), trak->tkhd.duration);
    quicktime_write_tref(file, &(trak->tref));
    quicktime_write_mdia(file, &(trak->mdia));
    quicktime_write_hint_udta(file, &(trak->hint_udta));

    quicktime_atom_write_footer(file, &atom);

    return 0;
}
Пример #3
0
int quicktime_write_moov(quicktime_t *file, quicktime_moov_t *moov)
{
	quicktime_atom_t atom;
	int i;
	long longest_duration = 0;
	long duration, timescale;
	quicktime_atom_write_header(file, &atom, "moov");

/* get the duration from the longest track in the mvhd's timescale */
	for(i = 0; i < moov->total_tracks; i++)
	{
		quicktime_trak_fix_counts(file, moov->trak[i]);
		quicktime_trak_duration(moov->trak[i], &duration, &timescale);

		duration = (long)((float)duration / timescale * moov->mvhd.time_scale);

		if(duration > longest_duration)
		{
			longest_duration = duration;
		}
	}
	moov->mvhd.duration = longest_duration;
	moov->mvhd.selection_duration = longest_duration;

	quicktime_write_mvhd(file, &(moov->mvhd));
	quicktime_write_iods(file, &(moov->iods));
	quicktime_write_udta(file, &(moov->udta));

	for(i = 0; i < moov->total_tracks; i++)
	{
		quicktime_write_trak(file, moov->trak[i], moov->mvhd.time_scale);
	}
	/*quicktime_write_ctab(file, &(moov->ctab)); */

	quicktime_atom_write_footer(file, &atom);
}