From patchwork Tue Feb 28 21:25:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: JonHGee X-Patchwork-Id: 40555 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2306938pzb; Tue, 28 Feb 2023 13:25:58 -0800 (PST) X-Google-Smtp-Source: AK7set/JiBxIcmnbONrbi8ceXtq+dyhX7Zb+4tUuTxwOLDYUibGjPxqqBk24TAcdktNxwC3u7eQc X-Received: by 2002:a17:907:2bc2:b0:87f:546d:7cb4 with SMTP id gv2-20020a1709072bc200b0087f546d7cb4mr4567479ejc.64.1677619558755; Tue, 28 Feb 2023 13:25:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677619558; cv=none; d=google.com; s=arc-20160816; b=HAKLcTsPsP0zsjtrJihQh3aw0VnqGhOOZPRq2Y7093K4TPgcSOmFrAuvaFDYb9/u2o jtR3a8i+feXSVohzSQKZmGyYhUWLwvqujZgWe/2fnkZJHHI/h/YjIgTdBshOJIWlnoSj YXr6ixFuhOOOVgR9c3bRA3Fp2E79aSEtm+IO2ODnc7iLi4sethZRToZ1HQc9EwfnMpDn i7h5lX/x2vSp1jA9hqhYwb+9O4BU1f5DY6h+gpUcXaxP/oWhoC8D3crJO9FQ6Pzsq4a1 mkRXWRGN3WQFngVQ8eqYuaAkXFEbFvQQbTD57PH/HSXs0/dGMeNm+RKh2QQqSwU8G5cK A0fw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=vRokzzegwUuNM+jdJY7dNSeH5hJvf+HuLA4ZI8mH/ZM=; b=meOZYSEobXL1KOuX3f0Pov4uAFEpYdBW3k8fT9ydQMV0UnPWp61jIUfM5pA06cjnUI DswSBC6VI6XW2tkwOEJ0+8NOtcmHZ1vprhEsOyDM0wKCzd8COTvET2jHE5MCSuMWYZGR mXotyMzsTzWv+lmL2vXBCisP+6yOSVPQCdQCg/7MdZVO2O3tmuetL76dnGCKoD717Aop d0MwJdgiL3UcAoKTEJXI0GNzr8V2Y4G1QaYMNcC8wvG92mqwYAxhvhFuu+QNLiIqlFqR r65QRr9HBdm8rzjiXp3SZqp9VNrnW9D8J3Tc7NuT7t8JpuVlmJbk2qRDU9vtXLQNPQoa Yqww== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TiRNHkNV; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o23-20020a1709061b1700b008dffd95e783si10977538ejg.568.2023.02.28.13.25.58; Tue, 28 Feb 2023 13:25:58 -0800 (PST) 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=@gmail.com header.s=20210112 header.b=TiRNHkNV; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B086568AD89; Tue, 28 Feb 2023 23:25:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3947B68AAB6 for ; Tue, 28 Feb 2023 23:25:49 +0200 (EET) Received: by mail-pj1-f54.google.com with SMTP id 6-20020a17090a190600b00237c5b6ecd7so10569164pjg.4 for ; Tue, 28 Feb 2023 13:25:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3gE8b8IuYPNV7/Zhs/gW0JZLGnBVZKOPAMp7tbr1NOA=; b=TiRNHkNVElqFhv6t26ogY47GrI1OEu/PtVEAfazZ/u18tIrqR3t590irJdn7ts765E 0SamBGGHd4qiXYF3bCm4ZrXmNzcLETyYWOdX3g/ozc0MsxxRSZ2bPCLWRvEmj5a4a36D NY9dLUYLCSnfg/9RAHirwfzwb+GHL12ri5m9FDOdCCk/b9LyhCPa906NODELUQOvv9Zj X/zAjLtOuZkcebbIywDPSl4VJsh65Y+iMtKQtcWlJxd8LBpea+g+850glTz0Dz1qwpVB kSScgENo26Jxhp9Av16M8up+SwZncNGfCWAkAXIYQduP6pZuREIoic+pLZ+AvlcsliaE RNew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3gE8b8IuYPNV7/Zhs/gW0JZLGnBVZKOPAMp7tbr1NOA=; b=OJHDJrzkL0lZtEhpNL8brzJfst3Xjf/iT+sXzkjftKmyv6VlYY7L8scXgEp8WtWH9O /M6RVxHdP1ZfuXnVirGypA5bw94ubr7SXXbGqYH99OkrsJnh0u4Sk2O8FFVZZ+tYdPOq VuUkZiSQTEpkwjs+6FtOmY9JXwFgRaSZNMsF2Xi/iuym+oqstdN+ZeeVOicBPb+2a6K2 V5d3MaLtphoO2PksLGd35iGdeihKD4FjgT2h/3oWmP4cPVzlWaFUrkA0pVlbo6AwBFX+ ycYDuXcVfItUcYMPH+R48sV8m8yQDSlTwT8vslpVBCmB4feI5HQWhgBmJHqVhNX7qOzj 1PsQ== X-Gm-Message-State: AO0yUKWBkfxm91PE8T8rzAiTheHAnhTCP+14BPD+pxiKe7ICktWZFO4J mbhvtpSnnxBAWHhB5Bl1MEjUZY2oWvs= X-Received: by 2002:a17:903:2341:b0:19b:2332:18cb with SMTP id c1-20020a170903234100b0019b233218cbmr4751498plh.1.1677619547084; Tue, 28 Feb 2023 13:25:47 -0800 (PST) Received: from jongeegti.c.googlers.com.com (170.102.105.34.bc.googleusercontent.com. [34.105.102.170]) by smtp.gmail.com with ESMTPSA id y4-20020a170902ed4400b0019324fbec59sm6913110plb.41.2023.02.28.13.25.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 13:25:46 -0800 (PST) From: JonHGee X-Google-Original-From: JonHGee To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Feb 2023 21:25:13 +0000 Message-Id: <20230228212513.3976220-1-JonHGee@gmail.com> X-Mailer: git-send-email 2.39.2.722.g9855ee24e9-goog In-Reply-To: <826ff2b1-6de8-4811-5ad5-6f1c3b30662c@martin.st> References: <826ff2b1-6de8-4811-5ad5-6f1c3b30662c@martin.st> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavcodec/libfdk-aacenc: Enable writing DRC metadata 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: JonHGee Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hAC7uDuz9A+h Signed-off-by: JonHGee --- libavcodec/libfdk-aacenc.c | 69 +++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c index 54549de473..123dabf3ae 100644 --- a/libavcodec/libfdk-aacenc.c +++ b/libavcodec/libfdk-aacenc.c @@ -46,6 +46,13 @@ typedef struct AACContext { int latm; int header_period; int vbr; + int drc_profile; + int drc_target_ref; + int comp_profile; + int comp_target_ref; + int prog_ref; + int metadata_mode; + AACENC_MetaData metaDataSetup; AudioFrameQueue afq; } AACContext; @@ -64,6 +71,11 @@ static const AVOption aac_enc_options[] = { { "latm", "Output LATM/LOAS encapsulated data", offsetof(AACContext, latm), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, { "header_period", "StreamMuxConfig and PCE repetition period (in frames)", offsetof(AACContext, header_period), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xffff, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, { "vbr", "VBR mode (1-5)", offsetof(AACContext, vbr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 5, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "drc_profile", "The desired compression profile for AAC DRC", offsetof(AACContext, drc_profile), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 256, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "drc_target_ref", "Expected target reference level at decoder side in dB (for clipping prevention/limiter)", offsetof(AACContext, drc_target_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "comp_profile", "The desired compression profile for AAC DRC", offsetof(AACContext, comp_profile), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 256, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "comp_target_ref", "Expected target reference level at decoder side in dB (for clipping prevention/limiter)", offsetof(AACContext, comp_target_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "prog_ref", "The program reference level or dialog level in dB", offsetof(AACContext, prog_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, FF_AAC_PROFILE_OPTS { NULL } }; @@ -319,6 +331,30 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) } } + s->metadata_mode = 0; + if (s->prog_ref) { + s->metadata_mode = 1; + s->metaDataSetup.prog_ref_level_present = 1; + s->metaDataSetup.prog_ref_level = s->prog_ref << 16; + } + if (s->drc_profile) { + s->metadata_mode = 1; + s->metaDataSetup.drc_profile = s->drc_profile; + s->metaDataSetup.drc_TargetRefLevel = s->drc_target_ref << 16; + if (s->comp_profile) { + /* Including the comp_profile means that we need to set the mode to ETSI */ + s->metadata_mode = 2; + s->metaDataSetup.comp_profile = s->comp_profile; + s->metaDataSetup.comp_TargetRefLevel = s->comp_target_ref << 16; + } + } + + if ((err = aacEncoder_SetParam(s->handle, AACENC_METADATA_MODE, s->metadata_mode)) != AACENC_OK) { + av_log(avctx, AV_LOG_ERROR, "Unable to set metadata mode to %d: %s\n", + s->metadata_mode, aac_get_error(err)); + goto error; + } + if ((err = aacEncEncode(s->handle, NULL, NULL, NULL, NULL)) != AACENC_OK) { av_log(avctx, AV_LOG_ERROR, "Unable to initialize the encoder: %s\n", aac_get_error(err)); @@ -363,11 +399,13 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 }; AACENC_InArgs in_args = { 0 }; AACENC_OutArgs out_args = { 0 }; - int in_buffer_identifier = IN_AUDIO_DATA; - int in_buffer_size, in_buffer_element_size; + void* inBuffer[] = { 0, &s->metaDataSetup }; + int in_buffer_identifiers[] = { IN_AUDIO_DATA, IN_METADATA_SETUP }; + int in_buffer_element_sizes[] = { 2, sizeof(AACENC_MetaData) }; + int in_buffer_sizes[] = { 0 , sizeof(s->metaDataSetup) }; + void *out_ptr; int out_buffer_identifier = OUT_BITSTREAM_DATA; int out_buffer_size, out_buffer_element_size; - void *in_ptr, *out_ptr; int ret; uint8_t dummy_buf[1]; AACENC_ERROR err; @@ -376,13 +414,12 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, if (!frame) { /* Must be a non-null pointer, even if it's a dummy. We could use * the address of anything else on the stack as well. */ - in_ptr = dummy_buf; - in_buffer_size = 0; + inBuffer[0] = dummy_buf; in_args.numInSamples = -1; } else { - in_ptr = frame->data[0]; - in_buffer_size = 2 * avctx->ch_layout.nb_channels * frame->nb_samples; + inBuffer[0] = frame->data[0]; + in_buffer_sizes[0] = 2 * avctx->ch_layout.nb_channels * frame->nb_samples; in_args.numInSamples = avctx->ch_layout.nb_channels * frame->nb_samples; @@ -391,12 +428,18 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, return ret; } - in_buffer_element_size = 2; - in_buf.numBufs = 1; - in_buf.bufs = &in_ptr; - in_buf.bufferIdentifiers = &in_buffer_identifier; - in_buf.bufSizes = &in_buffer_size; - in_buf.bufElSizes = &in_buffer_element_size; + /* Only use audio input data if metadata mode is none. */ + if (s->metadata_mode == 0) { + in_buf.numBufs = 1; + + } else { + in_buf.numBufs = 2; + } + + in_buf.bufs = (void**)inBuffer; + in_buf.bufferIdentifiers = in_buffer_identifiers; + in_buf.bufSizes = in_buffer_sizes; + in_buf.bufElSizes = in_buffer_element_sizes; /* The maximum packet size is 6144 bits aka 768 bytes per channel. */ ret = ff_alloc_packet(avctx, avpkt, FFMAX(8192, 768 * avctx->ch_layout.nb_channels));