+static int mov_write_tfhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
+{
+ int64_t pos = avio_tell(pb);
+ int flags=1;
+
+ avio_wb32(pb, 0);
+ ffio_wfourcc(pb, "tfhd");
+ avio_w8(pb, 0);
+ avio_wb24(pb, flags);
+ avio_wb32(pb, track->trackID);
+
+ track->base_data_offset_pos= avio_tell(pb);
+ if (flags & 0x01) avio_wb64(pb, 0);
+
+ return updateSize(pb, pos);
+}
+
+static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track)
+{
+ int64_t pos = avio_tell(pb);
+ int sample_count= track->entry - track->cluster_write_index;
+ int tr_flags=0;
+ int i;
+
+ for(i=track->cluster_write_index; i<track->entry; i++){
+ int64_t duration = i + 1 == track->entry ?
+ track->trackDuration - track->cluster[i].dts + track->cluster[0].dts : /* readjusting */
+ track->cluster[i+1].dts - track->cluster[i].dts;
+ if(duration != 1) tr_flags |= 0x100;
+ if(track->trex_size != track->cluster[i].size) tr_flags |= 0x200;
+ if(track->trex_flags != ((track->cluster[i].flags&MOV_SYNC_SAMPLE) ? 0x02000000 : 0x01010000))
+ tr_flags |= 0x400;
+ if(track->cluster[i].cts) tr_flags |= 0x800;
+ }
+
+ avio_wb32(pb, 0);
+ ffio_wfourcc(pb, "trun");
+ avio_w8(pb, 0);
+ avio_wb24(pb, tr_flags);
+ avio_wb32(pb, sample_count);
+ if(tr_flags&1) avio_wb32(pb, 0);
+
+ for(i=track->cluster_write_index; i<track->entry; i++){
+ int64_t duration = i + 1 == track->entry ?
+ track->trackDuration - track->cluster[i].dts + track->cluster[0].dts : /* readjusting */
+ track->cluster[i+1].dts - track->cluster[i].dts;
+
+ if(tr_flags&0x100) avio_wb32(pb, duration);
+ if(tr_flags&0x200) avio_wb32(pb, track->cluster[i].size);
+ if(tr_flags&0x400) avio_wb32(pb, (track->cluster[i].flags&MOV_SYNC_SAMPLE) ? 0x02000000 : 0x01010000);
+ if(tr_flags&0x800) avio_wb32(pb, track->cluster[i].cts);
+ }
+
+ return updateSize(pb, pos);
+}
+
+static int mov_write_traf_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
+{
+ int64_t pos = avio_tell(pb);
+ avio_wb32(pb, 0); /* size */
+ ffio_wfourcc(pb, "traf");
+ mov_write_tfhd_tag(pb, track, st);
+ mov_write_trun_tag(pb, track);
+ return updateSize(pb, pos);
+}
+