From patchwork Sat Jul 2 22:21:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36614 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp1884449pzh; Sat, 2 Jul 2022 15:25:02 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s7+z8T6yKucMWq6IMt80kvpu24WZ2EZxCzQvr3ws5PgqaqEy8qqTzmcZV5ex2UvFpXY+G2 X-Received: by 2002:a05:6402:154a:b0:435:5261:f776 with SMTP id p10-20020a056402154a00b004355261f776mr27076806edx.118.1656800702174; Sat, 02 Jul 2022 15:25:02 -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 qb37-20020a1709077ea500b00711fb44149esi3366073ejc.769.2022.07.02.15.25.01; Sat, 02 Jul 2022 15:25:02 -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=XKSEWdGr; 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 8E1A368B9C3; Sun, 3 Jul 2022 01:22:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-oln040092068054.outbound.protection.outlook.com [40.92.68.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B491268B992 for ; Sun, 3 Jul 2022 01:22:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZTIazCYfySWOkimOTU5Su/nB+cqNeyE3/sA6310+ASlMNzg8oeWeRANlqaJIvb0fERJe2RTvYZBM63MU3dc96XIxqfLQZ1jIcALOZmWI3cVUGRcIP+vHRMNrAZB4GkCdp9oeStbeb8+M0K9nyEbKG+wWxnumOq7I4bj2EYGM5Y4bCEcBStFsAWJFXvX5MUM/B8umNJXePHviXyzgf+DfJFobrW/k077AMzRS6OP+b0IglmHtzCYygpyujnNkswyFHhFp6KZY6W7JqeA8ODGoAO1hqouFvYoBcytIQmZkJTKUoqxfJJPa+sDZ3T2bPohx5MExKk/kamI9RlRIjCDusg== 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=xlIPrkcDTrpwm0NKnEOsUgiL8WBwKx9VKkVx55mAGfE=; b=lv5wfxZxgmJOvC9DKjS5cR6EfAqs17vdNpxUJMNHuX/dAvY4FnQajh1OPBuoki0tyIlpFhBLnOCUeEE6oEvYD8STaSBptCs987pMNKnBqrjztEQhmPkuagXGrnB3PZHrsOIpUw+reYD5fJUSymaXGppNkl+5JZExouC9hf3NhyQmBgQCeKrAV268klkKQwT5p/vQaABX9u9Wd2SVJ9MZ/arTPJ+7o/Q6tDAodyvDMcWuu1H88MdGLZQe2eUw3yh9sw6a4mtyuGrBiGvwn4TBwARbgfNm/8MDVkRxWjr0INILuJDNyMh8umnOrf5Ws57qfvUKybdFPs8L3kxqs90LsQ== 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=xlIPrkcDTrpwm0NKnEOsUgiL8WBwKx9VKkVx55mAGfE=; b=XKSEWdGrDmjhK/Nh2JG2j8N3CVEN0l42sSwGGyD8HUcmzQ0RLqqyetydmoldvOMiX0x8qdzdpe2jpxBgP/q1kvgmgpoytrk3RlNL0/dmkfn8QgDaiqq+rLDGUI/DWfCbKgdX30MEEScCv/Oa8AdBbLJLdyGUMYjJ0Je5m7AuL2RAkRxEpiTj9Oy2vDhxZl5rcS8b0ydAFoZbGES+WmQsJ9Q4uykdef4xPOOOYCQPNXGFmCs4FonhqbUNLbe12WnsgTJ54K3QINaPsA2vkl5opq0TD4jZWSb7hRrFd3iXkAcwX0skkIhhwuVyi/iaoecYYCBXvhPhL4q1YvVe8/mELQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DB8PR01MB5948.eurprd01.prod.exchangelabs.com (2603:10a6:10:e4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.17; Sat, 2 Jul 2022 22:22:40 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5395.018; Sat, 2 Jul 2022 22:22:40 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 Jul 2022 00:21:59 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [pfzU07MPQJ9gApreuciD3uqGvk/l5l1Q] X-ClientProxiedBy: FR3P281CA0089.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::18) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220702222200.169681-18-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4740189f-34b3-4b8d-195c-08da5c796017 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNXwBRntoGkOsgo00FNZK4OlrAyQchzuOfdTYSKwIZ8Yb7O5WC73MNJro8D6qwPLPPYpwTG1OrphGUQxwqRygbtJZcXtoqH2mnCXnRo0Po7zVynaNNVU3p/yy64HO+e3vtB6Se9SsraT9cGbXhrPmYbBZb7c39azt8ap9ISXsv+rcMf4Iqn+m2Vau2gtKgycVGAv95wqt3CE/rGYdzmeqLf929KjMWoalcj9dabJM5+ee0VEH8AR3h0EOXJyR19rqpAxmmmgEqvSsucEQXVswYMSoONda4uP25pRMHnrLtY27331uYDNa+L921onJRtJLYV6jgePczt9kfRhVpyAYufAJetkMWZJwovU0rILXbzVaIOc13PlHFsZ9v0bbcnsiIPyMH8lEAMiSoIr8AsqjTu/9Ilwvnh5sGI1OTIbl+Z5Jr9ICTH6nrBHXfyY1fAvAhkbU/p1tYMhFS9OgKBEvaHUfuKkzKfhqNkMAXM0GUDQ/V7ib1ALmBtQz5QgGd63sWOeO/1s/jUlljqLY2VVvxMl1/LL5e/ZwgLlUrEhDvvYxy3xwzQ9VwiOjorEhgv4z1KZQnwmUyzl4+760tFETCROLS7u022z3gcpuxl4cnwdoo8jZ0nw7DWyyvRyUPK442F9v66kGTd8FvHf1m65k8yeD4WIcg9idIuOh6iCu68OpnktoAojh0ZUg0TvDuKvGQj3yLTwn80a8dfkkNO37ssUgIefJE2SyJA= X-MS-TrafficTypeDiagnostic: DB8PR01MB5948:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: U1lVpi9Kd4aBc3VJpmx7D3aPMhGPzwMLSIvjq1IXe433dYW4wlKL7ZtfhCWvgKeQIMfk1a8MX+Mh3UDXolfaWUFI6UrLMC99q+jFNF87gGVnzdWCpqTjV3MMZ8RHL5UIJye5/abLrB7suYNwbrHBnP5iFHqAZk9Fme0Z+UteEzniPSWRjyF3Gn1j8dXLh2EK9VjIwGSy2e6KeJcfhicQVsCWZ7FQbMBaPgqk6TZe/B9ZcroWgssOlOUl7cJfCIUU8ImEsSsiTffz4wJfnjqhV8vux2/ONtDdOQE8Utm7/IIj2PCysXjRv45hhPbZOVAkwcQKqZR5TEe/HLFqJxSwrTTVl+ody67lJ1HlVwqJwT8TZ7V/vJNehkbp0c9jYgc7cYrvitqh5wK7ZGWrZgE8rZZ5aqsm8hpfIwW/hGneoAVh3I5e8g8s/4JyzeGy9fFF9xFF8Q/MmWtuHW1ambQN3pFpt2b3Hsbtr0ZB5ejwuI/dq37W1pfTTRa8Okjh1t5STcwnUge5gkJf5kwecwtC6YNzMN3/8/Gz4YFb8oVicXbxZazsSmnlGj/HHVPbPNrevsqXCUWJaYIkMucDCcLSTm9M3j4FZL3zlY50uj/LdnNMtXxq2zt6DE2XbNVoxgQYKb5IH6E0n6Dd6vfUSl7HYw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: JwrxwTTZMTAg3kSzBrOk4JpY5K8RXXgAYCyKo0mynjBrqImQ4tg9z2cs4f1HuHY6Dse/Rcnj0K0I1iutTsCC08wg43sZogVaWzJ1SveYfMGXfuKofIO3UR+CavlaW2f1SjtcXsz7eZpJWJiX37ul1V5ilB/6rrwpl8fH+zujOhwzgYtm6Kp8Smo9Ms/V5Rho4ktNc8ewR7Y9ANHZSFkJwvg+yTqOp8QmU7kugUEgCgwvQ1oaX8sPUNyC5aoilnycNRrD2c5ri2EOzcGIeqZhgtV+ML/FETRCScFkpQFE7Jido4yK9ckpOxXKPjftbBT7MZ2MEq8I/6+X+oh6rLipVPVlqY0gX69/LOD/aiASLWIgHumRcYZmzg9H1dUOl3ToyezU67SbS/zsd86I4tqj4szU0B8ZUcnR7D0xMe8UEPLtT5jVtbQ5zhU0C5ejja6+bg+Nv4IAe/wLZ5fDKZbf0XuPY7q2ujnXMK6qqSoDxP76BJyfMIs80Izwv/vSwLPEpQhhqqoC6CThV7dcNvk6q2OYqKckErhOt86iazdICd1SFqcRFWIux/9aXWBuSPdaOkxs9StC/Tye9UQtKOfmcwsqxHtQnqxOCrFGI2Bd6eswLuxRWGymrXglday1arMDGpRDyMtLgeSUgcHdup4JdK3lAt4YVes3vv4I9BNvSs5FgxhtWq/bbrZrQQCAEPLkcP6QBw0c8tFiTL0+uzNXzSZ2W8DAK6mqomkRWrhXkx/hN3w+p8WDqu2aRh0UV/Wc6kKLh5a208+Im1iig2x4I/EeS8v9j6BUI/iA4StS7MkLX/rC+aLUEanbNtG7soeRg0Bsb7Z6EDATuiOpSyQDmZRPVAYgyVUZq2jYgDkHcA0RIxIWYzvWwXk8RrpLJpfKnMyscqJrcuO8bZCOGLvgG6bMid3JJsuAhE15I0i07PJJTZqg2q6GiSx4So2LvXSFsO0tUmOOtQ4Ef7bAoNUlndxi0VXhIPiqsjzaCg0R7icJJjfoLoD6KQtj+SE+EDp4HnFWzNhN0pNc9pp1IoocPC+U9yFweXrH9iM/Ex0Oiuqqgc0amBYPzE/CK2q5Z6KMsT8WRINGkKCcGe1CN0bSkHRrPyEXSvgnt2tODK13QT2ioLqW9h1ivxyDa+RoTEfiyeoLdK3Yu6PiuGuOMlC+4zyCmUGLcV0zmVdU5FTqw8cH/mcStLDPcz6wVmVeRD5Di+p0qcZms0z6KpUZKOnr1Le6CYUWD81dL2i/ZwEhH4kiBnWvpaX/XwunQv6oSph1NgubpOTXs0Yj8WSIaFAhM11L/tAafHhYwKJ8/vPKids= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4740189f-34b3-4b8d-195c-08da5c796017 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jul 2022 22:22:40.2224 (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: DB8PR01MB5948 Subject: [FFmpeg-devel] [PATCH 19/20] avcodec/(h264|hevc)_ps: Factor common VUI code out 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: qen053sDFvIT Signed-off-by: Andreas Rheinhardt --- libavcodec/Makefile | 5 ++- libavcodec/h2645_vui.c | 91 +++++++++++++++++++++++++++++++++++++++++ libavcodec/h2645_vui.h | 49 ++++++++++++++++++++++ libavcodec/h264_ps.c | 69 +++---------------------------- libavcodec/h264_ps.h | 10 +---- libavcodec/h264_slice.c | 36 ++++++++-------- libavcodec/hevc_ps.c | 54 ++++-------------------- libavcodec/hevc_ps.h | 19 ++------- libavcodec/hevcdec.c | 34 +++++++-------- 9 files changed, 197 insertions(+), 170 deletions(-) create mode 100644 libavcodec/h2645_vui.c create mode 100644 libavcodec/h2645_vui.h diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 5d6aedeba7..a210c46f49 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -97,12 +97,13 @@ OBJS-$(CONFIG_GOLOMB) += golomb.o OBJS-$(CONFIG_H263DSP) += h263dsp.o OBJS-$(CONFIG_H264CHROMA) += h264chroma.o OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o -OBJS-$(CONFIG_H264PARSE) += h264_parse.o h264_ps.o h2645data.o h2645_parse.o +OBJS-$(CONFIG_H264PARSE) += h264_parse.o h264_ps.o h2645data.o \ + h2645_parse.o h2645_vui.o OBJS-$(CONFIG_H264PRED) += h264pred.o OBJS-$(CONFIG_H264QPEL) += h264qpel.o OBJS-$(CONFIG_H264_SEI) += h264_sei.o h2645_sei.o OBJS-$(CONFIG_HEVCPARSE) += hevc_parse.o hevc_ps.o hevc_data.o \ - h2645data.o h2645_parse.o + h2645data.o h2645_parse.o h2645_vui.o OBJS-$(CONFIG_HEVC_SEI) += hevc_sei.o h2645_sei.o dynamic_hdr10_plus.o dynamic_hdr_vivid.o OBJS-$(CONFIG_HPELDSP) += hpeldsp.o OBJS-$(CONFIG_HUFFMAN) += huffman.o diff --git a/libavcodec/h2645_vui.c b/libavcodec/h2645_vui.c new file mode 100644 index 0000000000..fcc4b37105 --- /dev/null +++ b/libavcodec/h2645_vui.c @@ -0,0 +1,91 @@ +/* + * Common H.264/HEVC VUI Parameter decoding + * + * Copyright (c) 2003 Michael Niedermayer + * Copyright (C) 2012 - 2013 Guillaume Martres + * Copyright (C) 2012 - 2013 Mickael Raulet + * Copyright (C) 2012 - 2013 Gildas Cocherel + * Copyright (C) 2013 Vittorio Giovara + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/log.h" +#include "libavutil/pixdesc.h" + +#include "get_bits.h" +#include "golomb.h" +#include "h2645data.h" +#include "h2645_vui.h" + +#define EXTENDED_SAR 255 + +void ff_h2645_decode_common_vui_params(GetBitContext *gb, H2645VUI *vui, void *logctx) +{ + int aspect_ratio_info_present_flag; + + av_log(logctx, AV_LOG_DEBUG, "Decoding VUI\n"); + + aspect_ratio_info_present_flag = get_bits1(gb); + if (aspect_ratio_info_present_flag) { + uint8_t aspect_ratio_idc = get_bits(gb, 8); + if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect)) + vui->sar = ff_h2645_pixel_aspect[aspect_ratio_idc]; + else if (aspect_ratio_idc == EXTENDED_SAR) { + vui->sar.num = get_bits(gb, 16); + vui->sar.den = get_bits(gb, 16); + } else + av_log(logctx, AV_LOG_WARNING, + "Unknown SAR index: %u.\n", aspect_ratio_idc); + } else + vui->sar = (AVRational){ 0, 1 }; + + vui->overscan_info_present_flag = get_bits1(gb); + if (vui->overscan_info_present_flag) + vui->overscan_appropriate_flag = get_bits1(gb); + + vui->video_signal_type_present_flag = get_bits1(gb); + if (vui->video_signal_type_present_flag) { + vui->video_format = get_bits(gb, 3); + vui->video_full_range_flag = get_bits1(gb); + vui->colour_description_present_flag = get_bits1(gb); + if (vui->colour_description_present_flag) { + vui->colour_primaries = get_bits(gb, 8); + vui->transfer_characteristics = get_bits(gb, 8); + vui->matrix_coeffs = get_bits(gb, 8); + + // Set invalid values to "unspecified" + if (!av_color_primaries_name(vui->colour_primaries)) + vui->colour_primaries = AVCOL_PRI_UNSPECIFIED; + if (!av_color_transfer_name(vui->transfer_characteristics)) + vui->transfer_characteristics = AVCOL_TRC_UNSPECIFIED; + if (!av_color_space_name(vui->matrix_coeffs)) + vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED; + } + } + + vui->chroma_loc_info_present_flag = get_bits1(gb); + if (vui->chroma_loc_info_present_flag) { + vui->chroma_sample_loc_type_top_field = get_ue_golomb_31(gb); + vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_31(gb); + if (vui->chroma_sample_loc_type_top_field <= 5U) + vui->chroma_location = vui->chroma_sample_loc_type_top_field + 1; + else + vui->chroma_location = AVCHROMA_LOC_UNSPECIFIED; + } else + vui->chroma_location = AVCHROMA_LOC_LEFT; +} \ No newline at end of file diff --git a/libavcodec/h2645_vui.h b/libavcodec/h2645_vui.h new file mode 100644 index 0000000000..7b9bbad2d3 --- /dev/null +++ b/libavcodec/h2645_vui.h @@ -0,0 +1,49 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_H2645_VUI_H +#define AVCODEC_H2645_VUI_H + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "get_bits.h" + +typedef struct H2645VUI { + AVRational sar; + + int overscan_info_present_flag; + int overscan_appropriate_flag; + + int video_signal_type_present_flag; + int video_format; + int video_full_range_flag; + int colour_description_present_flag; + enum AVColorPrimaries colour_primaries; + enum AVColorTransferCharacteristic transfer_characteristics; + enum AVColorSpace matrix_coeffs; + + int chroma_loc_info_present_flag; + int chroma_sample_loc_type_top_field; + int chroma_sample_loc_type_bottom_field; + enum AVChromaLocation chroma_location; +} H2645VUI; + +void ff_h2645_decode_common_vui_params(GetBitContext *gb, H2645VUI *vui, void *logctx); + +#endif /* AVCODEC_H2645_VUI_H */ \ No newline at end of file diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index 874790a3a3..d0d1e65903 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -31,14 +31,12 @@ #include "mathops.h" #include "avcodec.h" #include "h264data.h" -#include "h2645data.h" +#include "h2645_vui.h" #include "h264_ps.h" #include "golomb.h" #define MIN_LOG2_MAX_FRAME_NUM 4 -#define EXTENDED_SAR 255 - static const uint8_t default_scaling4[2][16] = { { 6, 13, 20, 28, 13, 20, 28, 32, 20, 28, 32, 37, 28, 32, 37, 42 }, @@ -133,62 +131,7 @@ static inline int decode_hrd_parameters(GetBitContext *gb, void *logctx, static inline int decode_vui_parameters(GetBitContext *gb, void *logctx, SPS *sps) { - int aspect_ratio_info_present_flag; - unsigned int aspect_ratio_idc; - - aspect_ratio_info_present_flag = get_bits1(gb); - - if (aspect_ratio_info_present_flag) { - aspect_ratio_idc = get_bits(gb, 8); - if (aspect_ratio_idc == EXTENDED_SAR) { - sps->sar.num = get_bits(gb, 16); - sps->sar.den = get_bits(gb, 16); - } else if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect)) { - sps->sar = ff_h2645_pixel_aspect[aspect_ratio_idc]; - } else { - av_log(logctx, AV_LOG_WARNING, "Unknown SAR index: %u.\n", - aspect_ratio_idc); - } - } else { - sps->sar.num = - sps->sar.den = 0; - } - - if (get_bits1(gb)) /* overscan_info_present_flag */ - get_bits1(gb); /* overscan_appropriate_flag */ - - sps->video_signal_type_present_flag = get_bits1(gb); - if (sps->video_signal_type_present_flag) { - get_bits(gb, 3); /* video_format */ - sps->full_range = get_bits1(gb); /* video_full_range_flag */ - - sps->colour_description_present_flag = get_bits1(gb); - if (sps->colour_description_present_flag) { - sps->color_primaries = get_bits(gb, 8); /* colour_primaries */ - sps->color_trc = get_bits(gb, 8); /* transfer_characteristics */ - sps->colorspace = get_bits(gb, 8); /* matrix_coefficients */ - - // Set invalid values to "unspecified" - if (!av_color_primaries_name(sps->color_primaries)) - sps->color_primaries = AVCOL_PRI_UNSPECIFIED; - if (!av_color_transfer_name(sps->color_trc)) - sps->color_trc = AVCOL_TRC_UNSPECIFIED; - if (!av_color_space_name(sps->colorspace)) - sps->colorspace = AVCOL_SPC_UNSPECIFIED; - } - } - - /* chroma_location_info_present_flag */ - if (get_bits1(gb)) { - /* chroma_sample_location_type_top_field */ - sps->chroma_location = get_ue_golomb_31(gb); - if (sps->chroma_location <= 5U) - sps->chroma_location++; - else - sps->chroma_location = AVCHROMA_LOC_UNSPECIFIED; - get_ue_golomb_31(gb); /* chroma_sample_location_type_bottom_field */ - } else - sps->chroma_location = AVCHROMA_LOC_LEFT; + ff_h2645_decode_common_vui_params(gb, &sps->vui, logctx); if (show_bits1(gb) && get_bits_left(gb) < 10) { av_log(logctx, AV_LOG_WARNING, "Truncated VUI (%d)\n", get_bits_left(gb)); @@ -381,12 +324,12 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, sps->profile_idc = profile_idc; sps->constraint_set_flags = constraint_set_flags; sps->level_idc = level_idc; - sps->full_range = -1; + sps->vui.video_full_range_flag = -1; memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4)); memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8)); sps->scaling_matrix_present = 0; - sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED + sps->vui.matrix_coeffs = AVCOL_SPC_UNSPECIFIED; if (sps->profile_idc == 100 || // High profile sps->profile_idc == 110 || // High10 profile @@ -603,8 +546,8 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, } } - if (!sps->sar.den) - sps->sar.den = 1; + if (!sps->vui.sar.den) + sps->vui.sar.den = 1; if (avctx->debug & FF_DEBUG_PICT_INFO) { static const char csp[4][5] = { "Gray", "420", "422", "444" }; diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h index dc52835ed4..5c35761fbc 100644 --- a/libavcodec/h264_ps.h +++ b/libavcodec/h264_ps.h @@ -33,6 +33,7 @@ #include "avcodec.h" #include "get_bits.h" #include "h264.h" +#include "h2645_vui.h" #define MAX_SPS_COUNT 32 #define MAX_PPS_COUNT 256 @@ -70,14 +71,7 @@ typedef struct SPS { unsigned int crop_top; ///< frame_cropping_rect_top_offset unsigned int crop_bottom; ///< frame_cropping_rect_bottom_offset int vui_parameters_present_flag; - AVRational sar; - int video_signal_type_present_flag; - int full_range; - int colour_description_present_flag; - enum AVColorPrimaries color_primaries; - enum AVColorTransferCharacteristic color_trc; - enum AVColorSpace colorspace; - enum AVChromaLocation chroma_location; + H2645VUI vui; int timing_info_present_flag; uint32_t num_units_in_tick; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 205ad5f97b..ba873254ce 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -326,7 +326,7 @@ int ff_h264_update_thread_context(AVCodecContext *dst, !h->ps.sps || h->ps.sps->bit_depth_luma != h1->ps.sps->bit_depth_luma || h->ps.sps->chroma_format_idc != h1->ps.sps->chroma_format_idc || - h->ps.sps->colorspace != h1->ps.sps->colorspace)) { + h->ps.sps->vui.matrix_coeffs != h1->ps.sps->vui.matrix_coeffs)) { need_reinit = 1; } @@ -936,7 +936,7 @@ static int h264_slice_header_init(H264Context *h) goto fail; } - ff_set_sar(h->avctx, sps->sar); + ff_set_sar(h->avctx, sps->vui.sar); av_pix_fmt_get_chroma_sub_sample(h->avctx->pix_fmt, &h->chroma_x_shift, &h->chroma_y_shift); @@ -1061,7 +1061,7 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl || (non_j_pixfmt(h->avctx->pix_fmt) != non_j_pixfmt(get_pixel_format(h, 0)))) must_reinit = 1; - if (first_slice && av_cmp_q(sps->sar, h->avctx->sample_aspect_ratio)) + if (first_slice && av_cmp_q(sps->vui.sar, h->avctx->sample_aspect_ratio)) must_reinit = 1; if (!h->setup_finished) { @@ -1083,15 +1083,15 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl init_dimensions(h); - if (sps->video_signal_type_present_flag) { - h->avctx->color_range = sps->full_range > 0 ? AVCOL_RANGE_JPEG - : AVCOL_RANGE_MPEG; - if (sps->colour_description_present_flag) { - if (h->avctx->colorspace != sps->colorspace) + if (sps->vui.video_signal_type_present_flag) { + h->avctx->color_range = sps->vui.video_full_range_flag > 0 ? AVCOL_RANGE_JPEG + : AVCOL_RANGE_MPEG; + if (sps->vui.colour_description_present_flag) { + if (h->avctx->colorspace != sps->vui.matrix_coeffs) needs_reinit = 1; - h->avctx->color_primaries = sps->color_primaries; - h->avctx->color_trc = sps->color_trc; - h->avctx->colorspace = sps->colorspace; + h->avctx->color_primaries = sps->vui.colour_primaries; + h->avctx->color_trc = sps->vui.transfer_characteristics; + h->avctx->colorspace = sps->vui.matrix_coeffs; } } @@ -1101,7 +1101,7 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl h->avctx->color_trc = h->sei.common.alternative_transfer.preferred_transfer_characteristics; } } - h->avctx->chroma_sample_location = sps->chroma_location; + h->avctx->chroma_sample_location = sps->vui.chroma_location; if (!h->context_initialized || must_reinit || needs_reinit) { int flush_changes = h->context_initialized; @@ -1249,14 +1249,14 @@ static int h264_export_frame_props(H264Context *h) } else { fgp->codec.h274.bit_depth_luma = sps->bit_depth_luma; fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma; - if (sps->video_signal_type_present_flag) - fgp->codec.h274.color_range = sps->full_range + 1; + if (sps->vui.video_signal_type_present_flag) + fgp->codec.h274.color_range = sps->vui.video_full_range_flag + 1; else fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED; - if (sps->colour_description_present_flag) { - fgp->codec.h274.color_primaries = sps->color_primaries; - fgp->codec.h274.color_trc = sps->color_trc; - fgp->codec.h274.color_space = sps->colorspace; + if (sps->vui.colour_description_present_flag) { + fgp->codec.h274.color_primaries = sps->vui.colour_primaries; + fgp->codec.h274.color_trc = sps->vui.transfer_characteristics; + fgp->codec.h274.color_space = sps->vui.matrix_coeffs; } else { fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED; fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED; diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index 25620357de..b68656e352 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -25,7 +25,7 @@ #include "libavutil/imgutils.h" #include "golomb.h" -#include "h2645data.h" +#include "h2645_vui.h" #include "hevc_data.h" #include "hevc_ps.h" @@ -571,47 +571,15 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, { VUI backup_vui, *vui = &sps->vui; GetBitContext backup; - int sar_present, alt = 0; - - av_log(avctx, AV_LOG_DEBUG, "Decoding VUI\n"); - - sar_present = get_bits1(gb); - if (sar_present) { - uint8_t sar_idx = get_bits(gb, 8); - if (sar_idx < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect)) - vui->sar = ff_h2645_pixel_aspect[sar_idx]; - else if (sar_idx == 255) { - vui->sar.num = get_bits(gb, 16); - vui->sar.den = get_bits(gb, 16); - } else - av_log(avctx, AV_LOG_WARNING, - "Unknown SAR index: %u.\n", sar_idx); - } + int alt = 0; - vui->overscan_info_present_flag = get_bits1(gb); - if (vui->overscan_info_present_flag) - vui->overscan_appropriate_flag = get_bits1(gb); + ff_h2645_decode_common_vui_params(gb, &sps->vui.common, avctx); - vui->video_signal_type_present_flag = get_bits1(gb); - if (vui->video_signal_type_present_flag) { - vui->video_format = get_bits(gb, 3); - vui->video_full_range_flag = get_bits1(gb); - vui->colour_description_present_flag = get_bits1(gb); - if (vui->video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P) + if (vui->common.video_signal_type_present_flag) { + if (vui->common.video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P) sps->pix_fmt = AV_PIX_FMT_YUVJ420P; - if (vui->colour_description_present_flag) { - vui->colour_primaries = get_bits(gb, 8); - vui->transfer_characteristic = get_bits(gb, 8); - vui->matrix_coeffs = get_bits(gb, 8); - - // Set invalid values to "unspecified" - if (!av_color_primaries_name(vui->colour_primaries)) - vui->colour_primaries = AVCOL_PRI_UNSPECIFIED; - if (!av_color_transfer_name(vui->transfer_characteristic)) - vui->transfer_characteristic = AVCOL_TRC_UNSPECIFIED; - if (!av_color_space_name(vui->matrix_coeffs)) - vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED; - if (vui->matrix_coeffs == AVCOL_SPC_RGB) { + if (vui->common.colour_description_present_flag) { + if (vui->common.matrix_coeffs == AVCOL_SPC_RGB) { switch (sps->pix_fmt) { case AV_PIX_FMT_YUV444P: sps->pix_fmt = AV_PIX_FMT_GBRP; @@ -627,12 +595,6 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, } } - vui->chroma_loc_info_present_flag = get_bits1(gb); - if (vui->chroma_loc_info_present_flag) { - vui->chroma_sample_loc_type_top_field = get_ue_golomb_long(gb); - vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_long(gb); - } - vui->neutra_chroma_indication_flag = get_bits1(gb); vui->field_seq_flag = get_bits1(gb); vui->frame_field_info_present_flag = get_bits1(gb); @@ -1107,7 +1069,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, sps->sps_temporal_mvp_enabled_flag = get_bits1(gb); sps->sps_strong_intra_smoothing_enable_flag = get_bits1(gb); - sps->vui.sar = (AVRational){0, 1}; + sps->vui.common.sar = (AVRational){0, 1}; vui_present = get_bits1(gb); if (vui_present) decode_vui(gb, avctx, apply_defdispwin, sps); diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h index 2a1bbf6489..18894cfed1 100644 --- a/libavcodec/hevc_ps.h +++ b/libavcodec/hevc_ps.h @@ -29,6 +29,7 @@ #include "avcodec.h" #include "get_bits.h" +#include "h2645_vui.h" #include "hevc.h" typedef struct ShortTermRPS { @@ -47,22 +48,8 @@ typedef struct HEVCWindow { } HEVCWindow; typedef struct VUI { - AVRational sar; - - int overscan_info_present_flag; - int overscan_appropriate_flag; - - int video_signal_type_present_flag; - int video_format; - int video_full_range_flag; - int colour_description_present_flag; - uint8_t colour_primaries; - uint8_t transfer_characteristic; - uint8_t matrix_coeffs; - - int chroma_loc_info_present_flag; - int chroma_sample_loc_type_top_field; - int chroma_sample_loc_type_bottom_field; + H2645VUI common; + int neutra_chroma_indication_flag; int field_seq_flag; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index fdb8de5b15..7147944bc6 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -337,18 +337,18 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps) avctx->profile = sps->ptl.general_ptl.profile_idc; avctx->level = sps->ptl.general_ptl.level_idc; - ff_set_sar(avctx, sps->vui.sar); + ff_set_sar(avctx, sps->vui.common.sar); - if (sps->vui.video_signal_type_present_flag) - avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG - : AVCOL_RANGE_MPEG; + if (sps->vui.common.video_signal_type_present_flag) + avctx->color_range = sps->vui.common.video_full_range_flag ? AVCOL_RANGE_JPEG + : AVCOL_RANGE_MPEG; else avctx->color_range = AVCOL_RANGE_MPEG; - if (sps->vui.colour_description_present_flag) { - avctx->color_primaries = sps->vui.colour_primaries; - avctx->color_trc = sps->vui.transfer_characteristic; - avctx->colorspace = sps->vui.matrix_coeffs; + if (sps->vui.common.colour_description_present_flag) { + avctx->color_primaries = sps->vui.common.colour_primaries; + avctx->color_trc = sps->vui.common.transfer_characteristics; + avctx->colorspace = sps->vui.common.matrix_coeffs; } else { avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; avctx->color_trc = AVCOL_TRC_UNSPECIFIED; @@ -357,9 +357,9 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps) avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; if (sps->chroma_format_idc == 1) { - if (sps->vui.chroma_loc_info_present_flag) { - if (sps->vui.chroma_sample_loc_type_top_field <= 5) - avctx->chroma_sample_location = sps->vui.chroma_sample_loc_type_top_field + 1; + if (sps->vui.common.chroma_loc_info_present_flag) { + if (sps->vui.common.chroma_sample_loc_type_top_field <= 5) + avctx->chroma_sample_location = sps->vui.common.chroma_sample_loc_type_top_field + 1; } else avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; } @@ -2851,14 +2851,14 @@ static int set_side_data(HEVCContext *s) const VUI *vui = &sps->vui; fgp->codec.h274.bit_depth_luma = sps->bit_depth; fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma; - if (vui->video_signal_type_present_flag) - fgp->codec.h274.color_range = vui->video_full_range_flag + 1; + if (vui->common.video_signal_type_present_flag) + fgp->codec.h274.color_range = vui->common.video_full_range_flag + 1; else fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED; - if (vui->colour_description_present_flag) { - fgp->codec.h274.color_primaries = vui->colour_primaries; - fgp->codec.h274.color_trc = vui->transfer_characteristic; - fgp->codec.h274.color_space = vui->matrix_coeffs; + if (vui->common.colour_description_present_flag) { + fgp->codec.h274.color_primaries = vui->common.colour_primaries; + fgp->codec.h274.color_trc = vui->common.transfer_characteristics; + fgp->codec.h274.color_space = vui->common.matrix_coeffs; } else { fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED; fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED;