|
|
|
@ -738,13 +738,16 @@ static int matroska_read_close(AVFormatContext *s); |
|
|
|
|
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos) |
|
|
|
|
{ |
|
|
|
|
AVIOContext *pb = matroska->ctx->pb; |
|
|
|
|
int64_t ret; |
|
|
|
|
uint32_t id; |
|
|
|
|
matroska->current_id = 0; |
|
|
|
|
matroska->num_levels = 0; |
|
|
|
|
|
|
|
|
|
/* seek to next position to resync from */ |
|
|
|
|
if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0) |
|
|
|
|
goto eof; |
|
|
|
|
if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) { |
|
|
|
|
matroska->done = 1; |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
id = avio_rb32(pb); |
|
|
|
|
|
|
|
|
@ -760,7 +763,6 @@ static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos) |
|
|
|
|
id = (id << 8) | avio_r8(pb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
eof: |
|
|
|
|
matroska->done = 1; |
|
|
|
|
return AVERROR_EOF; |
|
|
|
|
} |
|
|
|
@ -3317,16 +3319,17 @@ static int matroska_parse_cluster(MatroskaDemuxContext *matroska) |
|
|
|
|
static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
|
{ |
|
|
|
|
MatroskaDemuxContext *matroska = s->priv_data; |
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
while (matroska_deliver_packet(matroska, pkt)) { |
|
|
|
|
int64_t pos = avio_tell(matroska->ctx->pb); |
|
|
|
|
if (matroska->done) |
|
|
|
|
return AVERROR_EOF; |
|
|
|
|
return (ret < 0) ? ret : AVERROR_EOF; |
|
|
|
|
if (matroska_parse_cluster(matroska) < 0) |
|
|
|
|
matroska_resync(matroska, pos); |
|
|
|
|
ret = matroska_resync(matroska, pos); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int matroska_read_seek(AVFormatContext *s, int stream_index, |
|
|
|
|