From patchwork Sun Feb 13 22:42:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Theisen X-Patchwork-Id: 34272 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:14aa:0:0:0:0 with SMTP id bz10csp5038502nkb; Sun, 13 Feb 2022 14:43:06 -0800 (PST) X-Google-Smtp-Source: ABdhPJxTnxD5+H9ZxLxxVVkPUlfas21asAtulauydyU3tE2pyNws4HP4He6LKY4Jy/le5be6M1uS X-Received: by 2002:a05:6402:90b:: with SMTP id g11mr13194003edz.97.1644792186595; Sun, 13 Feb 2022 14:43:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644792186; cv=none; d=google.com; s=arc-20160816; b=UNUlKjslHoqQ117tUS6Lok5IiLJPxZoZOyB/9JqzcZQwLaOx9P1ztM7cZRadOoS9qD LdveIxaeEq6b/35AUpz8VLTJLyJt4iLEGC8TjhOQfQyqD3unDyfwDxlHgI8DYBMUHg15 PlWA7VTfRyXGnFMz35mgxqNnD4To+fkybyfrx5rq4G9Mi4MoljFOjiLjX9BTa/1okJiC /dWefolCHQ/u/Q6EE02nS50lrC0MWQ/ewodcfzyGcAyBg1NjPkQrN9qbKNz7SiNRNvvE QEklm1T0vvwoV8O61I1ngq+1v+S8HnaD6e+HVhZUgh/Vh1naCq9AAJW0Y9LqJ/4Sti4x f6Zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=H83wEIFQUHH32+lgn2EmkPhlLhm4CwOmvPTlCgyxiro=; b=AdTxqvCU7QohZC3cDV0pdZ8b8kSEAf/t1xphgeMvWYqu3X3UJt1ogyd6YR0UMUoOg7 KxbJu26qRcreGkcysR1PFz6l+kRHHS5XP0tLhfNlj/QOowSPLCTJWkHJGgqKW9HhxnOL yAQs14ejm3xa8Hr7BVOUIKCIoPYHQ9yQe9AkboOf2U4TOxB60MjO9gY6d1VFJDEPfvlV eUSBZDka51sI36Bt81bSmKN+SL9HcT96RoUeXUmD3+dCaj2HM1nDh+G4xon3W6k+UT2i 4q0HEXR4U1zbn0SFC7KVN8bvzU2dLGX5Qt4MkkEH05Z4o0H89KYL9lpaFJEhbJcAqnly Jx3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=DvzjaJka; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y14si23394842eda.593.2022.02.13.14.43.05; Sun, 13 Feb 2022 14:43:06 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=DvzjaJka; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8AA0768B2CF; Mon, 14 Feb 2022 00:43:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CFBD068B214 for ; Mon, 14 Feb 2022 00:42:55 +0200 (EET) Received: by mail-qt1-f180.google.com with SMTP id y8so14063355qtn.8 for ; Sun, 13 Feb 2022 14:42:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4IWoppvJvmeFUdIfwZVeEEHCRrAVDwcPzTXw7mCOmXM=; b=DvzjaJkalpFN/ceBObmC2T1JB39q+AiDxrFyGjS9K8swan0dw1fFnvb3rCjoQ1Z2w/ +ksR+JrtaJ6Ii8bv7jecW1LUImqOUn8YB9O1SSYDphLqnVXalQALRUuVO+KvYqBh+Reo XKj9n1WI87VZMihLLpRzqlq6PHa9csV4NhjMgVOsIrc9kOYBGMkXP/fv7pAOEC/sTzhJ 6mlDVJkEZNS5x3hBQdVh2AMzczX3S40W8XBtKGjh9tspWLHPO0wdKR+APGSEtBRmOHlk ckyp0sCBkCKqPYyBK0OtfuajoXcNplVQSAw9YU+I+Dr5f79wazvJQQouWz+q6+lS3lCk H2rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4IWoppvJvmeFUdIfwZVeEEHCRrAVDwcPzTXw7mCOmXM=; b=BQjopwt76kfF0c0gOBweYOxMzKbuHAR334fXjxaKAthj8SxhXLmA0NLF8HxtEdmHg8 JBlVMQt6Jt4MJitj/bV/unfjCdgwh4g1dCwCWBvgD6gGu3horXldWlCdE8zbjoAzl/DZ 3NtlIKsHZyl/98IziYmWL0kuZ2JS7rfrg6IwV/eOT5wYy6H4FekrloakA/bGOUcpmc82 cIW/2pYShihcH9YHprB3XS9b4mcPAZfHoHL4HY8g01w4fFRoxG3XHPnpH6FpirELe0Ic PPCia16XdH//j8az0Sl/cZ5rhD/YqQQr2O3RJcSFBRE4ElwoM5vDRP1ZwSoF1awvQemy hJVw== X-Gm-Message-State: AOAM533lNLXIjnsM3JnQvuFmJvubf7hc/QyeTwZPGu5VRYxh77Y77rjT IhIZJRDADiS5RGoh/n6KS/x1zMqStBLOpQ== X-Received: by 2002:a05:622a:489:: with SMTP id p9mr7785702qtx.11.1644792174131; Sun, 13 Feb 2022 14:42:54 -0800 (PST) Received: from localhost.localdomain ([151.200.235.219]) by smtp.gmail.com with ESMTPSA id bm27sm13995585qkb.5.2022.02.13.14.42.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Feb 2022 14:42:53 -0800 (PST) From: Scott Theisen To: ffmpeg-devel@ffmpeg.org Date: Sun, 13 Feb 2022 17:42:37 -0500 Message-Id: <20220213224237.178797-1-scott.the.elm@gmail.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/mpeg.c: improve readability of packet identification logic X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Scott Theisen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 7M60n9oX4zha switch-case over es_type and then perform a linear search over startcode. --- libavformat/mpeg.c | 215 ++++++++++++++++++++++++++++----------------- 1 file changed, 132 insertions(+), 83 deletions(-) diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index ca15d9f241..c1b1c7e7de 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "libavutil/channel_layout.h" #include "avformat.h" #include "avio_internal.h" @@ -480,6 +482,7 @@ static int mpegps_read_packet(AVFormatContext *s, AVStream *st; FFStream *sti; int len, startcode, i, es_type, ret; + bool identified = false; int pcm_dvd = 0; int request_probe= 0; enum AVCodecID codec_id = AV_CODEC_ID_NONE; @@ -520,92 +523,138 @@ redo: goto found; } + // identify packet encoding + identified = true; es_type = m->psm_es_type[startcode & 0xff]; - if (es_type == STREAM_TYPE_VIDEO_MPEG1) { - codec_id = AV_CODEC_ID_MPEG2VIDEO; - type = AVMEDIA_TYPE_VIDEO; - } else if (es_type == STREAM_TYPE_VIDEO_MPEG2) { - codec_id = AV_CODEC_ID_MPEG2VIDEO; - type = AVMEDIA_TYPE_VIDEO; - } else if (es_type == STREAM_TYPE_AUDIO_MPEG1 || - es_type == STREAM_TYPE_AUDIO_MPEG2) { - codec_id = AV_CODEC_ID_MP3; - type = AVMEDIA_TYPE_AUDIO; - } else if (es_type == STREAM_TYPE_AUDIO_AAC) { - codec_id = AV_CODEC_ID_AAC; - type = AVMEDIA_TYPE_AUDIO; - } else if (es_type == STREAM_TYPE_VIDEO_MPEG4) { - codec_id = AV_CODEC_ID_MPEG4; - type = AVMEDIA_TYPE_VIDEO; - } else if (es_type == STREAM_TYPE_VIDEO_H264) { - codec_id = AV_CODEC_ID_H264; - type = AVMEDIA_TYPE_VIDEO; - } else if (es_type == STREAM_TYPE_VIDEO_HEVC) { - codec_id = AV_CODEC_ID_HEVC; - type = AVMEDIA_TYPE_VIDEO; - } else if (es_type == STREAM_TYPE_AUDIO_AC3) { - codec_id = AV_CODEC_ID_AC3; - type = AVMEDIA_TYPE_AUDIO; - } else if (m->imkh_cctv && es_type == 0x91) { - codec_id = AV_CODEC_ID_PCM_MULAW; - type = AVMEDIA_TYPE_AUDIO; - } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { - static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; - unsigned char buf[8]; - - avio_read(s->pb, buf, 8); - avio_seek(s->pb, -8, SEEK_CUR); - if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) - codec_id = AV_CODEC_ID_CAVS; - else - request_probe= 1; - type = AVMEDIA_TYPE_VIDEO; - } else if (startcode == PRIVATE_STREAM_2) { - type = AVMEDIA_TYPE_DATA; - codec_id = AV_CODEC_ID_DVD_NAV; - } else if (startcode >= 0x1c0 && startcode <= 0x1df) { - type = AVMEDIA_TYPE_AUDIO; - if (m->sofdec > 0) { - codec_id = AV_CODEC_ID_ADPCM_ADX; - // Auto-detect AC-3 - request_probe = 50; - } else if (m->imkh_cctv && startcode == 0x1c0 && len > 80) { - codec_id = AV_CODEC_ID_PCM_ALAW; - request_probe = 50; - } else { - codec_id = AV_CODEC_ID_MP2; - if (m->imkh_cctv) - request_probe = 25; + switch (es_type) { + case STREAM_TYPE_VIDEO_MPEG1: // 0x01 + case STREAM_TYPE_VIDEO_MPEG2: // 0x02 + codec_id = AV_CODEC_ID_MPEG2VIDEO; + type = AVMEDIA_TYPE_VIDEO; + break; + case STREAM_TYPE_VIDEO_MPEG4: // 0x10 + codec_id = AV_CODEC_ID_MPEG4; + type = AVMEDIA_TYPE_VIDEO; + break; + case STREAM_TYPE_VIDEO_H264: // 0x1B + codec_id = AV_CODEC_ID_H264; + type = AVMEDIA_TYPE_VIDEO; + break; + case STREAM_TYPE_VIDEO_HEVC: // 0x24 + codec_id = AV_CODEC_ID_HEVC; + type = AVMEDIA_TYPE_VIDEO; + break; + case STREAM_TYPE_AUDIO_MPEG1: // 0x03 + case STREAM_TYPE_AUDIO_MPEG2: // 0x04 + codec_id = AV_CODEC_ID_MP3; + type = AVMEDIA_TYPE_AUDIO; + break; + case STREAM_TYPE_AUDIO_AAC: // 0x0F + codec_id = AV_CODEC_ID_AAC; + type = AVMEDIA_TYPE_AUDIO; + break; + case STREAM_TYPE_AUDIO_AC3: // 0x81 + codec_id = AV_CODEC_ID_AC3; + type = AVMEDIA_TYPE_AUDIO; + break; + default: + if (m->imkh_cctv && es_type == 0x91) { + codec_id = AV_CODEC_ID_PCM_MULAW; + type = AVMEDIA_TYPE_AUDIO; + break; + } + identified = false; + break; + } + if (!identified) { + identified = true; + if (startcode < 0x20) { + identified = false; } - } else if (startcode >= 0x80 && startcode <= 0x87) { - type = AVMEDIA_TYPE_AUDIO; - codec_id = AV_CODEC_ID_AC3; - } else if ((startcode >= 0x88 && startcode <= 0x8f) || - (startcode >= 0x98 && startcode <= 0x9f)) { - /* 0x90 - 0x97 is reserved for SDDS in DVD specs */ - type = AVMEDIA_TYPE_AUDIO; - codec_id = AV_CODEC_ID_DTS; - } else if (startcode >= 0xa0 && startcode <= 0xaf) { - type = AVMEDIA_TYPE_AUDIO; - if (!pcm_dvd) { - codec_id = AV_CODEC_ID_MLP; - } else { - codec_id = AV_CODEC_ID_PCM_DVD; + else if (startcode <= 0x3F) { // 0x20 to 0x3F + type = AVMEDIA_TYPE_SUBTITLE; + codec_id = AV_CODEC_ID_DVD_SUBTITLE; } - } else if (startcode >= 0xb0 && startcode <= 0xbf) { - type = AVMEDIA_TYPE_AUDIO; - codec_id = AV_CODEC_ID_TRUEHD; - } else if (startcode >= 0xc0 && startcode <= 0xcf) { - /* Used for both AC-3 and E-AC-3 in EVOB files */ - type = AVMEDIA_TYPE_AUDIO; - codec_id = AV_CODEC_ID_AC3; - } else if (startcode >= 0x20 && startcode <= 0x3f) { - type = AVMEDIA_TYPE_SUBTITLE; - codec_id = AV_CODEC_ID_DVD_SUBTITLE; - } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) { - type = AVMEDIA_TYPE_VIDEO; - codec_id = AV_CODEC_ID_VC1; - } else { + else if (startcode < 0x80) { // 0x40 to 0x7F + identified = false; + } + else if (startcode <= 0x87) { // 0x80 to 0x87 + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_AC3; + } + else if (startcode <= 0x8F) { // 0x88 to 0x8F (to 0x9F excluding 0x90 - 0x97) + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_DTS; + } + else if (startcode <= 0x97) { // exclude 0x90 to 0x97 + identified = false; // 0x90 - 0x97 is reserved for SDDS in DVD specs + } + else if (startcode <= 0x9F) { // 0x98 to 0x9F (from 0x88 excluding 0x90 - 0x97) + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_DTS; + } + else if (startcode <= 0xAF) { // 0xA0 to 0xAF + type = AVMEDIA_TYPE_AUDIO; + codec_id = (!pcm_dvd) ? AV_CODEC_ID_MLP : AV_CODEC_ID_PCM_DVD; + } + else if (startcode <= 0xBF) { // 0xB0 to 0xBF + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_TRUEHD; + } + else if (startcode <= 0xCF) { // 0xC0 to 0xCF + /* Used for both AC-3 and E-AC-3 in EVOB files */ + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_AC3; + } + else if (startcode < 0x1BF) { // 0xD0 to 0x1BE + identified = false; + } + else if (startcode == PRIVATE_STREAM_2) { // 0x1BF + type = AVMEDIA_TYPE_DATA; + codec_id = AV_CODEC_ID_DVD_NAV; + } + else if (startcode <= 0x1DF) { // 0x1C0 to 0x1DF + type = AVMEDIA_TYPE_AUDIO; + if (m->sofdec > 0) { + codec_id = AV_CODEC_ID_ADPCM_ADX; + // Auto-detect AC-3 + request_probe = 50; + } + else if (m->imkh_cctv && startcode == 0x1c0 && len > 80) { + codec_id = AV_CODEC_ID_PCM_ALAW; + request_probe = 50; + } + else { + codec_id = AV_CODEC_ID_MP2; + if (m->imkh_cctv) + request_probe = 25; + } + } + else if (startcode <= 0x1EF) { // 0x1E0 to 0x1EF + static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; + unsigned char buf[8]; + + avio_read(s->pb, buf, 8); + avio_seek(s->pb, -8, SEEK_CUR); + if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) + codec_id = AV_CODEC_ID_CAVS; + else + request_probe= 1; + type = AVMEDIA_TYPE_VIDEO; + } + else if (startcode < 0xFD55) { // 0x01F0 to 0xFD54 + identified = false; + } + else if (startcode <= 0xFD5F) { // 0xFD55 to 0xFD5F + type = AVMEDIA_TYPE_VIDEO; + codec_id = AV_CODEC_ID_VC1; + } + else { + identified = false; + } + } + + if (!identified) { skip: /* skip packet */ avio_skip(s->pb, len);