[FFmpeg-devel] [PATCH] avformat/mpegts: fix resync logic stuck in 192 bytes

Marton Balint cus at passwd.hu
Tue May 19 22:06:59 EEST 2020


pos47_full is not updated for every packet, and for unseekable inputs the
resync logic might simply skip some 0x47 sync bytes. In order to detect these
let's check for modulo instead of exact value.

Also skip unrecognized sync byte distances instead of considering them as a
failure of detection. It only delays the detection of the new packet size.

Also note that AVIO only buffers a single packet (for UDP/mpegts, that usually
means 1316 bytes), so among every ten consecutive 188-byte MPEGTS packets there
will always be a seek failure, and that caused the old code to not find the 188
byte pattern across 10 consecutive packets.

Signed-off-by: Marton Balint <cus at passwd.hu>
---
 libavformat/mpegts.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index a065c61c40..f2b2c05d86 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -2846,12 +2846,14 @@ static void reanalyze(MpegTSContext *ts) {
     if (pos < 0)
         return;
     pos -= ts->pos47_full;
-    if (pos == TS_PACKET_SIZE) {
+    if (pos % TS_PACKET_SIZE == 0) {
         ts->size_stat[0] ++;
-    } else if (pos == TS_DVHS_PACKET_SIZE) {
+    } if (pos % TS_DVHS_PACKET_SIZE == 0) {
         ts->size_stat[1] ++;
-    } else if (pos == TS_FEC_PACKET_SIZE) {
+    } if (pos % TS_FEC_PACKET_SIZE == 0) {
         ts->size_stat[2] ++;
+    } else {
+        return;
     }
 
     ts->size_stat_count ++;
-- 
2.26.1



More information about the ffmpeg-devel mailing list