diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 8c869ede60..2230cade19 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3988,7 +3988,7 @@ static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags) return 0; } -static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment) +static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk) { const uint8_t *start, *next, *end = pkt->data + pkt->size; int seq = 0, entry = 0; @@ -4008,10 +4008,13 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment) break; } } - if (!trk->entry && !fragment) { + if (!trk->entry && trk->vc1_info.first_packet_seen) + trk->vc1_info.first_frag_written = 1; + if (!trk->entry && !trk->vc1_info.first_frag_written) { /* First packet in first fragment */ trk->vc1_info.first_packet_seq = seq; trk->vc1_info.first_packet_entry = entry; + trk->vc1_info.first_packet_seen = 1; } else if ((seq && !trk->vc1_info.packet_seq) || (entry && !trk->vc1_info.packet_entry)) { int i; @@ -4022,7 +4025,7 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment) trk->vc1_info.packet_seq = 1; if (entry) trk->vc1_info.packet_entry = 1; - if (!fragment) { + if (!trk->vc1_info.first_frag_written) { /* First fragment */ if ((!seq || trk->vc1_info.first_packet_seq) && (!entry || trk->vc1_info.first_packet_entry)) { @@ -4386,7 +4389,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->start_cts = pkt->pts - pkt->dts; if (enc->codec_id == AV_CODEC_ID_VC1) { - mov_parse_vc1_frame(pkt, trk, mov->fragments); + mov_parse_vc1_frame(pkt, trk); } else if (pkt->flags & AV_PKT_FLAG_KEY) { if (mov->mode == MODE_MOV && enc->codec_id == AV_CODEC_ID_MPEG2VIDEO && trk->entry > 0) { // force sync sample for the first key frame diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 21d0ee7147..322ba9ff03 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -139,6 +139,8 @@ typedef struct MOVTrack { struct { int first_packet_seq; int first_packet_entry; + int first_packet_seen; + int first_frag_written; int packet_seq; int packet_entry; int slices;