On 5/16/2019 7:29 PM, Andreas Rheinhardt wrote: > The earlier code relied on the length of clusters always being coded on > eight bytes as was the behaviour of libavformat's Matroska muxer until > recently. But given that our own Matroska muxer now (and mkvmerge from > time immemorial) creates files that don't conform to this assumption, > it is high time to get rid of this assumption. > > Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> > --- > I originally planed for this patch to get merged before my Matroska muxer > patches. > libavformat/matroskadec.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c > index 4dd933ef74..6fd5537f5a 100644 > --- a/libavformat/matroskadec.c > +++ b/libavformat/matroskadec.c > @@ -3711,15 +3711,17 @@ static int > webm_clusters_start_with_keyframe(AVFormatContext *s) > cluster_pos = s->streams[0]->index_entries[index].pos; > before_pos = avio_tell(s->pb); > while (1) { > - int64_t cluster_id = 0, cluster_length = 0; > + uint64_t cluster_id, cluster_length; > + int read; > AVPacket *pkt; > avio_seek(s->pb, cluster_pos, SEEK_SET); > // read cluster id and length > - ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id); > - ebml_read_length(matroska, matroska->ctx->pb, &cluster_length); > - if (cluster_id != 0xF43B675) { // done with all clusters > + read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id); > + if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
This could be changed to use the matroska.h define instead. > + break; > + read = ebml_read_length(matroska, matroska->ctx->pb, > &cluster_length); > + if (read < 0) > break; > - } > avio_seek(s->pb, cluster_pos, SEEK_SET); > matroska->current_id = 0; > matroska_clear_queue(matroska); > @@ -3728,7 +3730,8 @@ static int > webm_clusters_start_with_keyframe(AVFormatContext *s) > break; > } > pkt = &matroska->queue->pkt; > - cluster_pos += cluster_length + 12; // 12 is the offset of the > cluster id and length. > + // 4 + read is the length of the cluster id and the cluster length > field. > + cluster_pos += 4 + read + cluster_length; > if (!(pkt->flags & AV_PKT_FLAG_KEY)) { > rv = 0; > break; Applied, thanks. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".