Commit 0c5e380c authored by Martin Storsjö's avatar Martin Storsjö

movenc: Don't rely on the fragment index for vc1 info gathering

The previous use of the mov->fragments field, for determining whether
written packets were part of the first fragment or not, didn't
work as intended when using the empty_moov flag.
Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
parent cf402d6f
...@@ -3050,7 +3050,7 @@ static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags) ...@@ -3050,7 +3050,7 @@ static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags)
return 0; 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; const uint8_t *start, *next, *end = pkt->data + pkt->size;
int seq = 0, entry = 0; int seq = 0, entry = 0;
...@@ -3070,10 +3070,13 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment) ...@@ -3070,10 +3070,13 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment)
break; 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 */ /* First packet in first fragment */
trk->vc1_info.first_packet_seq = seq; trk->vc1_info.first_packet_seq = seq;
trk->vc1_info.first_packet_entry = entry; trk->vc1_info.first_packet_entry = entry;
trk->vc1_info.first_packet_seen = 1;
} else if ((seq && !trk->vc1_info.packet_seq) || } else if ((seq && !trk->vc1_info.packet_seq) ||
(entry && !trk->vc1_info.packet_entry)) { (entry && !trk->vc1_info.packet_entry)) {
int i; int i;
...@@ -3084,7 +3087,7 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment) ...@@ -3084,7 +3087,7 @@ static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk, int fragment)
trk->vc1_info.packet_seq = 1; trk->vc1_info.packet_seq = 1;
if (entry) if (entry)
trk->vc1_info.packet_entry = 1; trk->vc1_info.packet_entry = 1;
if (!fragment) { if (!trk->vc1_info.first_frag_written) {
/* First fragment */ /* First fragment */
if ((!seq || trk->vc1_info.first_packet_seq) && if ((!seq || trk->vc1_info.first_packet_seq) &&
(!entry || trk->vc1_info.first_packet_entry)) { (!entry || trk->vc1_info.first_packet_entry)) {
...@@ -3409,7 +3412,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -3409,7 +3412,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
trk->start_cts = pkt->pts - pkt->dts; trk->start_cts = pkt->pts - pkt->dts;
if (enc->codec_id == AV_CODEC_ID_VC1) { 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) { } else if (pkt->flags & AV_PKT_FLAG_KEY) {
if (mov->mode == MODE_MOV && enc->codec_id == AV_CODEC_ID_MPEG2VIDEO && if (mov->mode == MODE_MOV && enc->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
trk->entry > 0) { // force sync sample for the first key frame trk->entry > 0) { // force sync sample for the first key frame
......
...@@ -131,6 +131,8 @@ typedef struct MOVTrack { ...@@ -131,6 +131,8 @@ typedef struct MOVTrack {
struct { struct {
int first_packet_seq; int first_packet_seq;
int first_packet_entry; int first_packet_entry;
int first_packet_seen;
int first_frag_written;
int packet_seq; int packet_seq;
int packet_entry; int packet_entry;
int slices; int slices;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment