[FFmpeg-cvslog] r16937 - trunk/libavformat/mxfenc.c
bcoudurier
subversion
Mon Feb 2 11:04:37 CET 2009
Author: bcoudurier
Date: Mon Feb 2 11:04:36 2009
New Revision: 16937
Log:
fix flush and interleaving by edit units
Modified:
trunk/libavformat/mxfenc.c
Modified: trunk/libavformat/mxfenc.c
==============================================================================
--- trunk/libavformat/mxfenc.c Mon Feb 2 11:03:38 2009 (r16936)
+++ trunk/libavformat/mxfenc.c Mon Feb 2 11:04:36 2009 (r16937)
@@ -1296,25 +1296,37 @@ static int mxf_interleave_get_packet(AVF
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;
}
More information about the ffmpeg-cvslog
mailing list