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:
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user