diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-10-10 12:50:22 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2012-10-10 13:09:26 +0000 |
commit | 03cc52a07d51526cb0269891ee3797d48fe20018 (patch) | |
tree | 26f17823509bf0aaff99533bf8c84a46e0951991 /libavformat/takdec.c | |
parent | c6d39fb3c5a763c2cfba34154e0f8ba52f02a96e (diff) | |
download | ffmpeg-03cc52a07d51526cb0269891ee3797d48fe20018.tar.gz |
takdec: fix seeking
The previous approach was just wrong.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavformat/takdec.c')
-rw-r--r-- | libavformat/takdec.c | 23 |
1 files changed, 13 insertions, 10 deletions
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); } |