This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit c50d6fca7ac14271e3164a19afedcf4c58834ffb
Author:     StressTestor <[email protected]>
AuthorDate: Sun Oct 11 22:26:31 2026 -0600
Commit:     Peter Ross <[email protected]>
CommitDate: Wed Oct 21 09:27:17 2026 +0000

    avformat/mpegts: stop the raw PCR readahead on a short read
    
    mpegts_raw_read_packet() with compute_pcr looks ahead up to
    MAX_PACKET_READAHEAD packets for the next PCR, reading 12 bytes of
    each candidate into a stack buffer with avio_read() and ignoring the
    return value. When the lookahead runs past the end of the file the
    buffer keeps whatever it held, uninitialised on the first iteration,
    and parse_pcr() is run on it. If those bytes happen to look like a
    PCR, the garbage difference becomes pcr_incr and is published as the
    duration of this packet and the pts of every later one. On a build
    with -ftrivial-auto-var-init=pattern a file ending in a partial
    packet yields duration=1716393918470 instead of 27000000.
    
    Stop the readahead when the seek or the read fails. The packet itself
    was already read successfully, and the "no next PCR found" fallback
    to the previous increment is the designed behaviour for this case, so
    failing the packet would be wrong.
    
    Same class as c2394a0ff3 (binka), 29f513af78 (fsb), 4b47405e1c (genh).
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
    Signed-off-by: StressTestor 
<[email protected]>
---
 libavformat/mpegts.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index c013452e97..8c7df85173 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -3673,8 +3673,9 @@ static int mpegts_raw_read_packet(AVFormatContext *s, 
AVPacket *pkt)
             /* we read the next PCR (XXX: optimize it by using a bigger buffer 
*/
             pos = avio_tell(s->pb);
             for (i = 0; i < MAX_PACKET_READAHEAD; i++) {
-                avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
-                avio_read(s->pb, pcr_buf, 12);
+                if (avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET) 
< 0 ||
+                    avio_read(s->pb, pcr_buf, sizeof(pcr_buf)) != 
sizeof(pcr_buf))
+                    break;
                 if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
                     /* XXX: not precise enough */
                     ts->pcr_incr =

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to