lavf: split packets before muxing.

After demuxing, data and side are merged. Before decoding, they are
split. Encoder will perform with data and side split. This means that a
muxer can receive split data (after encoding) but also merged data (if
called directly after demuxing). This commit makes sure data and side
are split for the muxer.
pull/8/head
Clément Bœsch 12 years ago
parent 52f2176366
commit 0072116ccb
  1. 24
      libavformat/mux.c

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

Loading…
Cancel
Save