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 02D9640F86 for ; Sun, 2 Jan 2022 04:31:42 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 637AC68B0EE; Sun, 2 Jan 2022 06:31:40 +0200 (EET) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075053.outbound.protection.outlook.com [40.92.75.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8421668B0A4 for ; Sun, 2 Jan 2022 06:31:33 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oBbSbRBBSgqkBHxyWy3p3yJe1kM/q7he/8wcu8J4EPaCUT4hmYCaruCJCdXzPSiNywduRar1EHTPkfPCsl7k/gmg9pbRs3f+zdIyenbRUMQOK8nlGbJRi8kF1W3p/3vPztTDQnTtiwIy7Yziq83dddEuIV7suxnUGD6jBBxagFlpQjRvT7SvIl3wktlSVUEBKIci2laCb8XCNtgzRdlgpx/C8l5v50IlI8HSM+ilLQGI82kOww/75E6LTFYCTzK2zPOn9Rcjci40IPsS9obuw0X2EgfEnW7iSBjIY7NKuCZ4YroVt8/dOEKFUom+BaQyWLldNgODXKNtXTr4mrwUEA== 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=/pI4w70Q+CLC4hlIf453gMPIWoBlZrYeAJbwNYAs4W0=; b=cuExp85eaZcKR/zw3PrZ49RULrCIHBdXUUGvfLBskBF2/v1Z5wVT3ctd/xGL3hoDSj1L87+/JXQXb0F5Y7AfJYYU7lxvrro4ZdBYrgVD6iqRdC76iT0Dd6qQxplJO/nQ/84Dr4fJ2Ic8mBqaZwkIrbDw1iI0GYznM0iAHcYLPtmbtpyp1QOEWzgc0tvxMx/0eWjwVgFjcjGLwqmOGv6KXXZfatZCnzgihx98r4yJnBsHUJa4oZxku/STpcXyTY6DqNDqgCjflrBBUxEEnGJlOVT9fjOPtspgkOykLcFaJL7plvEL1XvCDrBtBbFwQwlyKcCxwSnn0haDWjuJGTbFlA== 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=/pI4w70Q+CLC4hlIf453gMPIWoBlZrYeAJbwNYAs4W0=; b=SqBQpuPwtj4jGBHg6IV6qrvsBza6IQ1pxQbpB6GsRMiEuMA/+uYBRLJKg9fTpo+FVJ81CL/j2mQMqNqN7lmIXZv5muVa/Lg4y0n/cc2wtenPbji++kdhXqUjo45ABXmXixMfx0Ds8YgjGTKuaogIU4neM2451f7mM+pghG1u2XgQ2BIZ/fOyHqsAZBxQ0Kl1f/RWMKFFXVNAm+5N0AHWQQ1BET7QguxZhQwFD/fqE+zRtnceHyrhOLjcJVnJ9SbrBNz0SMXZv5L7Hf8Q7TPCUP6PdPkfg8WRwhReu5NnRuvs6JHg7Wznl0YxoJi+QLF9xk2ANjiaDM1gxFpr3IwqMQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB4374.eurprd03.prod.outlook.com (2603:10a6:20b:f::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4844.15; Sun, 2 Jan 2022 04:31:31 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%6]) with mapi id 15.20.4844.015; Sun, 2 Jan 2022 04:31:31 +0000 Message-ID: Date: Sun, 2 Jan 2022 05:31:30 +0100 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20211222151447.57681-1-ffmpeg@haasn.xyz> <20211222151447.57681-6-ffmpeg@haasn.xyz> From: Andreas Rheinhardt In-Reply-To: <20211222151447.57681-6-ffmpeg@haasn.xyz> X-TMN: [0VUGdegV8C1zbMOivJ5XrddhdFqRM4KT] X-ClientProxiedBy: AS9PR07CA0010.eurprd07.prod.outlook.com (2603:10a6:20b:46c::32) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <39e93f1e-eb4d-b0e1-6800-2583d976bc86@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a2bb5741-472a-41bd-dd15-08d9cda8c05f X-MS-TrafficTypeDiagnostic: AM6PR03MB4374:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8UiUjKPoDoAVvgtBxhDT8APc1q43tQ1RO3wonzglDoqV4V3nqZqEypFWZ8lLNe2jWLp+cl0NdMbc6ovWX0K7a4QgdTOsQg6WPXavz7zD54axmdrvyOomiY8onMGgJ9J+o2z1GHeWpXkS/RwVoxrUazFiVSj2jmNU1Whb2Qeg1c1r1GAB7LQqUQEWwCEjM6i8aPhVXtjsLjMOHwWf0hZl2ZSyVA4R9ayFjQAeSQ3DEbZE1ZaiGguLfaxjtiZpNLiyT+N8LiPUsOzQyEzYxTTLynQXyxRKVPIPPdHFBCaJdFOcuokYrbbeuDs9RcphWv0ijCXsHIQv5BPe2rmnsOPO9EZrxFSPKHlKDeLbDWDdAeGwhOgVJM+3TsgeLlK1aMbcZseAbzKfWB1zy/dIKchFGom5rB4XHMSqn/VigVGGuM+auwgcrzxHy5hyxbs1e0PZoHG+1tl0QekhRD/nR8zVjcbyD+xUQCZQOnDhwVGCL6u/GHZmBC1nE2l5ha5YFhJ1YsbnB35fUHfffIsr+mrHbp27uKDRQK6X/6s/MLtOwxoD/EEEk8An+KKIkL1hF+zrrBKC83a+IIEr65lCdnXY5Q== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MW5WYTZqQU0ycHdyT1owSzVub1ViYVRLRk40U2crNXdLc0FucmZmaVhTZE54?= =?utf-8?B?Z2YybVlCSEF0R2pQYzNDRjlmcENnazhJMFAzbThmM04vVmUzUENybXZ6dFkx?= =?utf-8?B?L0V5VzhhaVprRVVvc2J0UGRHOTlrcU5jZTkyWmptci9UdnFsNElMb3hMZnlr?= =?utf-8?B?bUZoaFVSeVNtOS9CUXBVMTNRaXFGUGhQM1FkQnJKS2xvMmtJZkJHNUlWZVJY?= =?utf-8?B?VGlaQVE4YXhSc053dEtWaitRNWZVQzFwNXNHMFlJbVdSaU9sb1BhMmYwRG82?= =?utf-8?B?WERwUFROVnlWTmcwbDBNL2gyVkhlajZ1Yk5LSVkycHlCU2lnWW81YWtrWGN4?= =?utf-8?B?UDVkQWNDSnFxVE5sdE5pWEVXZzZueGNaNStkREZNeDJtbndyWnk3N2l5MnJD?= =?utf-8?B?ZmRPczYvUnFFeEs1NWMzb2ZCeUxheDN6QzRLOUdTd01JSjNrNlVYUVdmMlFZ?= =?utf-8?B?S0hnN1dSSnBTMjV6T3hqMnZCWjJWa0FuVGRoYnFxTFAxMGd4Smd2TGVGdUZP?= =?utf-8?B?QlNleEdEaDJYb0ppVFdvWHprOWdjVG5XOXJ5bFc1WlgwS3NuUTQ3OUlUNndy?= =?utf-8?B?dThRQ2p5RHV1YURMQU9lTC9Xa0lweU54TWxIZGhUUDRrQVFjQk90UzlLSWpM?= =?utf-8?B?aklnZ0Z4bmNSRHV0ZUI5b0dSL0tjWUlhaXFOZE5oNFU4azNnckdNeGxGVTJX?= =?utf-8?B?NmpmanF2MzVLV01wUVNoaWJtaWFEQVRlY05aNXcyMmhPYzRWSnlFUzRvam1z?= =?utf-8?B?Qi9pSzVWY042Y0FPQkp2WkNqVWlmMStHcm15K0tvZDlFWmU4eWRmZGpUQmV2?= =?utf-8?B?R0twNFo1SjlWTjRjTExyL3VGeE1WQUhzR1pXdEZ0NndFMjlYQ21KRDhYS05u?= =?utf-8?B?YUVYVC9mSXgrSjdZajZCV1ZRbUtRQzNhbFVIQXB5eThkZGYzeFNvRXlzSHAr?= =?utf-8?B?SWFROURtQlhxdUtkdjZXWFdJN3V0MEptZlV2c1NTRU15WFhVelhuUmYvTmZS?= =?utf-8?B?cjh3R2loQjY1cEtLT2xTQ0paZkpSTjZETHl4VW42M3UrTTBUS0h5Zm1aUDFG?= =?utf-8?B?enpEK2NnZFpDRCtDZGZRWXJrdndaWDBTV2NOUFEzenl2NXpvZVlTYkNKVEhL?= =?utf-8?B?NmNKUDBSakVtSWZUQ0g1aHJ5YUJ3R2lCNlNGVG5lQVB4QjNFUDYrL3ozQW56?= =?utf-8?B?MXdTT2hCaS9vdUJYMXloSHlGbXM4ak1iN0k0MlpwOWh5MUJpeG43Z0hDUzdw?= =?utf-8?B?L3o4cE5kdTFuQ3lDM3VzdXBXWW9UTmVFV3paUldRYStxL3duZz09?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a2bb5741-472a-41bd-dd15-08d9cda8c05f X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jan 2022 04:31:31.7686 (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: AM6PR03MB4374 Subject: Re: [FFmpeg-devel] [PATCH v9 6/6] lavc/hevcdec: Parse DOVI RPU NALs 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-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Niklas Haas: > From: Niklas Haas > > And expose the parsed values as frame side data. Update FATE results to > match. > > It's worth documenting that this relies on the dovi configuration record > being present on the first AVPacket fed to the decoder, which in > practice is the case if if the API user has called something like > av_format_inject_global_side_data, which is unfortunately not the > default. > > This commit is not the time and place to change that behavior, though. > > Signed-off-by: Niklas Haas > --- > configure | 2 +- > libavcodec/hevcdec.c | 63 +++++++++-- > libavcodec/hevcdec.h | 3 + > tests/ref/fate/hevc-dv-rpu | 224 +++++++++++++++++++++++++++++++++++++ > 4 files changed, 283 insertions(+), 9 deletions(-) > > diff --git a/configure b/configure > index 68658a847f..7803aa47af 100755 > --- a/configure > +++ b/configure > @@ -2826,7 +2826,7 @@ h264_decoder_suggest="error_resilience" > hap_decoder_select="snappy texturedsp" > hap_encoder_deps="libsnappy" > hap_encoder_select="texturedspenc" > -hevc_decoder_select="atsc_a53 bswapdsp cabac golomb hevcparse videodsp" > +hevc_decoder_select="atsc_a53 bswapdsp cabac dovi_rpu golomb hevcparse videodsp" > huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp" > huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp" > hymt_decoder_select="huffyuv_decoder" > diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c > index 46d9edf8eb..298d89fea6 100644 > --- a/libavcodec/hevcdec.c > +++ b/libavcodec/hevcdec.c > @@ -2723,6 +2723,7 @@ error: > static int set_side_data(HEVCContext *s) > { > AVFrame *out = s->ref->frame; > + int ret; > > if (s->sei.frame_packing.present && > s->sei.frame_packing.arrangement_type >= 3 && > @@ -2967,6 +2968,9 @@ static int set_side_data(HEVCContext *s) > s->rpu_buf = NULL; > } > > + if ((ret = ff_dovi_attach_side_data(&s->dovi_ctx, out)) < 0) > + return ret; > + > return 0; > } > > @@ -3298,16 +3302,24 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) > if (s->pkt.nb_nals > 1 && s->pkt.nals[s->pkt.nb_nals - 1].type == HEVC_NAL_UNSPEC62 && > s->pkt.nals[s->pkt.nb_nals - 1].size > 2 && !s->pkt.nals[s->pkt.nb_nals - 1].nuh_layer_id > && !s->pkt.nals[s->pkt.nb_nals - 1].temporal_id) { > + H2645NAL *nal = &s->pkt.nals[s->pkt.nb_nals - 1]; > if (s->rpu_buf) { > av_buffer_unref(&s->rpu_buf); > av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n"); > } > > - s->rpu_buf = av_buffer_alloc(s->pkt.nals[s->pkt.nb_nals - 1].raw_size - 2); > + s->rpu_buf = av_buffer_alloc(nal->raw_size - 2); > if (!s->rpu_buf) > return AVERROR(ENOMEM); > + memcpy(s->rpu_buf->data, nal->raw_data + 2, nal->raw_size - 2); > > - memcpy(s->rpu_buf->data, s->pkt.nals[s->pkt.nb_nals - 1].raw_data + 2, s->pkt.nals[s->pkt.nb_nals - 1].raw_size - 2); > + s->dovi_ctx.config = s->dovi_cfg ? (void *) s->dovi_cfg->data : NULL; > + ret = ff_dovi_rpu_parse(&s->dovi_ctx, nal->data + 2, nal->size - 2); > + if (ret < 0) { > + av_buffer_unref(&s->rpu_buf); > + av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n"); > + /* ignore */ > + } > } > > /* decode the NAL units */ > @@ -3440,8 +3452,8 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, > AVPacket *avpkt) > { > int ret; > - size_t new_extradata_size; > - uint8_t *new_extradata; > + uint8_t *sd; > + size_t sd_size; > HEVCContext *s = avctx->priv_data; > > if (!avpkt->size) { > @@ -3453,14 +3465,37 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, > return 0; > } > > - new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, > - &new_extradata_size); > - if (new_extradata && new_extradata_size > 0) { > - ret = hevc_decode_extradata(s, new_extradata, new_extradata_size, 0); > + sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, &sd_size); > + if (sd && sd_size > 0) { > + ret = hevc_decode_extradata(s, sd, sd_size, 0); > if (ret < 0) > return ret; > } > > + sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size); > + if (sd && sd_size > 0) { > + if (s->dovi_cfg) { > + /* Reuse existing buffer */ > + if ((ret = av_buffer_make_writable(&s->dovi_cfg)) < 0) > + return ret; > + } else { > + /* Allocate new buffer */ > + AVDOVIDecoderConfigurationRecord *cfg; > + size_t cfg_size; > + cfg = av_dovi_alloc(&cfg_size); > + if (!cfg) > + return AVERROR(ENOMEM); > + s->dovi_cfg = av_buffer_create((uint8_t *) cfg, cfg_size, NULL, NULL, 0); > + if (!s->dovi_cfg) { > + av_free(cfg); > + return AVERROR(ENOMEM); > + } > + } > + > + av_assert0(sd_size >= s->dovi_cfg->size); > + memcpy(s->dovi_cfg->data, sd, s->dovi_cfg->size); dovi_cfg is only used for exactly one thing: To read its dv_profile in ff_dovi_rpu_parse() later. This is quite a lot of effort to get this bit of data. Why not add a ff_dovi_parse_config() that just copies the needed field(s) from the user-supplied AVDOVIDecoderConfigurationRecord to the DOVIContext instead? (Furthermore, said config is explicitly intended to survive an unref as happens in a flush, leading to a dangling pointer in case the user unrefs dovi_cfg in flush. (Yes, the hevc decoder ensures that config is always set correctly before every ff_dovi_rpu_parse() call, but it is nevertheless nowhere stated that the profile is intended to be persistent.)) > + } > + > s->ref = NULL; > ret = decode_nal_units(s, avpkt->data, avpkt->size); > if (ret < 0) > @@ -3553,6 +3588,8 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx) > > pic_arrays_free(s); > > + ff_dovi_ctx_unref(&s->dovi_ctx); > + av_buffer_unref(&s->dovi_cfg); > av_buffer_unref(&s->rpu_buf); > > av_freep(&s->md5_ctx); > @@ -3637,6 +3674,7 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) > > ff_bswapdsp_init(&s->bdsp); > > + s->dovi_ctx.logctx = avctx; > s->context_initialized = 1; > s->eos = 0; > > @@ -3745,6 +3783,14 @@ static int hevc_update_thread_context(AVCodecContext *dst, > if (ret < 0) > return ret; > > + ret = av_buffer_replace(&s->dovi_cfg, s0->dovi_cfg); > + if (ret < 0) > + return ret; > + > + ret = ff_dovi_ctx_replace(&s->dovi_ctx, &s0->dovi_ctx); > + if (ret < 0) > + return ret; > + > s->sei.frame_packing = s0->sei.frame_packing; > s->sei.display_orientation = s0->sei.display_orientation; > s->sei.mastering_display = s0->sei.mastering_display; > @@ -3801,6 +3847,7 @@ static void hevc_decode_flush(AVCodecContext *avctx) > HEVCContext *s = avctx->priv_data; > ff_hevc_flush_dpb(s); > ff_hevc_reset_sei(&s->sei); > + ff_dovi_ctx_unref(&s->dovi_ctx); > av_buffer_unref(&s->rpu_buf); > s->max_ra = INT_MAX; > s->eos = 1; > diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h > index 870ff178d4..c8dde6fd17 100644 > --- a/libavcodec/hevcdec.h > +++ b/libavcodec/hevcdec.h > @@ -32,6 +32,7 @@ > #include "avcodec.h" > #include "bswapdsp.h" > #include "cabac.h" > +#include "dovi_rpu.h" > #include "get_bits.h" > #include "hevcpred.h" > #include "h2645_parse.h" > @@ -574,6 +575,8 @@ typedef struct HEVCContext { > int nuh_layer_id; > > AVBufferRef *rpu_buf; ///< 0 or 1 Dolby Vision RPUs. > + AVBufferRef *dovi_cfg; ///< contains AVDOVIDecoderConfigurationRecord > + DOVIContext dovi_ctx; ///< Dolby Vision decoding context > } HEVCContext; > > /** _______________________________________________ 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".