Mercurial > libavformat.hg
changeset 4342:b889db531b8f libavformat
fix flush and interleaving by edit units
author | bcoudurier |
---|---|
date | Mon, 02 Feb 2009 10:04:36 +0000 |
parents | 501d1dd19021 |
children | b691846ea95e |
files | mxfenc.c |
diffstat | 1 files changed, 20 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mxfenc.c Mon Feb 02 10:03:38 2009 +0000 +++ b/mxfenc.c Mon Feb 02 10:04:36 2009 +0000 @@ -1296,25 +1296,37 @@ if (stream_count && (s->nb_streams == stream_count || flush)) { pktl = s->packet_buffer; - *out = pktl->pkt; - //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts); - s->packet_buffer = pktl->next; - av_freep(&pktl); - - if (flush && stream_count < s->nb_streams) { + if (s->nb_streams != stream_count) { + MXFContext *mxf = s->priv_data; + AVPacketList *first = NULL; + // find first packet in edit unit + while (pktl) { + AVStream *st = s->streams[pktl->pkt.stream_index]; + if (st->index == mxf->edit_unit_start) + break; + else if (!first) + first = pktl; + pktl = pktl->next; + } // purge packet queue - pktl = s->packet_buffer; while (pktl) { AVPacketList *next = pktl->next; av_free_packet(&pktl->pkt); av_freep(&pktl); pktl = next; } - s->packet_buffer = NULL; + if (!first) + goto out; + pktl = first; } + *out = pktl->pkt; + //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts); + s->packet_buffer = pktl->next; + av_freep(&pktl); return 1; } else { + out: av_init_packet(out); return 0; }