| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -4798,28 +4798,40 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static int mov_write_mfra_tag(AVIOContext *pb, MOVMuxContext *mov) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int64_t pos = avio_tell(pb); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVIOContext *mfra_pb; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int i, ret, sz; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *buf; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(pb, 0); /* size placeholder */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ffio_wfourcc(pb, "mfra"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ret = avio_open_dyn_buf(&mfra_pb); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (ret < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(mfra_pb, 0); /* size placeholder */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ffio_wfourcc(mfra_pb, "mfra"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /* An empty mfra atom is enough to indicate to the publishing point that | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			     * the stream has ended. */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (mov->flags & FF_MOV_FLAG_ISML) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return update_size(pb, pos); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto done_mfra; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for (i = 0; i < mov->nb_streams; i++) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        MOVTrack *track = &mov->tracks[i]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (track->nb_frag_info) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            mov_write_tfra_tag(pb, track); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            mov_write_tfra_tag(mfra_pb, track); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(pb, 16); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ffio_wfourcc(pb, "mfro"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(pb, 0); /* version + flags */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(pb, avio_tell(pb) + 4 - pos); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(mfra_pb, 16); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ffio_wfourcc(mfra_pb, "mfro"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(mfra_pb, 0); /* version + flags */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_wb32(mfra_pb, avio_tell(mfra_pb) + 4); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return update_size(pb, pos); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			done_mfra: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    sz  = update_size(mfra_pb, 0); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ret = avio_get_dyn_buf(mfra_pb, &buf); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    avio_write(pb, buf, ret); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ffio_free_dyn_buf(&mfra_pb); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return sz; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -6987,7 +6999,9 @@ static int mov_write_trailer(AVFormatContext *s) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            mov_write_mfra_tag(pb, mov); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            res = mov_write_mfra_tag(pb, mov); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (res < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                return res; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |