|
|
@@ -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++; |
|
|
|
|
|
|
|