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)
This commit is contained in:
		
							parent
							
								
									0fe3383066
								
							
						
					
					
						commit
						639c60f5aa
					
				| @ -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++) { |     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) { |         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; |             viv->current_sb = i; | ||||||
|             // seek to ith sb block
 |             // seek to ith sb block
 | ||||||
|             avio_seek(s->pb, viv->sb_offset + viv->sb_blocks[i].byte_offset, SEEK_SET); |             avio_seek(s->pb, viv->sb_offset + viv->sb_blocks[i].byte_offset, SEEK_SET); | ||||||
|             // load the block
 |             // load the block
 | ||||||
|             load_sb_block(s, viv, 0); |             load_sb_block(s, viv, 0); | ||||||
|             // most problematic part: guess audio offset
 |             if (viv->num_audio) { | ||||||
|             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)); |                 const AVCodecParameters *par = s->streams[1]->codecpar; | ||||||
|             // hand-tuned 1.s a/v offset
 |                 // flush audio packet queue
 | ||||||
|             viv->audio_sample += s->streams[1]->codecpar->sample_rate; |                 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; |             viv->current_sb_entry = 0; | ||||||
|             return 1; |             return 1; | ||||||
|         } |         } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user