[FFmpeg-cvslog] avformat/vividas: Fix crash when seeking without audio stream
Andreas Rheinhardt
git at videolan.org
Sat Apr 3 08:26:16 EEST 2021
ffmpeg | branch: release/4.4 | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Fri Apr 2 21:03:39 2021 +0200| [639c60f5aa5a23b2f23d7f934a0f1146b72f9f04] | committer: Andreas Rheinhardt
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 at outlook.com>
(cherry picked from commit af867e59d9ac3db5aaf7df4691f032e14ea51588)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=639c60f5aa5a23b2f23d7f934a0f1146b72f9f04
---
libavformat/vividas.c | 19 ++++++++++++-------
1 file 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;
}
More information about the ffmpeg-cvslog
mailing list