From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E235D44AB98; Thu, 8 Oct 2026 23:50:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791503425; cv=none; b=DQjMJsWZ2L16CLleuA+fc/BOrSaO7hL8JTlbtjtk3NFB7CNM64hPmznG+EpU9nI4pBIo6pCkaDDk3yAMkxO8ntQTb9oosOrONJqkWif+6ZBRb+JCSJ/jcTdfIskW57I8PUCfAVn33XeLgs63u+LyQm3Z/yhwJje8ptB22ma7zdU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791503425; c=relaxed/simple; bh=aQIFyOfOG4QZC4w8d2XYxD6zvJZQdSsyDCCUB1Y9iKc=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=gJnKVkWCa2Gtpb6EzlzKtcYN0NKnt+qgZ8uE04JF7DkrBEgxE8LtufQ4rIhPjuOJSod0PSKB2IbWmvrw4lTCzreWOF8PVXOCwctUsmT8YSDzg4S32LWd8shBya/gA8rM/6xsM06GX6GyXhUOoRPQFUawGXUklYz26avWYJwQgjM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nktqkRkH; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nktqkRkH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 12E8C1F00898; Thu, 8 Oct 2026 23:50:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791503423; bh=0OoP6GToXPDoDR4RUkoUtlD60KlAfu6fcwFHRsLGez4=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=nktqkRkHV0Tx5gjDz4qO8x2Rkj22fQCJ7Xxkp9lKr/8a7R8hbRqr+FBc2CKz9qlMk AYZnrG8pUef3J7szOkQ070CMe2al5+LAN+YkErXW8i+2fwfINE9Z7JIILrimWyPhg7 v6QUP/UX4pZUcDgYWDBcONizsLP+aAQ0vRJUcnC2Wf5EF1PU7H1A50NSAncI7izmXy 5RV3+kpqbg1sPmQDc3XWy9ocdEDJP1saO17ToHGfGM1qU6mILLwPh1HF+PixBN9foh IQLuUJ5GBCqsp0x/h0yOu4ur9SzYy88zYDubDt5nky91SpqM95TBgplgGjSC80Gzcq wRWk+aJ9MNKrg== Message-ID: <2f5df3cb-61b1-493c-b71a-17bfd35a9152@kernel.org> Date: Fri, 9 Oct 2026 00:50:19 +0100 Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v9 4/5] media: iris: Add HFI metadata buffer delivery support for Gen2 encoders To: Deepa Guthyappa Madivalara , Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, kernel test robot , Vishnu Reddy References: <20261005-enc_roi_enable-v9-0-831c24135cb1@oss.qualcomm.com> <20261005-enc_roi_enable-v9-4-831c24135cb1@oss.qualcomm.com> <27745be4-20de-4a00-95cf-27fde23f7e28@kernel.org> <7sfKTcUvYYlpgI4nGR07WZ7dipcv7fChRHcvfvrSEVwQdBcpSjwBCJihhgK_uKEkXDod_1hCPo7MgDV6ZyiNeA==@protonmail.internalid> <7639bce8-c259-429e-be91-512e3e2fda78@oss.qualcomm.com> From: Bryan O'Donoghue Content-Language: en-GB Autocrypt: addr=bod@kernel.org; keydata= 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 In-Reply-To: <7639bce8-c259-429e-be91-512e3e2fda78@oss.qualcomm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 07/10/2026 22:40, Deepa Guthyappa Madivalara wrote: > > On 10/7/2026 1:58 AM, Bryan O'Donoghue wrote: >> On 05/10/2026 23:38, Deepa Guthyappa Madivalara wrote: >>> Add the infrastructure to deliver metadata buffers to the HFI firmware >>> on HFI Gen2 based encoders, used to carry per-frame ROI delta QP data. >>> >>> Metadata buffer structures (iris_buffer.h): >>> - Add metabuf_header and metapayload_header structs describing the >>>    metadata buffer layout as expected by the firmware. >>>    HFI defines (iris_hfi_gen2_defines.h): >>> - Add HFI_CMD_DELIVERY_MODE (0x0100000A). >>> - Add HFI_MODE_METADATA (0x00000004) to hfi_property_mode_type. >>>    HFI command side (iris_hfi_gen2_command.c): >>> - In iris_hfi_gen2_session_queue_buffer(), after queuing a RAW >>>    (input) buffer, check for an available BUF_ROIMB_DELTAQP metadata >>>    buffer and, if found, append a second HFI_CMD_BUFFER packet for >>>    the metadata buffer in the same command, tagged with the same >>>    buffer index. >>> - Add iris_hfi_gen2_subscribe_metadata_delivery(): sends >>>    HFI_CMD_DELIVERY_MODE with HFI_MODE_METADATA and HFI_PROP_ROI_INFO >>>    to instruct the firmware to expect metadata on the input port. >>>    HFI response side (iris_hfi_gen2_response.c): >>> - Add iris_hfi_gen2_handle_output_metadata_buffer(): locate the >>>    metadata buffer by device address and transition it from >>>    QUEUED to DEQUEUED so it can be reused. >>> >>> Reviewed-by: Vishnu Reddy >>> Signed-off-by: Deepa Guthyappa Madivalara >>> >>> --- >>>   drivers/media/platform/qcom/iris/iris_buffer.h     | 18 ++++++++++ >>>   drivers/media/platform/qcom/iris/iris_ctrls.c      | 12 +++++++ >>>   drivers/media/platform/qcom/iris/iris_ctrls.h      |  1 + >>>   drivers/media/platform/qcom/iris/iris_hfi_common.h |  1 + >>>   .../platform/qcom/iris/iris_hfi_gen2_command.c     | 39 >>> ++++++++++++++++++++++ >>>   .../platform/qcom/iris/iris_hfi_gen2_defines.h     |  2 ++ >>>   .../platform/qcom/iris/iris_hfi_gen2_packet.c      |  6 ++-- >>>   .../platform/qcom/iris/iris_hfi_gen2_packet.h      |  3 ++ >>>   .../platform/qcom/iris/iris_hfi_gen2_response.c    | 27 >>> +++++++++++++++ >>>   drivers/media/platform/qcom/iris/iris_venc.c       |  4 +++ >>>   10 files changed, 110 insertions(+), 3 deletions(-) >>> >>> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.h >>> b/drivers/media/platform/qcom/iris/iris_buffer.h >>> index >>> ab8e5d953101a786ade20540ee3c3ed226160cbe..ee2d24bb69c57220b0a735d9b4aae4434a33daf6 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_buffer.h >>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.h >>> @@ -107,6 +107,24 @@ struct iris_buffers { >>>       u32            size; >>>   }; >>> >>> +/* Metadata buffer header */ >>> +struct metabuf_header { >>> +    u32 count; >>> +    u32 size; >>> +    u32 version; >>> +    u32 reserved[5]; >>> +}; >>> + >>> +/* Metadata buffer payload header */ >>> +struct metapayload_header { >>> +    u32 type; >>> +    u32 size; >>> +    u32 version; >>> +    u32 offset; >>> +    u32 flags; >>> +    u32 reserved[3]; >>> +}; >>> + >>>   int iris_get_buffer_size(struct iris_inst *inst, enum >>> iris_buffer_type buffer_type); >>>   void iris_get_internal_buffers(struct iris_inst *inst, u32 plane); >>>   int iris_create_internal_buffers(struct iris_inst *inst, u32 plane); >>> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c >>> b/drivers/media/platform/qcom/iris/iris_ctrls.c >>> index >>> d97fe50d48860b0f26b71d328a704f3804b1d93d..cd5597b2cbb69f0608fb8f21bd813e11c1f97693 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c >>> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c >>> @@ -1704,3 +1704,15 @@ int iris_set_properties(struct iris_inst >>> *inst, u32 plane) >>> >>>       return 0; >>>   } >>> + >>> +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane) >>> +{ >>> +    const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops; >>> +    int ret = 0; >>> + >>> +    /*subscribe to metadata delivery only if ROI is enabled */ >>> +    if (!inst->fw_caps[ROI_PARAMS].p_array) >>> +        return ret; >>> + >>> +    return hfi_ops->session_subscribe_metadata_delivery(inst, plane); >>> +} >> >> What does ret do here ? >> >> Also is session_subscribe_metadata_delivery() guaranteed to be >> non-NULL ? I see it initialised once in this patch. >> > The idea is to subscribe to metadata delivery only if ROI is set. If not > firmware will > expect metadata buffers from driver. So ret will just help returning > from here without subscribing. > session_subscribe_metadata_delivery needs to be initialized only once > per instance if ROI is set. Right so Ted Just return 0 then, I mean its redundant right - you don't modify this function in the next patch. But my real question is - what guarantee is there p_array and session_subscribe_metadata_delivery are simlutaneously true. Certainly looks like the firmware could declare a flag which could call a NULL pointer derference @ session_subscribe_metadata_delivery. > >>> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h >>> b/drivers/media/platform/qcom/iris/iris_ctrls.h >>> index >>> 08db807444203ef02f83008fc311cad20ea79f44..ef2c09485ad93719e4acc7f395899d7f67cb5b2d >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_ctrls.h >>> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h >>> @@ -51,5 +51,6 @@ int iris_set_req_sync_frame(struct iris_inst *inst, >>> enum platform_inst_fw_cap_ty >>>   int iris_set_time_delta_based_rc(struct iris_inst *inst, enum >>> platform_inst_fw_cap_type cap_id); >>>   int iris_set_slice_count(struct iris_inst *inst, enum >>> platform_inst_fw_cap_type cap_id); >>>   int iris_set_properties(struct iris_inst *inst, u32 plane); >>> +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane); >>> >>>   #endif >>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h >>> b/drivers/media/platform/qcom/iris/iris_hfi_common.h >>> index >>> 16099f9a25b65e2e4556d54499e2c2a4cc4e22fc..79b276cc64f656c387dab5994d844bc9a9c9e624 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h >>> @@ -132,6 +132,7 @@ struct iris_hfi_session_ops { >>>       int (*session_drain)(struct iris_inst *inst, u32 plane); >>>       int (*session_resume_drain)(struct iris_inst *inst, u32 plane); >>>       int (*session_close)(struct iris_inst *inst); >>> +    int (*session_subscribe_metadata_delivery)(struct iris_inst >>> *inst, u32 plane); >>>   }; >>> >>>   struct hfi_subscription_params { >>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>> b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>> index >>> 388a36ff2b07b7bcd8db21d4345bc900356b4ec3..cf88dbe11e8e9faef826e661d8e9909fd7f16b94 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>> @@ -1307,6 +1307,24 @@ static void iris_hfi_gen2_get_buffer(u32 >>> domain, struct iris_buffer *buffer, >>>       buf->timestamp = buffer->timestamp; >>>   } >>> >>> +static struct iris_buffer *iris_queue_metadata_buffers(struct >>> iris_inst *inst, >>> +                               enum iris_buffer_type buffer_type, >>> u32 index) >>> +{ >>> +    struct iris_buffers *buffers = &inst->buffers[buffer_type]; >>> +    struct iris_buffer *buffer = NULL; >>> + >>> +    if (list_empty(&buffers->list)) >>> +        return NULL; >>> + >>> +    buffer = list_first_entry(&buffers->list, typeof(*buffer), list); >>> +    if ((buffer->attr & BUF_ATTR_QUEUED) || (buffer->attr & >>> BUF_ATTR_DEQUEUED)) >>> +        return NULL; >>> + >>> +    buffer->index = index; >>> + >>> +    return buffer; >>> +} >>> + >>>   static int iris_hfi_gen2_session_queue_buffer(struct iris_inst >>> *inst, struct iris_buffer *buffer) >>>   { >>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 = >>> to_iris_inst_hfi_gen2(inst); >>> @@ -1359,6 +1377,26 @@ static int >>> iris_hfi_gen2_session_release_buffer(struct iris_inst *inst, struct i >>>                       inst_hfi_gen2->packet->size); >>>   } >>> >>> +static int iris_hfi_gen2_subscribe_metadata_delivery(struct >>> iris_inst *inst, u32 plane) >>> +{ >>> +    struct iris_inst_hfi_gen2 *inst_hfi_gen2 = >>> to_iris_inst_hfi_gen2(inst); >>> +    u32 port = iris_hfi_gen2_get_port(inst, >>> V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); >>> +    u32 payload[2] = {HFI_MODE_METADATA, HFI_PROP_ROI_INFO}; >>> + >>> +    iris_hfi_gen2_packet_session_command(inst, >>> +                         HFI_CMD_DELIVERY_MODE, >>> +                         (HFI_HOST_FLAGS_RESPONSE_REQUIRED | >>> +                          HFI_HOST_FLAGS_INTR_REQUIRED), >>> +                         port, >>> +                         inst->session_id, >>> +                         HFI_PAYLOAD_U32_ARRAY, >>> +                         &payload, >>> +                         sizeof(u32) * 2); >>> + >>> +    return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, >>> +                    inst_hfi_gen2->packet->size); >>> +} >>> + >>>   static const struct iris_hfi_session_ops iris_hfi_gen2_session_ops = { >>>       .session_open = iris_hfi_gen2_session_open, >>>       .session_set_config_params = >>> iris_hfi_gen2_session_set_config_params, >>> @@ -1372,6 +1410,7 @@ static const struct iris_hfi_session_ops >>> iris_hfi_gen2_session_ops = { >>>       .session_drain = iris_hfi_gen2_session_drain, >>>       .session_resume_drain = iris_hfi_gen2_session_resume_drain, >>>       .session_close = iris_hfi_gen2_session_close, >>> +    .session_subscribe_metadata_delivery = >>> iris_hfi_gen2_subscribe_metadata_delivery, >>>   }; >>> >>>   static struct iris_inst *iris_hfi_gen2_get_instance(void) >>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>> b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>> index >>> 2394213d8272b53bf6a1cff9574dc93f6830fc8c..746d7c1aad52cd87c55a7ad71fcf9560881dfce6 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>> @@ -20,6 +20,7 @@ >>>   #define HFI_CMD_DRAIN                0x01000007 >>>   #define HFI_CMD_RESUME                0x01000008 >>>   #define HFI_CMD_BUFFER                0x01000009 >>> +#define HFI_CMD_DELIVERY_MODE                0x0100000A >>>   #define HFI_CMD_SUBSCRIBE_MODE            0x0100000B >>>   #define HFI_CMD_SETTINGS_CHANGE            0x0100000C >>>   #define HFI_CMD_PAUSE                0x01000011 >>> @@ -177,6 +178,7 @@ enum hfi_flip { >>>   enum hfi_property_mode_type { >>>       HFI_MODE_PORT_SETTINGS_CHANGE        = 0x00000001, >>>       HFI_MODE_PROPERTY            = 0x00000002, >>> +    HFI_MODE_METADATA            = 0x00000004, >>>   }; >>> >>>   enum hfi_color_format { >>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c >>> b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c >>> index >>> 6e04175eb904b494309a38eece41213600f93a88..655f4c2fcdd5b89624887807f4fa17a645fac803 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c >>> @@ -100,9 +100,9 @@ static void iris_hfi_gen2_create_header(struct >>> iris_hfi_header *hdr, >>>       hdr->num_packets = 0; >>>   } >>> >>> -static void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, >>> u32 pkt_type, >>> -                    u32 pkt_flags, u32 payload_type, u32 port, >>> -                    u32 packet_id, void *payload, u32 payload_size) >>> +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 >>> pkt_type, >>> +                 u32 pkt_flags, u32 payload_type, u32 port, >>> +                 u32 packet_id, void *payload, u32 payload_size) >>>   { >>>       struct iris_hfi_packet *pkt = (struct iris_hfi_packet *)((u8 >>> *)hdr + hdr->size); >>>       u32 pkt_size = sizeof(*pkt) + payload_size; >>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h >>> b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h >>> index >>> 25b9582349ca1a0ce6efc0b146a3abb798485c45..613eb500609f745daebdcbdf9a25b85cb9465a79 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h >>> @@ -121,5 +121,8 @@ void iris_hfi_gen2_packet_session_property(struct >>> iris_inst *inst, >>>   void iris_hfi_gen2_packet_sys_interframe_powercollapse(struct >>> iris_core *core, >>>                                  struct iris_hfi_header *hdr); >>>   void iris_hfi_gen2_packet_sys_pc_prep(struct iris_core *core, >>> struct iris_hfi_header *hdr); >>> +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 >>> pkt_type, >>> +                 u32 pkt_flags, u32 payload_type, u32 port, >>> +                 u32 packet_id, void *payload, u32 payload_size); >>> >>>   #endif >>> diff --git >>> a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c >>> b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c >>> index >>> f0782c4b1e6e88d06cb4bd18f0210c105ae2acf8..ea1fc96077fdce83db9c6a6c1f753ec7978b0673 >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c >>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c >>> @@ -77,6 +77,7 @@ static bool >>> iris_hfi_gen2_is_valid_hfi_buffer_type(u32 buffer_type) >>>       case HFI_BUFFER_PERSIST: >>>       case HFI_BUFFER_VPSS: >>>       case HFI_BUFFER_PARTIAL_DATA: >>> +    case HFI_BUFFER_METADATA: >>>           return true; >>>       default: >>>           return false; >>> @@ -452,6 +453,30 @@ static int >>> iris_hfi_gen2_handle_release_internal_buffer(struct iris_inst *inst, >>>       return 0; >>>   } >>> >>> +static int iris_hfi_gen2_handle_output_metadata_buffer(struct >>> iris_inst *inst, >>> +                               struct iris_hfi_buffer *buffer) >>> +{ >>> +    u32 buf_type = iris_hfi_gen2_buf_type_to_driver(inst, >>> HFI_BUFFER_METADATA); >>> +    struct iris_buffers *buffers = &inst->buffers[buf_type]; >>> +    struct iris_buffer *buf, *iter; >>> +    bool found = false; >>> + >>> +    list_for_each_entry(iter, &buffers->list, list) { >>> +        if (iter->device_addr == buffer->base_address) { >>> +            found = true; >>> +            buf = iter; >>> +            break; >>> +        } >>> +    } >>> +    if (!found) >>> +        return -EINVAL; >>> + >>> +    buf->attr &= ~BUF_ATTR_QUEUED; >>> +    buf->attr |= BUF_ATTR_DEQUEUED; >>> + >>> +    return 0; >>> +} >>> + >>>   static int iris_hfi_gen2_handle_session_stop(struct iris_inst *inst, >>>                            struct iris_hfi_packet *pkt) >>>   { >>> @@ -499,6 +524,8 @@ static int >>> iris_hfi_gen2_handle_session_buffer(struct iris_inst *inst, >>>               return iris_hfi_gen2_handle_input_buffer(inst, buffer); >>>           else if (buffer->type == HFI_BUFFER_BITSTREAM) >>>               return iris_hfi_gen2_handle_output_buffer(inst, buffer); >>> +        else if (buffer->type == HFI_BUFFER_METADATA) >>> +            return iris_hfi_gen2_handle_output_metadata_buffer(inst, >>> buffer); >>>           else >>>               return >>> iris_hfi_gen2_handle_release_internal_buffer(inst, buffer); >>>       } >>> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c >>> b/drivers/media/platform/qcom/iris/iris_venc.c >>> index >>> 2f2c56bf9122c73e10e86815b1aa5fad99b0fb42..08353a8895b0e5d8769c2deb137a4fffcbc3108d >>> 100644 >>> --- a/drivers/media/platform/qcom/iris/iris_venc.c >>> +++ b/drivers/media/platform/qcom/iris/iris_venc.c >>> @@ -515,6 +515,10 @@ int iris_venc_streamon_output(struct iris_inst >>> *inst) >>>       if (ret) >>>           goto error; >>> >>> +    ret = iris_set_metadata_delivery(inst, >>> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); >>> +    if (ret) >>> +        goto error; >>> + >>>       ret = iris_alloc_and_queue_persist_bufs(inst, BUF_ARP); >>>       if (ret) >>>           return ret; >>> >>> -- >>> 2.34.1 >>> >>