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

Marton Balint cus at passwd.hu
Wed May 20 09:26:37 EEST 2020



On Wed, 20 May 2020, lance.lmwang at gmail.com wrote:

> On Tue, May 19, 2020 at 09:06:59PM +0200, Marton Balint wrote:
>> 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.
>
> Before modifying and returning directly, I considered whether pos is a multiple 
> of raw_packet_size, by the debug information, it's not true.

Not always, because sometimes there are 0x47 sync bytes in the packet 
payload as well. But we siply ignore that case because of the return later 
originated from your patch. Checking for modulo allows faster detection 
and it also allows detection when UDP packets contain a single MPEGTS 
packet.

> Also it's possible
> for the pos of two sync byte > 188/192/204 * n. If that's true, it's not correct
> to look it as stats hit by the modulo logic.

I don't understand what you mean here.

Regards,
Marton


>
>> 
>> 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
>> 
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> 
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
> -- 
> Thanks,
> Limin Wang
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list