From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 08BBE4D20B for ; Thu, 13 Nov 2025 07:01:33 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'HckIPiDIkWVJ6kYCHwCGjIidcOYjSSVT1PIUhmtFGAQ=', expected b'FsGxOGZVdniSYPM2SkDSx5IOTW5S241e1SaFqEGIMMk=')) header.d=foxmail.com header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1763017096; h=message-id : mime-version : in-reply-to : date : references : to : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=DVuwvHNwZs/Nq5BgeOc7tArIHNhpkdQQjzZfO840PhQ=; b=VYitxpugLlpCWIp5lU2IbEuXnUa3DRV6aliR0a/vmGcRyQMYex7azy2rWQBiQVi64f4jk bocKTKSzR8nwxVQ3ubLZ/Qiueoamdh6x+CXBQ/JG3/ovxHzJjdmdGBGBoXGJ1ZH+a9LU6NJ 58tNRPuWjZqLUywrpcNB6e9KGkWExGHR1eWUo3VDc+MpiTypbOL7mgt57nOBuP+sL/+zVMU jQyBtxqICQpdMiE/IC00e6ClILs11ymcx20ob37OQx4kqPoyldd1xv2mJaKE7UmFDIz3lBM isWoweUq0ZKov5nDo8/rh56YHw7g8NAL/+TdMYsqt1oERZ9NLQm+tSPi/0dw== Received: from [172.19.0.2] (unknown [172.19.0.2]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 186AB68FD69; Thu, 13 Nov 2025 08:58:16 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1763017029; b=nLleeG6hpg//y4kNGxgGEhUsghVEkshIJaFLjdi8TAmNFYo86eQk6RERO+2FyHnc1cKSL NCrgZTzVId0MlJnFXmcWhaaKk+036n3m0RK4fhnP+zaN96fWFcpKk5mzHNTyrJ4QlGT4nz3 AAPPWoOMvDnBjYiJIu5KKKHiykpnkHVKBY1imwb01EE2csPExb8q/aHZPUg/ZD2odIRYQOA bTjaES/PusjMl4+CFIKUkz3W0tLrGck6CFSSTG0Q/yf5rD9p6OLlb5655B8nweg3HBtDgl/ wTpHtQpmHPMYiV5zQ+V0tPbsftZsDJT2k/TbdYZIhdrCzMylBrhnN7n1Gcbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1763017029; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=HckIPiDIkWVJ6kYCHwCGjIidcOYjSSVT1PIUhmtFGAQ=; b=t1RxcJ9J2BnB//JceA4HVRW/09bTpjtNhsdvg7Gh7V18ZPN2pFzyTqgjBT5n6CED4eNBy w03baJnGjPD0NJxIlwMKaqxNYxo+QC/MiP7Dqd4UujDDQZtj5plwbGGDKhM9wtMoTcad+yv DKFJvAvJhNVQKQqhFTN3xfk2huMhivoRtASJmizM7lIM4SE2+fVkh39EP3xveN/MdOCjnn7 tdVMNvHVagbz4OuzCBTrTUf0AKiaiOpMFmz563FBB1PwpN+BHYzjbQCtLzCiRCHbYdy5t+/ TjbfYuUt/WfuKo2otl9ylJB6aPCfsmVQ53aeoxy29ef1ETL79VJxCD7HQTug== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=foxmail.com; arc=none; dmarc=pass header.from=foxmail.com policy.dmarc=none Authentication-Results: ffmpeg.org; dkim=pass header.d=foxmail.com; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=foxmail.com policy.dmarc=none Received: from out162-62-57-252.mail.qq.com (out162-62-57-252.mail.qq.com [162.62.57.252]) by ffbox0-bg.ffmpeg.org (Postfix) with UTF8SMTPS id 7C57668FC32 for ; Thu, 13 Nov 2025 08:56:43 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1763016998; bh=FsGxOGZVdniSYPM2SkDSx5IOTW5S241e1SaFqEGIMMk=; h=Subject:From:In-Reply-To:Date:Cc:References:To; b=Bt7WuprMKVMYbFT591c0uNy3tr/3KT8qbTzUSiaQM6ci8Bv+rGTy3qty7P/1+1Gc6 1qhN2Doe/uyJx43yLXwYYA1VLKX5c5BlVWufAhebZ3tlzSFtj36GYjyv4SpC4qIgHL reD9brjW8TWKCZae6jNtVrp0jqkcWo1VLcLcO+4k= Received: from smtpclient.apple ([119.147.10.242]) by newxmesmtplogicsvrszb20-1.qq.com (NewEsmtp) with SMTP id E24AE2F1; Thu, 13 Nov 2025 14:56:36 +0800 X-QQ-mid: xmsmtpt1763016996t125ircb5 Message-ID: X-QQ-XMAILINFO: MRMtjO3A6C9XnnzsWdrk7n9771l8ct9QIJPoR3n8t5plp8InurZTMid/KNtjIz 8Sl05mbsWdN34FaaS+ThFr4As8GwJUMm4+hfF/n86ml0Ui4J0wRhBERdifyMQ9McDf/Wm359Atm2 UQ4fbFI+mRTXj+Nap6SJxv/0rEC1DaEqzDciuTep6/8Xc9v3DdFiYLRv8ytGkd/qL1QRK8wmeeXn eDuCn2y5UnkD0y+dq40TD3Q+bp4UKn+Q0K5/0O0RQjlIheP+r4pWMwEnY9+kCb86reWGCj3P8uMa tUm+wt0l8vOUw08zUchI9mSbome538F5K6+xX4xqNEWqzXNYstfvsYYoIpoPkNAwkgHf/YfsywzE 3b1NuP9XfF4wzBc0hdW5IMP47pfq1J69oAmdqr47bo4XIzRIa5QgdUC/HueNomYi5+baS7iIiQHL w8YEUhnt8cpzTfuGmVfZN8vKFzfjB+HAxWa8TemJ/ecM0TpKWmw/pWMOkf3F1qROjpaYD051kpmS LiSa7rYW/84+L+fL5ua0LPjm9oxm0mkDZKN7OG8CdxnyZhbJJVSPziBO+SSQd+Z+OfdNp8sldeSD 8XrQu4JY69K+vgmVn8aXe2jGS3q3fgdIX+UbKTZ2sDgLeN0D8Zq6yRrxFZMeIB/GxZDTEh9Zmf44 UyFgZRSwrrMW+A3wsmw1oWI9F4mEyejXux9DbTfwLkPMa8iiRtEKlmF2lit4ttWx8uUXDqtTtbd3 38xcE8sUYhH10S0BnwE3500OlV870+h6c5ioYNKwizaFWGmf8hGq+INWE8f8dHNrn2LpQRXNoQ22 a5cEqAgvQTz671H5YQWx2daMZxWnkSKGF/d/uBIoNF/3njEoOYG3TrDIf6O0+visyrOTI2C9hFIi D9/DTVTqlTlhgv/QWjoxcmAT2SNi8K3hBL7oBJ7cOtJ31xPvuhCBfg8IRJO2fiwLp/93vRv0C3vn RiXAoTgPHi47PtZmLB3cKhhnZtc9CluPB0gM2+x3aqB3UJFM46SvlfRzrJLsA72z6gkkA/mVebSF 7aQJJLskOjPUkgJOacQCwl/ydSkWy82By9MYQzUg== X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\)) In-Reply-To: Date: Thu, 13 Nov 2025 14:56:26 +0800 X-OQ-MSGID: <181C256C-F13B-45CB-9015-996CDA754E82@foxmail.com> References: To: FFmpeg development discussions and patches X-Mailer: Apple Mail (2.3826.700.81) Message-ID-Hash: LHXHUW4IJOLIRZAN6BGRCLF2BRIEKKXA X-Message-ID-Hash: LHXHUW4IJOLIRZAN6BGRCLF2BRIEKKXA X-MailFrom: SRS0=M6S1=5V=foxmail.com=quinkblack@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] Re: [PATCH] libavcodec/v4l2_buffers: fixing buffer alignment issue List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Zhao Zhili via ffmpeg-devel Cc: Wenjie Yin , "wangao.wang@oss.qualcomm.com" , "Qiwei Liu (QUIC)" , "renjiang.han@oss.qualcomm.com" , Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: > On Nov 13, 2025, at 11:29, Wenjie Yin via ffmpeg-devel wrote: > > V4l2 drivers may return buffer width & height with aligned values, which > may be different from frame width & height. Bytesperlines and strides > should be check for aligned buffers when copying pixel data. When width > aligned, copy with planar; otherwise, copy line-by-line to dest buffer. > > Co-authored-by: Renjiang Han > Signed-off-by: Wenjie.Yin > Signed-off-by: Wenjie Yin > --- > libavcodec/v4l2_buffers.c | 68 +++++++++++++++++++++++++++++++++++---- > 1 file changed, 62 insertions(+), 6 deletions(-) > > diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c > index d869ce9e77..5f5a8aefd5 100644 > --- a/libavcodec/v4l2_buffers.c > +++ b/libavcodec/v4l2_buffers.c > @@ -356,6 +356,33 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) > return 0; > } > > +static int v4l2_plane_to_plane_align(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset, int width, int height, int stride) > +{ > + unsigned int bytesused, length; > + > + if (plane >= out->num_planes) > + return AVERROR(EINVAL); > + > + length = out->plane_info[plane].length; > + bytesused = FFMIN(size+offset, length); > + > + for (int i = 0; i < height; i++) { > + memcpy((uint8_t*)out->plane_info[plane].mm_addr + offset, data, width); > + offset += stride; > + data += width; > + } > + > + if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { > + out->planes[plane].bytesused = bytesused; > + out->planes[plane].length = length; > + } else { > + out->buf.bytesused = bytesused; > + out->buf.length = length; > + } > + > + return 0; > +} > + > static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) > { > int i, ret; > @@ -364,7 +391,11 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) > fmt.fmt.pix_mp.pixelformat : fmt.fmt.pix.pixelformat; > int height = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? > fmt.fmt.pix_mp.height : fmt.fmt.pix.height; > - int is_planar_format = 0; > + int bytesperline = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? > + (fmt.fmt.pix_mp.num_planes ? fmt.fmt.pix_mp.plane_fmt[0].bytesperline: 0) : fmt.fmt.pix.bytesperline; The doc says bytesperline can be zero __u32 bytesperline; /* for padding, zero if unused */ > + int sizeimage = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? > + (fmt.fmt.pix_mp.num_planes ? fmt.fmt.pix_mp.plane_fmt[0].sizeimage: 0) : fmt.fmt.pix.sizeimage; > + int is_planar_format = 0, scanline_y = 0, scanline_uv = 0; > > switch (pixel_format) { > case V4L2_PIX_FMT_YUV420M: > @@ -398,16 +429,41 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) > for (i = 0; i < desc->nb_components; i++) > planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1); > > + switch (pixel_format) > + { > + /* Currently only NV12 & NV21 are addressed for buffer alignment issue */ > + case V4L2_PIX_FMT_NV12: > + case V4L2_PIX_FMT_NV21: > + scanline_y = sizeimage / bytesperline * 2 / 3; > + scanline_uv = scanline_y / 2; > + break; > + default: > + /* By default, no buffer alignment issues are expected */ > + scanline_y = height; > + scanline_uv = AV_CEIL_RSHIFT(height, desc->log2_chroma_h); > + bytesperline = frame->linesize[0]; > + break; > + } I think you can use the information in const AVPixFmtDescriptor *desc to handle all formats than switch case for each one. Please send a PR to https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls > + > for (i = 0; i < planes_nb; i++) { > int size, h = height; > if (i == 1 || i == 2) { > h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); > } > - size = frame->linesize[i] * h; > - ret = v4l2_bufref_to_buf(out, 0, frame->data[i], size, offset); > - if (ret) > - return ret; > - offset += size; > + > + if (bytesperline == frame->linesize[0]) { > + size = frame->linesize[i] * h; > + ret = v4l2_bufref_to_buf(out, 0, frame->data[i], size, offset); > + if (ret) > + return ret; > + offset += frame->linesize[i] * (i ? scanline_uv : scanline_y); > + } else { > + size = bytesperline * (i ? scanline_uv : scanline_y); > + ret = v4l2_plane_to_plane_align(out, 0, frame->data[i], size, offset, frame->linesize[i], h, bytesperline); > + if (ret) > + return ret; > + offset += size; > + } > } > return 0; > } > -- > 2.34.1 > > _______________________________________________ > ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org > To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org