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 3791A40757 for ; Wed, 22 Dec 2021 19:55:35 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7EB5868B0C6; Wed, 22 Dec 2021 21:55:34 +0200 (EET) Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-oln040092070040.outbound.protection.outlook.com [40.92.70.40]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DDF3A68B04C for ; Wed, 22 Dec 2021 21:55:27 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nBdddsRDsUxTKlVh6C1jESLLqbJTDQoYVbnHPXBDkGu19suYwKXcoI7OBoeGgFVefsttvkFxpMNWLDvw5pZalCjoNOgcr7F5DKg6G4dK+5Am8VOkJEZHYbLbzAI4vBSuR/EaJHJDQ1nwNnShMu9KHmmwprQp28Pq+V06/OReSedwBGC0sa9LipHvaejT2ebZplnQWQzNrkkoFExLvhfdjNsNguWJKyWVN5e0LkYnQqPALmqiWv/FySHytoMN24+zF+WuKhD0hfLQxifAJO3EOgKq4LZqGjqq7iHK/clSzdGfNxUEhmROgBSQe4URjAHLC7tV/v2++7C/pi2G4KshZQ== 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=tR4WVAeRvgxlSmtPglVYy5PwPY6jULhyOXW2J0j7s9I=; b=Zqo2ItSDPZ5dpr6zRzIcd2hFqnfELoKszCkuFziiqR1y/HI58BV7P0EzgC6sQNZrpzwvFJ/xKyaStKNXWdd9gn7CjWxcvS+qpE2mVV7VbSv92oiF05m+W8stSS3SMsM0D1q2J7fQkv+YNP567ZA1vaT/2J7qUWGFOes23FA0lalozkUgFAlA3tAD5oBGlTmux74Ao3Ah/8K2NsT//muoKAK6y7rVrFPitCXohy1TmQ8UT+FJ696AZF4vw3HLcJJUDJz0onZInnrcCvsqh2ommLX01XaPo/AspmQnNdOOlEh+XGIcxkXZXVzZXM5KCuATndlPCgxT0mxzZotlxkQ5eQ== 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=tR4WVAeRvgxlSmtPglVYy5PwPY6jULhyOXW2J0j7s9I=; b=Yt46qqbyqrqWL3Xte5x7PnxDgGapgtoQjeNgdl+oQu1xaGuShb0jgWnyBcL30jC5LrZVZkh5fbU+mAOeqiNm2+hasaQyl3a6aPstIsEQfXXd/EwEhdO581k/KFbycLBufC5ZUoDQedmlG+ofa3SnVDsICe8ZoxyX00AS/bdvBCTaHkMLljXsfaXcnXlIArTTuwWzB2XMGy2Co/CDj1FIeetsySaNg93ep9wT2am8FdpBmbpKCbrsVqRFyO2OXntKOQGh9JxAxBeOffHElXqXuCj+Kq3+IRS60EM80DTLNdZSSs8LbZWPqxO6zO5LslpykLNzWsnhLc+6Q3NhuOG4DQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (10.141.218.86) by AM6PR03MB4695.eurprd03.prod.outlook.com (20.177.36.79) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4801.14; Wed, 22 Dec 2021 19:55:25 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca%6]) with mapi id 15.20.4801.022; Wed, 22 Dec 2021 19:55:25 +0000 Message-ID: Date: Wed, 22 Dec 2021 20:55:24 +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: [uUI/vilLcQSpavjq6IF+WT5pjAGAiXst] X-ClientProxiedBy: AM6P191CA0031.EURP191.PROD.OUTLOOK.COM (2603:10a6:209:8b::44) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5e5f915b-7245-497d-7fa2-08d9c584feb6 X-MS-TrafficTypeDiagnostic: AM6PR03MB4695:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: eqOWZqLvCC7HVQKC/H9hJ9C5Z+eogLvwLFh6Y+WFtfXX2Wz+7SeutatbaibMMt2ryqoD2mxIEY7uJ851SU1oY0cbXbhCtu4GA3gOeItZEq6ohM3HhtGjV9JLRqvo+tkX8ihVfVzo9tE0vXupRGPrjQAUVLdMCNTlOMkPRY7334/JMKMz4ughbUkMyBNSiyK4YlRtceVffvQut2aOGOLZIFXH3MtrK+aa7TyWlNT+inmnH1lUwyCITNfEpWtGSlho/gu0oKcBlQze9EJMp6efkbRd/iEbAhXg50DPipo5DWXBxUr/sXhHZSM3ZZbvQqkGlsWqeXW+cXVq3b2K3rpXhpwIY36RTakJK4b25EOFDXkWKcLGDaSxMFw9g3jL87hG+CDj4gP7GPOV2almrA9StnpfCl4XxBshg9fRWe22wg+tUS1qNwrOnInLc6WXb2Jd/wfhPQ5ixB6G8pTUWByA/eXKNKRG4VSUwjby7ZYiBopiADMvlP5gZXvs5xfwL8x4SQYGSrXJ6T2puiYIay7oDdfqpDaDMGoVjMmguISSMEVsE6VlISUIinmlAM9oo3cbdWf0kn1enizGNfb4AV8dHQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SDhXUnBYdFhVQUZtVnVURG13WFBGS0hEZGJueEoyZHRTTmUvbzd4UGFOVGMw?= =?utf-8?B?UFQvQ1p5M0FEOUFxSmNCdFdvcEpWbGN0dE1qUCtPMWd1d1ZsT0ZrVHVEV3F3?= =?utf-8?B?UjhGblNoeWVsTC91NWtrTnoxRENHUUlUbXBvWG9QdWpoblFVZmswazVwZFFm?= =?utf-8?B?bjRsRS92NlBKVEJnWlJnSzRFeFVSVjVXWllOU1FNYlVRS0JkMGRkOUpOR3BE?= =?utf-8?B?eXF6K0JhT2tqbUVKaE1pN3dRUFlrZVBoaEM3UjRvWXJIU3RXell0OGhzdTRU?= =?utf-8?B?QWw0MUdQOXVxbG5DcFFQZkg4M2FaeDBaeTE5ckhzVW1LK3BuN3BIQUI4bXlO?= =?utf-8?B?Y053M3R6MDU0VkJzRDVHVFlNMitSSUxWM1hPeU54RU12WXJnNmNtWEpEditB?= =?utf-8?B?U2RvUDFvOTlZWWhSYjl4NE5GR21hUjkxcVNPdmpDSDBLeW1oUlVqR3FIZ3hk?= =?utf-8?B?dnlzK2VMbzlpNndvMTF1SEZ3OWdPTittVnl6LzNJZ1BBT25IS0dBaVhBdnlV?= =?utf-8?B?SDNSY2tTL1hRU1NlU0IvVFhmYk1VVSt0VFJvMVRCWCtaQk9ueFBqcGNHTDFv?= =?utf-8?B?ZFB3TSt6Vy9BY0NadVQzSFB4clVEOWZtTGQyVFBJeVlqK3g3WUg2UlVjNTRX?= =?utf-8?B?UGlENzBFWmhTeUZ3WmNVbDNqWFI4MTIvMTZhWE1iYkkzUldDTnIwdUxHM1Rn?= =?utf-8?B?NHJLOEsxV2UzY2VaYjY4OEttSExBbzkxZURtbnU0dDhxZVdiUDNrTVpDaWNO?= =?utf-8?B?MUhONW1hM3NhbmJydFd0RzA5blFlek85em1nYmQyTDJLTWVLbVZVVWdQQTFv?= =?utf-8?B?cVNCeWxZaVBBTTR1V2JLQXg0SGc0WmxOdFhscEtNWVYybVpxUzl5NEhGWUd3?= =?utf-8?B?RFJ6dlhkM1psZk15Y0xIaDdBcThZUFlJME1ra241YUk0TzBTT0dTT3BTQWd6?= =?utf-8?B?bnBOY3FVbFNITFBHYlZubmo5Q01Tek5QN29vaE9qaFY3WTg4c3NZUmR6NlNn?= =?utf-8?B?NFI1bG5nZWliSmtGVWxyMnVjQld3NU4xRU56NXhYMjBKcW5TQnBPNXdEM0d5?= =?utf-8?B?bXJTa2R6QXdkRVZ4cHJQWVlrSjMra01DMDZtcFFlZmlpZ1pBaksvVkxaL3I3?= =?utf-8?B?MS9QR2hERHBYWFVRUGpPeVcwdjJKMHd3eFl4cnlpTHQ0MFFBOTdMZzFCWUF0?= =?utf-8?B?VncrTG5oZVBkbGl1bU9ObnNBVmtxRTlCV0Z4ZTFuWWg4ZWlFekpuR0lnQ25D?= =?utf-8?B?K1RGUWlseUloaHYxQmZGWWlRVFZwMTk2V3VFZmVSVkNTSUgrQT09?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5e5f915b-7245-497d-7fa2-08d9c584feb6 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2021 19:55:25.3581 (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: AM6PR03MB4695 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); Actually, your dovi_cfg comes from libavutil (allocated via av_dovi_alloc()), so it should be the newest and biggest dovi struct there is. And the side data's AV_PKT_DATA_DOVI_CONF should also emanate from av_dovi_alloc(), so its size should coincide with dovi_cfg->size. > + memcpy(s->dovi_cfg->data, sd, s->dovi_cfg->size); > + } > + > 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; > > /** 1. Patchwork said there was a new warning when applying this patch. _______________________________________________ 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".