@@ -3121,10 +3121,29 @@ static void build_chunks(MOVTrack *trk)
31213121 }
31223122}
31233123
3124+ static int copy_late_extradata (MOVTrack * track )
3125+ {
3126+ if (track -> vos_len || !track -> enc -> extradata_size )
3127+ return 0 ;
3128+
3129+ if (TAG_IS_AVCI (track -> tag ) || track -> enc -> codec_id == AV_CODEC_ID_DNXHD )
3130+ return 0 ;
3131+
3132+ track -> vos_len = track -> enc -> extradata_size ;
3133+ track -> vos_data = av_malloc (track -> vos_len );
3134+
3135+ if (!track -> vos_data )
3136+ return AVERROR (ENOMEM );
3137+
3138+ memcpy (track -> vos_data , track -> enc -> extradata , track -> vos_len );
3139+
3140+ return 0 ;
3141+ }
3142+
31243143static int mov_write_moov_tag (AVIOContext * pb , MOVMuxContext * mov ,
31253144 AVFormatContext * s )
31263145{
3127- int i ;
3146+ int i , ret ;
31283147 int64_t pos = avio_tell (pb );
31293148 avio_wb32 (pb , 0 ); /* size placeholder*/
31303149 ffio_wfourcc (pb , "moov" );
@@ -3136,6 +3155,9 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
31363155 mov -> tracks [i ].time = mov -> time ;
31373156 mov -> tracks [i ].track_id = i + 1 ;
31383157
3158+ if (ret = copy_late_extradata (& mov -> tracks [i ]))
3159+ return ret ;
3160+
31393161 if (mov -> tracks [i ].entry )
31403162 build_chunks (& mov -> tracks [i ]);
31413163 }
@@ -3169,7 +3191,7 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
31693191 mov_write_iods_tag (pb , mov );
31703192 for (i = 0 ; i < mov -> nb_streams ; i ++ ) {
31713193 if (mov -> tracks [i ].entry > 0 || mov -> flags & FF_MOV_FLAG_FRAGMENT ) {
3172- int ret = mov_write_trak_tag (pb , mov , & (mov -> tracks [i ]), i < s -> nb_streams ? s -> streams [i ] : NULL );
3194+ ret = mov_write_trak_tag (pb , mov , & (mov -> tracks [i ]), i < s -> nb_streams ? s -> streams [i ] : NULL );
31733195 if (ret < 0 )
31743196 return ret ;
31753197 }
0 commit comments