diff options
author | Timotej Lazar <timotej.lazar@araneo.si> | 2020-06-17 22:45:39 +0300 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-07-28 07:29:58 +0300 |
commit | edea15657981ac85baa058f6cdb5588171349b83 (patch) | |
tree | 3d34429b6d9ce5898af66e8f479063ab470f0de3 /libavformat | |
parent | 7c59e1b0f285cd7c7b35fcd71f49c5fd52cf9315 (diff) |
avformat/smacker: Support seeking to first frame
Add .read_seek function to the smacker demuxer for the special case of
seeking to ts=0. This is useful because smacker – like bink, with a
similar implementation – was mostly used to encode clips in video
games, where random seeks are rare but looping media are common.
Signed-off-by: Timotej Lazar <timotej.lazar@araneo.si>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/smacker.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libavformat/smacker.c b/libavformat/smacker.c index 0ca5a87b8f..5507e7c169 100644 --- a/libavformat/smacker.c +++ b/libavformat/smacker.c @@ -349,6 +349,31 @@ next_frame: return ret; } +static int smacker_read_seek(AVFormatContext *s, int stream_index, + int64_t timestamp, int flags) +{ + SmackerContext *smk = s->priv_data; + int64_t ret; + + /* only rewinding to start is supported */ + if (timestamp != 0) { + av_log(s, AV_LOG_ERROR, + "Random seeks are not supported (can only seek to start).\n"); + return AVERROR(EINVAL); + } + + if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0) + return ret; + + smk->cur_frame = 0; + smk->next_audio_index = 0; + smk->new_palette = 0; + memset(smk->pal, 0, sizeof(smk->pal)); + memset(smk->aud_pts, 0, sizeof(smk->aud_pts)); + + return 0; +} + AVInputFormat ff_smacker_demuxer = { .name = "smk", .long_name = NULL_IF_CONFIG_SMALL("Smacker"), @@ -356,4 +381,5 @@ AVInputFormat ff_smacker_demuxer = { .read_probe = smacker_probe, .read_header = smacker_read_header, .read_packet = smacker_read_packet, + .read_seek = smacker_read_seek, }; |