diff --git a/libavformat/takdec.c b/libavformat/takdec.c index 182eb9adc0..a5290173d8 100644 --- a/libavformat/takdec.c +++ b/libavformat/takdec.c @@ -27,7 +27,7 @@ typedef struct TAKDemuxContext { int mlast_frame; - int64_t left; + int64_t data_end; } TAKDemuxContext; static int tak_probe(AVProbeData *p) @@ -96,15 +96,18 @@ static int tak_read_header(AVFormatContext *s) av_log(s, AV_LOG_VERBOSE, "\n"); break; } - case TAK_METADATA_END: - if (pb->seekable) { - int64_t curpos = avio_tell(pb); + case TAK_METADATA_END: { + int64_t curpos = avio_tell(pb); + if (pb->seekable) { ff_ape_parse_tag(s); avio_seek(pb, curpos, SEEK_SET); } + + tc->data_end += curpos; return 0; break; + } default: ret = avio_skip(pb, size); if (ret < 0) @@ -131,8 +134,8 @@ static int tak_read_header(AVFormatContext *s) if (size != 11) return AVERROR_INVALIDDATA; tc->mlast_frame = 1; - tc->left = get_bits_longlong(&gb, TAK_LAST_FRAME_POS_BITS) + - get_bits(&gb, TAK_LAST_FRAME_SIZE_BITS); + tc->data_end = get_bits_longlong(&gb, TAK_LAST_FRAME_POS_BITS) + + get_bits(&gb, TAK_LAST_FRAME_SIZE_BITS); av_freep(&buffer); } else if (type == TAK_METADATA_ENCODER) { av_log(s, AV_LOG_VERBOSE, "encoder version: %0X\n", @@ -151,10 +154,11 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) if (tc->mlast_frame) { AVIOContext *pb = s->pb; - int64_t size; + int64_t size, left; - size = FFMIN(tc->left, 1024); - if (!size) + left = tc->data_end - avio_tell(s->pb); + size = FFMIN(left, 1024); + if (size <= 0) return AVERROR_EOF; ret = av_get_packet(pb, pkt, size); @@ -162,7 +166,6 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; pkt->stream_index = 0; - tc->left -= ret; } else { ret = ff_raw_read_partial_packet(s, pkt); }