From patchwork Fri May 15 10:23:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 19697 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0DE3444AACD for ; Fri, 15 May 2020 13:23:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD939687F64; Fri, 15 May 2020 13:23:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F30F4680301 for ; Fri, 15 May 2020 13:23:44 +0300 (EEST) Received: by mail-pl1-f193.google.com with SMTP id f15so739055plr.3 for ; Fri, 15 May 2020 03:23:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=WuDJrd8n0prHFk2c7tIlrQvDrpmsDRoY5Omgagl+u1w=; b=tWNNKWR3djNc8IjBwy5yqGt0FB7wQvaalEg562Nuytfma3Aw/RX4fxQLFia2Rdw2aL pv97DKslou9hCo/pBQr6iYAQocwqPBnDhKoAhwAbeK5noeNs7gDTFjLT5Qr6wj0OTOO4 GUPDwtSQg6KEOPYP2o5nGU83jSrR7jSUVfkhEu5+krZ2NU++fSanT6fxz7CrZfV/Ciuy THNFjqPjEix+IgM389oX1mIlFAItrlSBBHcVP0IMRAWS2FPMyhJWsPsa3/a2wHGLMCev jBxiQTb0grmp9VXNGMFud/Y2Dfyt3G8I3X6SXX3Ac/FCSNi3eaBWod7OE/iSjUu9xqA9 bwCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=WuDJrd8n0prHFk2c7tIlrQvDrpmsDRoY5Omgagl+u1w=; b=PRgYgcOU+4eCxr85TK5CS6UCfpWzLkoeXVbbGVKWzmyjWWkuTjAH4C3DBGlwMElsuz rmLQY3BJIaVYhB5ijwFGsgjcREl8bA49lRgGmFNsf0rTYRafuvPCmnvUeIons5vYlAjR hXzOw63AYxzABlqLl/f1E+3gtYxxAClYDKgGDJRatW/HS0qw0Sw52t3w5gc9LmDpMi3S QPAYFQl5zXpWw6IBznHdVg6rfr2Ifx38QsfBMPsjC+r51Zef+7bGzNEYsvPHaGwHYi3o iKfUb3PjTaWgNlNaSeHD9ZC6BfbNGovgGUHAXSF2f3qQlNPKVlArwXywU6KXEqpYmGMZ ymbA== X-Gm-Message-State: AOAM530widTFheO1wFhq+by+GwlvJLwb0CtgU/Vo1OmnMu+soiGVtok4 +anzFvPHp+VJCd5y2erjPlKvV0no X-Google-Smtp-Source: ABdhPJybvnTi4W66prXVyjefaN3bZq5D+OzJ9LZOmo0gZUo+ZkT7j9sdsny3H01tlNPcTvYoDOdhdQ== X-Received: by 2002:a17:902:bb82:: with SMTP id m2mr2911042pls.291.1589538222804; Fri, 15 May 2020 03:23:42 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id g17sm1440614pgg.43.2020.05.15.03.23.41 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 May 2020 03:23:42 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 15 May 2020 18:23:38 +0800 Message-Id: <1589538218-22814-1-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 Subject: [FFmpeg-devel] [PATCH] avformat/mpegts: Check the next sync byte to avoid incorrectt detected raw packet size X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang reanalyze() may misdetect the new packet size as 204, but it's 188 still actualy, it'll cause many cc errors report and cannot be recovered. So it's better to check the next sync byte before skip the extra unused bytes. Also, it is best to change SIZE_STAT_THRESHOLD from 10 to 100? If the input stream has a master/slave switch serveral times, the raw size can be easily detected by mistake. Signed-off-by: Limin Wang --- libavformat/mpegts.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 0833d62..049555c 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2932,11 +2932,12 @@ static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, return 0; } -static void finished_reading_packet(AVFormatContext *s, int raw_packet_size) +static void finished_reading_packet(AVFormatContext *s, const uint8_t *data, int raw_packet_size) { AVIOContext *pb = s->pb; int skip = raw_packet_size - TS_PACKET_SIZE; - if (skip > 0) + /* Check the next sync byte to avoid incorrectt detected raw packet size */ + if (skip > 0 && data[TS_PACKET_SIZE] != 0x47) avio_skip(pb, skip); } @@ -2985,7 +2986,7 @@ static int handle_packets(MpegTSContext *ts, int64_t nb_packets) if (ret != 0) break; ret = handle_packet(ts, data, avio_tell(s->pb)); - finished_reading_packet(s, ts->raw_packet_size); + finished_reading_packet(s, data, ts->raw_packet_size); if (ret != 0) break; } @@ -3137,7 +3138,7 @@ static int mpegts_read_header(AVFormatContext *s) pid = AV_RB16(data + 1) & 0x1fff; if ((pcr_pid == -1 || pcr_pid == pid) && parse_pcr(&pcr_h, &pcr_l, data) == 0) { - finished_reading_packet(s, ts->raw_packet_size); + finished_reading_packet(s, data, ts->raw_packet_size); pcr_pid = pid; packet_count[nb_pcrs] = nb_packets; pcrs[nb_pcrs] = pcr_h * 300 + pcr_l; @@ -3154,7 +3155,7 @@ static int mpegts_read_header(AVFormatContext *s) } } } else { - finished_reading_packet(s, ts->raw_packet_size); + finished_reading_packet(s, data, ts->raw_packet_size); } nb_packets++; } @@ -3194,7 +3195,7 @@ static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt) } if (data != pkt->data) memcpy(pkt->data, data, ts->raw_packet_size); - finished_reading_packet(s, ts->raw_packet_size); + finished_reading_packet(s, data, ts->raw_packet_size); if (ts->mpeg2ts_compute_pcr) { /* compute exact PCR for each packet */ if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {