diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-04-02 21:03:39 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-04-03 07:20:39 +0200 |
commit | 639c60f5aa5a23b2f23d7f934a0f1146b72f9f04 (patch) | |
tree | e715fe48724817f61a09877ac8c8a32937e3de60 | |
parent | 0fe3383066db70c3c60c4137a0a83e26f992e906 (diff) | |
download | ffmpeg-639c60f5aa5a23b2f23d7f934a0f1146b72f9f04.tar.gz |
avformat/vividas: Fix crash when seeking without audio stream
The current code tries the access the codecpar of a nonexistent
audio stream when seeking. Stop that. Fixes ticket #9121.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
(cherry picked from commit af867e59d9ac3db5aaf7df4691f032e14ea51588)
-rw-r--r-- | libavformat/vividas.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/libavformat/vividas.c b/libavformat/vividas.c index 603d01a2dc..d35a646bde 100644 --- a/libavformat/vividas.c +++ b/libavformat/vividas.c @@ -757,18 +757,23 @@ static int viv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp for (int i = 0; i < viv->n_sb_blocks; i++) { if (frame >= viv->sb_blocks[i].packet_offset && frame < viv->sb_blocks[i].packet_offset + viv->sb_blocks[i].n_packets) { - // flush audio packet queue - viv->current_audio_subpacket = 0; - viv->n_audio_subpackets = 0; viv->current_sb = i; // seek to ith sb block avio_seek(s->pb, viv->sb_offset + viv->sb_blocks[i].byte_offset, SEEK_SET); // load the block load_sb_block(s, viv, 0); - // most problematic part: guess audio offset - viv->audio_sample = av_rescale_q(viv->sb_blocks[i].packet_offset, av_make_q(s->streams[1]->codecpar->sample_rate, 1), av_inv_q(s->streams[0]->time_base)); - // hand-tuned 1.s a/v offset - viv->audio_sample += s->streams[1]->codecpar->sample_rate; + if (viv->num_audio) { + const AVCodecParameters *par = s->streams[1]->codecpar; + // flush audio packet queue + viv->current_audio_subpacket = 0; + viv->n_audio_subpackets = 0; + // most problematic part: guess audio offset + viv->audio_sample = av_rescale_q(viv->sb_blocks[i].packet_offset, + av_make_q(par->sample_rate, 1), + av_inv_q(s->streams[0]->time_base)); + // hand-tuned 1.s a/v offset + viv->audio_sample += par->sample_rate; + } viv->current_sb_entry = 0; return 1; } |