From patchwork Thu Aug 22 21:47:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 14666 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 8D0704481EB for ; Fri, 23 Aug 2019 00:49:00 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 73DC468ACDF; Fri, 23 Aug 2019 00:49:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f66.google.com (mail-ot1-f66.google.com [209.85.210.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EDB0D68AC82 for ; Fri, 23 Aug 2019 00:48:52 +0300 (EEST) Received: by mail-ot1-f66.google.com with SMTP id k18so6931922otr.3 for ; Thu, 22 Aug 2019 14:48:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tmm1-net.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LCeGJBg4f/e9Ii5GS1yU5zEXBsTvQ7gguayQaT0t7PY=; b=RZvy1L/BtobxNLDdi4Zp8w73SxbD1wCrpjiDegFu3AkGYtXkK/9IpXoWL/oJJrxGQi DwaibU6UGAVfGrYc6qG1JntvJskcJjRUDyDR/xBLTK+yiikbWin1AbI9AKjFIK6MXw76 G45BRjZ3e1UIBf+lk17v0NPmAfy/pVxJN1qF0DPHKeSwFUMTaUIqEg9d2AP9eWMldhHE RwHiJs0aBZZnmMwFZP8xMZlq1ULrsgKz/qku9x21ErPXZuLx4uMkAVa/yBc6j53eyJgP qEYK7rfQ7xfw7Dn4xfQj+UScxRiw/1BYgTozELEkrCQK+Ucet0AxRtod2oDDOhjom9ZW QBWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=LCeGJBg4f/e9Ii5GS1yU5zEXBsTvQ7gguayQaT0t7PY=; b=t+qmLzd/Ci8WXiRLcEvneX2sjZWQfiBgDsKIJG/8QrfhOiFoG8sDbI+a/ygSpWn3oE 7YLOxAFcFCKkBfrlGJwAMN3FegrrdkZ4N5A7HcbNr4rdR8LXzMhgrSy4PXleyXq0upPX tldRl+p05V4XN0KjiH6HxBCEmfzg9y9jgT1/4Lulnh2eOzc5LYA2FJkofSiUqF1/BEX4 lvOM21ZaS8bH0C+HbryjcG+cSlZWUGbvUiVErNGhiIBH4bJ1be/lH75Rezkd5OFAO8Zv uqX4EQ1icxQCxW7A1NEm1xlpYXZ5dor2YYm3XUaY2+tskQ14FU+0Tpw4XyZkIWDwUTyY 5cnA== X-Gm-Message-State: APjAAAXhM+g4MPxDg4NCrcRitjjZnDB8QH1WVc5HG7vAstw8R8E5wuOW QjrdWZFp+vM28b/7CjiVyBpYHlAy2AE= X-Google-Smtp-Source: APXvYqzhT+jP02Evr7S181uhhHlPJQHnOSQhV1GiA4SS4kZxFiTh2t3rtbEaML1mCHTfI8fvvA+0nA== X-Received: by 2002:a9d:4590:: with SMTP id x16mr1398622ote.254.1566510531391; Thu, 22 Aug 2019 14:48:51 -0700 (PDT) Received: from tmm1-imac.lan (ip184-189-221-177.sb.sd.cox.net. [184.189.221.177]) by smtp.gmail.com with ESMTPSA id r2sm314253otk.49.2019.08.22.14.48.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 22 Aug 2019 14:48:50 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Thu, 22 Aug 2019 14:47:40 -0700 Message-Id: <20190822214741.12456-7-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190822214741.12456-1-ffmpeg@tmm1.net> References: <20190822214741.12456-1-ffmpeg@tmm1.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/8] avcodec/v4l2_buffers: teach ff_v4l2_buffer_avframe_to_buf about contiguous planar formats X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Aman Gupta , jro@xenomai.org Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta Signed-off-by: Aman Gupta --- libavcodec/v4l2_buffers.c | 43 +++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 4f889509f9..3f9b8b5e31 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -29,6 +29,7 @@ #include #include "libavcodec/avcodec.h" #include "libavcodec/internal.h" +#include "libavutil/pixdesc.h" #include "v4l2_context.h" #include "v4l2_buffers.h" #include "v4l2_m2m.h" @@ -257,17 +258,17 @@ static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf) return 0; } -static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, AVBufferRef* bref) +static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset, AVBufferRef* bref) { unsigned int bytesused, length; if (plane >= out->num_planes) return AVERROR(EINVAL); - bytesused = FFMIN(size, out->plane_info[plane].length); length = out->plane_info[plane].length; + bytesused = FFMIN(size+offset, length); - memcpy(out->plane_info[plane].mm_addr, data, FFMIN(size, out->plane_info[plane].length)); + memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, FFMIN(size, length-offset)); if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { out->planes[plane].bytesused = bytesused; @@ -289,15 +290,41 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) { int i, ret; + struct v4l2_format fmt = out->context->format; + int pixel_format = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? fmt.fmt.pix_mp.pixelformat + : fmt.fmt.pix.pixelformat; + int is_planar_format = ((pixel_format >> 8) & 0xFF) == 'M'; // YU12 vs YM12, NV12 vs NM12, etc - for(i = 0; i < out->num_planes; i++) { - ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, frame->buf[i]); + v4l2_set_pts(out, frame->pts); + + if (!is_planar_format) { + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); + int planes_nb = 0; + int offset = 0; + + for (i = 0; i < desc->nb_components; i++) + planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1); + + for (i = 0; i < planes_nb; i++) { + int size, h = frame->height; + if (i == 1 || i == 2) { + h = AV_CEIL_RSHIFT(frame->height, desc->log2_chroma_h); + } + size = frame->linesize[i] * FFALIGN(h, 16); + ret = v4l2_bufref_to_buf(out, 0, frame->buf[i]->data, size, offset, frame->buf[i]); + if (ret) + return ret; + offset += size; + } + return 0; + } + + for (i = 0; i < out->num_planes; i++) { + ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, 0, frame->buf[i]); if (ret) return ret; } - v4l2_set_pts(out, frame->pts); - return 0; } @@ -381,7 +408,7 @@ int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) { int ret; - ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, pkt->buf); + ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, 0, pkt->buf); if (ret) return ret;