mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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>
This commit is contained in:
parent
a2a38b1606
commit
af867e59d9
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user