You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avformat/oggparseopus: fix segmented timestamps
Fix timestamp calculation for code 3 Ogg Opus packets with less than 2 bytes in the last segment (e.g. packet length 255 or 256). A sample that would seek incorrectly in ffplay can be created with: ffmpeg -i in.wav -b:a 34k -vbr off -frame_duration 60 out.opus and libopus 1.1 Also do not read past the end of the buffer when a packet has length 0. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
				
					committed by
					
						 Michael Niedermayer
						Michael Niedermayer
					
				
			
			
				
	
			
			
			
						parent
						
							5e0c7eab2a
						
					
				
				
					commit
					262451878b
				
			| @@ -130,16 +130,13 @@ static int opus_packet(AVFormatContext *avf, int idx) | ||||
|         duration += d; | ||||
|         last_pkt = next_pkt =  next_pkt + os->psize; | ||||
|         for (; seg < os->nsegs; seg++) { | ||||
|             if (os->segments[seg] < 255) { | ||||
|                 int d = opus_duration(last_pkt, os->segments[seg]); | ||||
|                 if (d < 0) { | ||||
|                     duration = os->granule; | ||||
|                     break; | ||||
|                 } | ||||
|                 duration += d; | ||||
|                 last_pkt  = next_pkt + os->segments[seg]; | ||||
|             } | ||||
|             next_pkt += os->segments[seg]; | ||||
|             if (os->segments[seg] < 255 && next_pkt != last_pkt) { | ||||
|                 int d = opus_duration(last_pkt, next_pkt - last_pkt); | ||||
|                 if (d > 0) | ||||
|                     duration += d; | ||||
|                 last_pkt = next_pkt; | ||||
|             } | ||||
|         } | ||||
|         os->lastpts                 = | ||||
|         os->lastdts                 = os->granule - duration; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user