@ -484,13 +484,29 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
return 0 ;
}
/**
* Move side data from payload to internal struct , call muxer , and restore
* original packet .
*/
static inline int split_write_packet ( AVFormatContext * s , AVPacket * pkt )
{
int ret ;
AVPacket spkt = * pkt ;
av_packet_split_side_data ( & spkt ) ;
ret = s - > oformat - > write_packet ( s , & spkt ) ;
spkt . data = NULL ;
av_destruct_packet ( & spkt ) ;
return ret ;
}
int av_write_frame ( AVFormatContext * s , AVPacket * pkt )
{
int ret ;
if ( ! pkt ) {
if ( s - > oformat - > flags & AVFMT_ALLOW_FLUSH ) {
ret = s - > oformat - > write_packet ( s , pkt ) ;
ret = s - > oformat - > write_packet ( s , NULL ) ;
if ( ret > = 0 & & s - > pb & & s - > pb - > error < 0 )
ret = s - > pb - > error ;
return ret ;
@ -503,7 +519,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
if ( ret < 0 & & ! ( s - > oformat - > flags & AVFMT_NOTIMESTAMPS ) )
return ret ;
ret = s - > oformat - > write_packet ( s , pkt ) ;
ret = split_ write_packet ( s , pkt ) ;
if ( ret > = 0 & & s - > pb & & s - > pb - > error < 0 )
ret = s - > pb - > error ;
@ -733,7 +749,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
if ( ret < = 0 ) //FIXME cleanup needed for ret<0 ?
return ret ;
ret = s - > oformat - > write_packet ( s , & opkt ) ;
ret = split_ write_packet ( s , & opkt ) ;
if ( ret > = 0 )
s - > streams [ opkt . stream_index ] - > nb_frames + + ;
@ -759,7 +775,7 @@ int av_write_trailer(AVFormatContext *s)
if ( ! ret )
break ;
ret = s - > oformat - > write_packet ( s , & pkt ) ;
ret = split_ write_packet ( s , & pkt ) ;
if ( ret > = 0 )
s - > streams [ pkt . stream_index ] - > nb_frames + + ;