From patchwork Mon Sep 4 11:27:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43512 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1136831pzb; Mon, 4 Sep 2023 04:28:16 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFp9xrB0FfZx3TcECk8W61LFq/t2BQAytB6uvyGyoiKoBinWFn6bWHPDRwbiIaGT/WSsFge X-Received: by 2002:a17:906:2210:b0:994:1eb4:6898 with SMTP id s16-20020a170906221000b009941eb46898mr7746810ejs.9.1693826896415; Mon, 04 Sep 2023 04:28:16 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f19-20020a170906391300b009935d9765fasi6264543eje.1013.2023.09.04.04.28.13; Mon, 04 Sep 2023 04:28:16 -0700 (PDT) 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=@outlook.com header.s=selector1 header.b=Ib69ya9g; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 28BCB68C7D3; Mon, 4 Sep 2023 14:27:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2063.outbound.protection.outlook.com [40.92.90.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AF4BC68C3C4 for ; Mon, 4 Sep 2023 14:27:45 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=e+xbgdL2n64mKLEEnW9BHZ5MzHEMllGqRtOMSZ5zdzZw1hrC8sfx0py3QtGnR9okuC5E4ROrgyjOCUgQc7OjunBJQkT3VgIg0DiNgcfpjECcHrR36uhTc/n0ifZ4hH406g6n5MrmGnxppjjrTH6aF5sQqx9fpYYw049n4mIYMJ2pyM2O+qPgJUz5O59aiYCBPSERdzbqehHXdLX8IpB6dx/CetkA7U+AImtU8BMjrdNzvwvBiWVv8xwht2dzw73Yvihm259RKHZfFk8eqE1oWcgCSOF4sWljMky4WadxgkYMSv3C3SaGpZkq2H3oYIR7wUvHqrwLDhMPTnxLMp5SgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZhRYUwetIV/QFfwD+EFVlbfkvYGDHrrWBQCp8z/k8OA=; b=QTAxQNoNNlKU6JQc/sfmywlnJ8DuYhxV+hQwx38JJkDfF1fBLDoXBHcFFFSAxDdrkrHS37BlgOGA65kh4nCPrVQc4MvTUqBZLQj421X2SjnBEazU0A+aYSYZbXvyn+QgOaW0b85JcXuTzkvOjFZ8d7ATG+wlsNrea4OtbwBq+CZfsdYxVcrq9kprY12hDFLFDoHUDig9w+gk7NeWBQ/S47LEsQLi2HiROJE+oHRdE1s5nz269KE1AsfaByqMu29u4oj2BB9MsDXjt3i37Sp7x45/KodyNYOPKk0Zt1UWwjQE6+OmQctpUI8gZ8R8IQVPd+msRIwWcV7K7EvwmdIN+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZhRYUwetIV/QFfwD+EFVlbfkvYGDHrrWBQCp8z/k8OA=; b=Ib69ya9gCp1uqoFaDUM+2OeNxNQ7eYobi2XDv51AcrT8/f5a44E2YLkjQMvZFw/yii5zcfGE/03u8glEILWFU8fA5SzHkLy/z40YLvPKZzCTQqCfGeTpr869rQWDzich7U8J8+zOK3FY8Exdu/xlkTP3K5O19bkBcz+bbcNv0DB/BWiSlstN21/8KavMDIHlchMRgKp1JJgE1/1mUYYoR36sR3XB8TPCWnC2bb27JHQW/l8s0QUU5Ketj29omMgGW8S7xl2cZpaTF8cQdjcRviudTUn1RzIFrjz6ew4zdouovFA8wv0e9B1qrY8Kz0j9TO4I+Hu9TkzK5KbgMiUqXA== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0280.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:32b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6745.32; Mon, 4 Sep 2023 11:27:44 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6745.030; Mon, 4 Sep 2023 11:27:44 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 13:27:48 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [Cl9ynzlMrDNnek3Pse0WTKuyjHSo3DMsdfWwf3G4MJY=] X-ClientProxiedBy: ZR2P278CA0078.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:65::13) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230904112759.2652347-8-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0280:EE_ X-MS-Office365-Filtering-Correlation-Id: 783a3701-9ade-495d-c1fb-08dbad39f53e X-MS-Exchange-SLBlob-MailProps: 0wLWl8rLpvtlEyItUpZmgfjbRm+zWpoMM6TtcvDvHz9dpdHAQj+HXHRNAvjacNM/yEk1d9G0Mp4AsAoGyNXpBs5ZFxVMubwwQc0HgRdebTr3NKmZkxbznztbDufEtETXSYRNWHhH0SFhpTEvetLeUJomJ3Jbe5e/dvJyefPTe1J+ekkU2d+0Vh51vs8bPbYFgYckRERLaaFXJ8nFOQQG1MpZMk5F+Q/6uSinSiDQw7VY81CFjHgu2MzEQH56oGJv4KS6g1vzOPwmb/wZKh/Ueod4uOQxuH79EhkjPi7vfLDTVTLHYiCOI5NbImpFtFV5dYqwXFpqSRlXWazColHLaKY1GJFb/Cif4tXs78NEO0RWi2obNKQ7EEXxOaTXrIMoh3ZSsBIirOvTMGIiYCv7KkeoRDXo9QtZ0to4NlbzMeM2riUoIMEIjElxq1HxEaDhYJapY3i6qjeqeHN43SlYidfY4K96VHBoHM2Me3qsd8xqZ7XblMqmJ5Wm4EYkkUAOb5gJRH2xFVs9UuExtkEUttXdXigQ68P2wc8MtfQARIoL88XkZzyTNDEQyOt2It+30DeA/mi/nBRYaUHywZWNhlwQsCv4PbwSvXlS1Uy+tNTy65jqL8wmqvhJm1TmZ3ZwbRMxU21eKxfmrMPCDHy1xx6hQkNalHodtlK5rBE7aQkBqZQH2+C7XC+TQEYidh/jSUYMsUTUzmy5KhlLEsg8oesre0QK/kTyoTH0Vb4YtmDOHPPzROxa/5CSM3n8ksCCBPEWiAM/oQc= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: f7QI4+fug1dVgaGQ9md/Qr6d2WfqVRdipHZnuKGqzA5miqLwk9uMS+akepwiNUXVKvcTzTYno+YXBVJKgOqF0u1aX09E/WC/Sjt41eykamv2aa7aIWEEeELUVFc8dp5Im1ImCZZ2IXq1Yc9rpEmHDu8Jh0TXKK4hBvwEp9wbAFXxo/dU2ri+eOtfn/3Zqa+Q9Z9XbyaXT3xzVFEr+pfx7gHvwwC9lSvekPPe5ZC9vBBtoJ4HmDv/yL2yXWpehXs/NXAdzlc4nQqnm+DsS2QNbAmpzyoYLaaBCu6bHp3F3FbSRi2WYZL9uwiC6Tz/lpwGPLTxyue0jkGApi22JgZlI1vDEgdGd/kzX85Wesohik3D7lMvomZPylurW59KWzbNtUkJOWBEr9RJKGrByeFnwcfWffiXamqymHaZ4hT9kJ8Wob88h+bWit8VhYXHn6SDLqWryiH/S30do4bZqv1N4rF+9L8HoSIZhDE+bLCL92dz79EmEx8UQh+WeNXNnpKHNq6gujINw1Fm3xflf1V2HndXX3cXvyZXwagBgx5aZIYsb/+VgecM5Eff9EDWuC8GqUMpLthsMH4iNqRTeLr05UWaxS244qHdGkBE3qshEQ8= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NBhHsFAbx7KSenSB464N/HxY3S6AiXAAF4jA2K4z1JCdtvJ2c4OmoJo7LsSGwRkP5kXvFyPwc92Zy0Dz7GdLOtelenZuKVBCKhpUPQL0dBML71xdHR9HWqIuaGCatU38slXWY81g7EOvhin3l/DSfh1tXPP2M0HyKptKhfnuc+r+jW9k6fWd4sW9arfU6ooYY3aCubDQMc5NGBgwo3aF49AOTIE5QFXzfz+s3ogxHr+OUwxULfexhnh1eV5ceyRg2o3NlxwPHWXdoeGoukk0SMBBGpy9sSli3sEQVlOQxiP3gQTMFSGk3pxhy9JwJhmpFtZUp62+y8Nm35BpgfXJxzttZ/cMvCNuHT1mAwQnP8yDcAxGDwcG1ho5gjxBVKwcamwnlNOsp51Dx+HesKOTPXlAc/IzeJMeChuvrXTv41IckyqknKXRSIVhsmCWRL/QyAfXV+lcZP404iGluBc2OEecuwmhBQ8Bs0Gt9dftky2mVx5jJBJwdRP0K3mB2uX/T1d/OKKmPDper99bHE2yXuSD+FYoXZvjKZMYV85AdEoJ6eSzlcz706W1N8jDfMeho1OGaMipW2jx2sFYyq0kwA0SEmMMpeFU/B+pRp2m3N3ObA5DQx857KxDERSRVZeW13Sf/Sw3mb7lh7FyW9IBoXhlSeTZZawcV43CKP8vlemPt9IpldalGg4T34PyA96z4oKFa2H6AXAgigbwZj3nJMyR1IO5UkH9YOEuhxOc1awRUEwUGZcz/DqpfMzd7AQchk+bQEoWyf7ppj1uvMY8Znfi7KH5jMjXoNnzmw0AWfGT2fh7mOLWZfMvY/Dmup/xc3GhNWQ16drW2yWv9VlN4rFwDGXJ+ZzTWhfBdznlOutqHvtC0wvvzDfv3vPzTQ7DtjeTOS3hRtq3sL9r+XnXG3qPgqHN8k8GaAjTC1WkrG+7vJXx4MWZ2Cl1c/XWKNMxP8JYtQw/tYd0W2PexjFglA21m/gfVJe5Yyxo4/9rycT2/BxvplUtvij+KxUhRQEZOh70S5mO/Wq7zyX9J2rZF8U90S9RVCXBUe70/WxEVr8z2jukytJFns3hi2kAIVdqbi8gDwb5V+Bn2krqijTgFsA0+c/cWjvqKjwPCDf/R/q8Dr0a2QYiCWWmuZXSaQo5vk820A0wYtaMfzRg31zsuWThUj0qcFTdY76nrp9mHT2hDmlfSvj372mL7stxnHq2O3RAN76q5dnU7WP1Qy88Ap/tzeqGXqB6+B77kHlJJX366m22tl3SwaY5Oo+aQcM9 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 783a3701-9ade-495d-c1fb-08dbad39f53e X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2023 11:27:44.4608 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8P250MB0280 Subject: [FFmpeg-devel] [PATCH 09/20] avformat/matroskadec: Factor video parsing out of matroska_parse_tracks() 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4OwWvzzuVyw6 More exactly, factor codec-specific video parsing out of matroska_parse_tracks(). This is intended to improve readability. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskadec.c | 120 +++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 48 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index e9ad0c7e11..3348ce161e 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2734,6 +2734,75 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par, return 0; } +/* Performs the codec-specific part of parsing a video track. */ +static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, + const MatroskaDemuxContext *matroska, + int *extradata_offset) +{ + if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") && + track->codec_priv.size >= 40) { + track->ms_compat = 1; + par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14); + par->codec_tag = AV_RL32(track->codec_priv.data + 16); + par->codec_id = ff_codec_get_id(ff_codec_bmp_tags, + par->codec_tag); + if (!par->codec_id) + par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags, + par->codec_tag); + *extradata_offset = 40; + return 0; + } else if (!strcmp(track->codec_id, "V_QUICKTIME") && + track->codec_priv.size >= 21) { + enum AVCodecID codec_id; + uint32_t fourcc; + int ret = get_qt_codec(track, &fourcc, &codec_id); + if (ret < 0) + return ret; + if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) { + fourcc = MKTAG('S','V','Q','3'); + codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc); + } + par->codec_id = codec_id; + if (codec_id == AV_CODEC_ID_NONE) + av_log(matroska->ctx, AV_LOG_ERROR, + "mov FourCC not found %s.\n", av_fourcc2str(fourcc)); + if (track->codec_priv.size >= 86) { + FFIOContext b; + unsigned bit_depth = AV_RB16(track->codec_priv.data + 82); + ffio_init_context(&b, track->codec_priv.data, + track->codec_priv.size, + 0, NULL, NULL, NULL, NULL); + if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) { + bit_depth &= 0x1F; + track->has_palette = 1; + } + par->bits_per_coded_sample = bit_depth; + } + par->codec_tag = fourcc; + return 0; + } + + switch (par->codec_id) { + case AV_CODEC_ID_RV10: + case AV_CODEC_ID_RV20: + case AV_CODEC_ID_RV30: + case AV_CODEC_ID_RV40: + *extradata_offset = 26; + break; + case AV_CODEC_ID_PRORES: + if (track->codec_priv.size == 4) + par->codec_tag = AV_RL32(track->codec_priv.data); + break; + case AV_CODEC_ID_VP9: + /* we don't need any value stored in CodecPrivate. + make sure that it's not exported as extradata. */ + track->codec_priv.size = 0; + break; + } + + return 0; +} + static int matroska_parse_tracks(AVFormatContext *s) { MatroskaDemuxContext *matroska = s->priv_data; @@ -2749,7 +2818,6 @@ static int matroska_parse_tracks(AVFormatContext *s) AVCodecParameters *par; int extradata_offset = 0; uint32_t fourcc = 0; - FFIOContext b; AVStream *st; FFStream *sti; char* key_id_base64 = NULL; @@ -2934,55 +3002,11 @@ static int matroska_parse_tracks(AVFormatContext *s) return ret; if (ret == SKIP_TRACK) continue; - } else - if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") && - track->codec_priv.size >= 40) { - track->ms_compat = 1; - par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14); - par->codec_tag = AV_RL32(track->codec_priv.data + 16); - par->codec_id = ff_codec_get_id(ff_codec_bmp_tags, - par->codec_tag); - if (!par->codec_id) - par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags, - par->codec_tag); - extradata_offset = 40; - } else if (!strcmp(track->codec_id, "V_QUICKTIME") && - track->codec_priv.size >= 21) { - uint32_t fourcc; - int ret = get_qt_codec(track, &fourcc, &codec_id); + } else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { + ret = mkv_parse_video_codec(track, par, matroska, + &extradata_offset); if (ret < 0) return ret; - if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) { - fourcc = MKTAG('S','V','Q','3'); - codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc); - } - par->codec_id = codec_id; - if (codec_id == AV_CODEC_ID_NONE) - av_log(matroska->ctx, AV_LOG_ERROR, - "mov FourCC not found %s.\n", av_fourcc2str(fourcc)); - if (track->codec_priv.size >= 86) { - unsigned bit_depth = AV_RB16(track->codec_priv.data + 82); - ffio_init_context(&b, track->codec_priv.data, - track->codec_priv.size, - 0, NULL, NULL, NULL, NULL); - if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) { - bit_depth &= 0x1F; - track->has_palette = 1; - } - par->bits_per_coded_sample = bit_depth; - } - par->codec_tag = fourcc; - } else if (codec_id == AV_CODEC_ID_RV10 || - codec_id == AV_CODEC_ID_RV20 || - codec_id == AV_CODEC_ID_RV30 || - codec_id == AV_CODEC_ID_RV40) { - extradata_offset = 26; - } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) { - par->codec_tag = AV_RL32(track->codec_priv.data); - } else if (codec_id == AV_CODEC_ID_VP9) { - /* we don't need any value stored in CodecPrivate. - make sure that it's not exported as extradata. */ - track->codec_priv.size = 0; } else if (codec_id == AV_CODEC_ID_ARIB_CAPTION && track->codec_priv.size == 3) { int component_tag = track->codec_priv.data[0]; int data_component_id = AV_RB16(track->codec_priv.data + 1);