static const char *const matroska_doctypes[] = { "matroska", "webm" };
+static int matroska_read_close(AVFormatContext *s);
+
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
{
AVIOContext *pb = matroska->ctx->pb;
while (res != 1) {
res = matroska_resync(matroska, pos);
if (res < 0)
- return res;
+ goto fail;
pos = avio_tell(matroska->ctx->pb);
res = ebml_parse(matroska, matroska_segment, matroska);
}
res = matroska_parse_tracks(s);
if (res < 0)
- return res;
+ goto fail;
attachments = attachments_list->elem;
for (j = 0; j < attachments_list->nb_elem; j++) {
matroska_convert_tags(s);
return 0;
+fail:
+ matroska_read_close(s);
+ return res;
}
/*
if (matroska->skip_to_keyframe &&
track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
- if (timecode < matroska->skip_to_timecode)
+ // Compare signed timecodes. Timecode may be negative due to codec delay
+ // offset. We don't support timestamps greater than int64_t anyway - see
+ // AVPacket's pts.
+ if ((int64_t)timecode < (int64_t)(matroska->skip_to_timecode))
return res;
if (is_keyframe)
matroska->skip_to_keyframe = 0;