|
|
@@ -551,6 +551,21 @@ static int mov_get_lpcm_flags(enum CodecID codec_id) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static int get_cluster_duration(MOVTrack *track, int cluster_idx) |
|
|
|
{ |
|
|
|
int64_t next_dts; |
|
|
|
|
|
|
|
if (cluster_idx >= track->entry) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if (cluster_idx + 1 == track->entry) |
|
|
|
next_dts = track->track_duration + track->start_dts; |
|
|
|
else |
|
|
|
next_dts = track->cluster[cluster_idx + 1].dts; |
|
|
|
|
|
|
|
return next_dts - track->cluster[cluster_idx].dts; |
|
|
|
} |
|
|
|
|
|
|
|
static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
{ |
|
|
|
int64_t pos = avio_tell(pb); |
|
|
@@ -1107,9 +1122,7 @@ static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
av_malloc(track->entry * sizeof(*stts_entries)) : /* worst case */ |
|
|
|
NULL; |
|
|
|
for (i=0; i<track->entry; i++) { |
|
|
|
int64_t duration = i + 1 == track->entry ? |
|
|
|
track->track_duration - track->cluster[i].dts + track->start_dts : /* readjusting */ |
|
|
|
track->cluster[i+1].dts - track->cluster[i].dts; |
|
|
|
int duration = get_cluster_duration(track, i); |
|
|
|
if (i && duration == stts_entries[entries].duration) { |
|
|
|
stts_entries[entries].count++; /* compress */ |
|
|
|
} else { |
|
|
@@ -2235,10 +2248,7 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < track->entry; i++) { |
|
|
|
int64_t duration = i + 1 == track->entry ? |
|
|
|
track->track_duration - track->cluster[i].dts + track->start_dts : |
|
|
|
track->cluster[i + 1].dts - track->cluster[i].dts; |
|
|
|
if (duration != track->default_duration) |
|
|
|
if (get_cluster_duration(track, i) != track->default_duration) |
|
|
|
flags |= MOV_TRUN_SAMPLE_DURATION; |
|
|
|
if (track->cluster[i].size != track->default_size) |
|
|
|
flags |= MOV_TRUN_SAMPLE_SIZE; |
|
|
@@ -2262,11 +2272,8 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
avio_wb32(pb, get_sample_flags(track, &track->cluster[0])); |
|
|
|
|
|
|
|
for (i = 0; i < track->entry; i++) { |
|
|
|
int64_t duration = i + 1 == track->entry ? |
|
|
|
track->track_duration - track->cluster[i].dts + track->start_dts : |
|
|
|
track->cluster[i + 1].dts - track->cluster[i].dts; |
|
|
|
if (flags & MOV_TRUN_SAMPLE_DURATION) |
|
|
|
avio_wb32(pb, duration); |
|
|
|
avio_wb32(pb, get_cluster_duration(track, i)); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_SIZE) |
|
|
|
avio_wb32(pb, track->cluster[i].size); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_FLAGS) |
|
|
|