From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 6C18444598 for ; Fri, 16 Sep 2022 18:33:14 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CED2368BC33; Fri, 16 Sep 2022 21:33:12 +0300 (EEST) Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 12E4568BBEC for ; Fri, 16 Sep 2022 21:33:06 +0300 (EEST) Received: by mail-qt1-f182.google.com with SMTP id f26so14101441qto.11 for ; Fri, 16 Sep 2022 11:33:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date; bh=G+c8kV4ZiUxGjwtkWRGN3lNgG+1f/L5Nh0kXKwEZhls=; b=DXwS44sfyGVjp8KglVXuJczyGYzhAd0Mr6CDp9eTlUDbgYgRUEoViOdQVNdMWXZASa MfjfQYk8dKSNYJWNBAGWhcWyxeXb9ySOJs7YQ72vK1or3QPKEed9sbqg74xiebjpHByI G5Byd4oJZ9davoLm7+lGPBHbaI+dIOoghV4SGNUtiYUaP7dCu6S6du0Q1VpMVT2cSvhs 37rgyf7sBFG/9H68p7Nxht9xxjcr0nlEQiP+U0Y1ZXKrWgTuMNk5r9G4hWe3oOpBoZF0 IOrBCAtBl7Qctv1Luo95dT2ioyJTXReVwOWBNlWR/iNKpUxJbYRky3ens3eA76R+HgCs G/+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date; bh=G+c8kV4ZiUxGjwtkWRGN3lNgG+1f/L5Nh0kXKwEZhls=; b=Dav56bNEbdVCukZTiYyQxiaK+Ytd1CSYnhn+7Ut5lSHDk4Aq3cAfCd2oJ8cWFfug2e 7vrv2VGJP41D0VLMqIVw5yCRXSf4u7Z1s+Le3z3Ndot4RJDLawSWdGZNv72ku5j/67rY +9NZ/RNuz2KqujZePeTTpqj+WXF3Jqlx/PKMGM2Rf9gRDJrRE54EeU6HGpLu5XGe5J9j rDZ+9RZsOqzvzleZfvwHlg2XUHlBbRoBgtsRiAhvffdLVEk5xIruBowWKOftnvij/pbs 9Ec+mdjl/jUcu2lEABHyGBJKaHlGSjVfLma+PAJEoyGPYLTpGGuc+Oz8J5IpGqipS6H9 lp+g== X-Gm-Message-State: ACrzQf0YlWa4cqNPeJU3Pt9FgjrdKZWF9cdgubKMeMkwP1O+5lmVq/WU 37NgHWde8hdRVmUCwLFCihgkX4e9ar4= X-Google-Smtp-Source: AMsMyM76Diz80eQhbt6u4RtfbHzXEmF1eDzBk3GhBNB6SUO0aoDZjpDDcYw1MB2sLdinVNyvOrZ5cQ== X-Received: by 2002:a05:622a:186:b0:35c:bb0a:936a with SMTP id s6-20020a05622a018600b0035cbb0a936amr5603271qtw.387.1663353184242; Fri, 16 Sep 2022 11:33:04 -0700 (PDT) Received: from [192.168.1.13] (pool-71-114-80-52.washdc.fios.verizon.net. [71.114.80.52]) by smtp.gmail.com with ESMTPSA id y18-20020ac85f52000000b00342f844e30fsm6333105qta.31.2022.09.16.11.33.03 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 16 Sep 2022 11:33:03 -0700 (PDT) Message-ID: <86e32dc8-2a06-9267-c542-17542523dc45@gmail.com> Date: Fri, 16 Sep 2022 14:33:02 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220213224237.178797-1-scott.the.elm@gmail.com> <20220515201844.370158-1-scott.the.elm@gmail.com> From: Scott Theisen In-Reply-To: <20220515201844.370158-1-scott.the.elm@gmail.com> Subject: Re: [FFmpeg-devel] [PATCH v2] 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Ping. Still applies cleanly. On 5/15/22 16:18, Scott Theisen wrote: > switch-case over es_type and then perform a linear search over > startcode. > --- > This version doesn't use stdbool.h but is otherwise identical. > > libavformat/mpeg.c | 213 +++++++++++++++++++++++++++------------------ > 1 file changed, 130 insertions(+), 83 deletions(-) > > diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c > index 864b08d8f8..dfa6852453 100644 > --- a/libavformat/mpeg.c > +++ b/libavformat/mpeg.c > @@ -483,6 +483,7 @@ static int mpegps_read_packet(AVFormatContext *s, > AVStream *st; > FFStream *sti; > int len, startcode, i, es_type, ret; > + int identified = 0; > int pcm_dvd = 0; > int request_probe= 0; > enum AVCodecID codec_id = AV_CODEC_ID_NONE; > @@ -523,92 +524,138 @@ redo: > goto found; > } > > + // identify packet encoding > + identified = 1; > 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 = 0; > + break; > + } > + if (!identified) { > + identified = 1; > + if (startcode < 0x20) { > + identified = 0; > } > - } 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 = 0; > + } > + 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 = 0; // 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 = 0; > + } > + 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 = 0; > + } > + else if (startcode <= 0xFD5F) { // 0xFD55 to 0xFD5F > + type = AVMEDIA_TYPE_VIDEO; > + codec_id = AV_CODEC_ID_VC1; > + } > + else { > + identified = 0; > + } > + } > + > + if (!identified) { > skip: > /* skip packet */ > avio_skip(s->pb, len); _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".