summaryrefslogtreecommitdiff
path: root/libavformat/smacker.c
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@araneo.si>2020-06-17 21:45:39 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-07-28 06:29:58 +0200
commitedea15657981ac85baa058f6cdb5588171349b83 (patch)
tree3d34429b6d9ce5898af66e8f479063ab470f0de3 /libavformat/smacker.c
parent7c59e1b0f285cd7c7b35fcd71f49c5fd52cf9315 (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/smacker.c')
-rw-r--r--libavformat/smacker.c26
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,
};