From patchwork Tue Sep 3 01:02:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 14878 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 92A694480AE for ; Tue, 3 Sep 2019 04:11:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7ACC7687FFF; Tue, 3 Sep 2019 04:11:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f196.google.com (mail-oi1-f196.google.com [209.85.167.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1F7B0687FCE for ; Tue, 3 Sep 2019 04:11:08 +0300 (EEST) Received: by mail-oi1-f196.google.com with SMTP id l2so11575313oil.0 for ; Mon, 02 Sep 2019 18:11:08 -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=J1YDxdwjPYwFp7ZADEHsgWWJpEh4nJp8vECFVM0a3Vw=; b=g0D4oZtfo+QgNOoVT3/+NbC8IRPKtHdI5u3g8hxsLC1Mqgh4wR1irwxWnUQpAGKz4U 3fopuQTYzAdwEJsOayZJCgFHe/4DWonDY6mhUZUiR212sBys8RPt4sRf100NVJJH70z3 EkQrWhcjJ5sYiIozt4rkcRibAx9RjwqoRotLqIdaPVZnDCYfv01uq05mfjUuGKw5MOAD Je/uAxms7miFDZftD9YqXpbEN3o5Th24LJtM7rrYHKeJoCzsGRvursM/g9N04JpDhfG+ qF5NhKK+OrhBza3QWhXP83ma/AYUA8CnzAhzeZS8phyA9kN5eNm1L8nY6mhYHLNg7dMN Mz1Q== 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=J1YDxdwjPYwFp7ZADEHsgWWJpEh4nJp8vECFVM0a3Vw=; b=k1oTbiBA2jt98U/LmbkVbnhbMx+LVItrOBrueMwc93Ey2VYDi4s7jnmYA86L/xYvdI E3sW+6SOe4WCVeGw++xzlA89HthfsqBpfd7bS/UcQXtwse4LczZFXdfAcZzivoBetUsN qMStHJjOHxglb+WkDeY5wK5rsurnvZtlCc+ZXU6rPtQh1oHpPEBZkXG0bTPyqVfcMAgi fTpu3chaSQf75qkegdKAn6Z/qrmu3vAU1WnXsCkyfTSLzj1uFAnsaOTmZ9LL5ZoL7xty YlPlk+4XJOeTOi2Q5OlIrsdDQTa17iCICyk7oqH3w8vnuhZBWHl9UwJHmsXzNX1m6Miw 4mWw== X-Gm-Message-State: APjAAAXa82/57rWRXePBpCSiJH3eb5WBN4szF41mTcKeESg1AExzf0qI 7kd5Ilt1Q6WHkdDSLTgbq5EE2cdswJQ= X-Google-Smtp-Source: APXvYqyCuapZ+bxCEF+1JBKkTDYzCW9OyUxqNmYsOjVbKy6c89cd43sSKWRc+3rJICOpWPSFAUFkxg== X-Received: by 2002:a05:6808:48:: with SMTP id v8mr19703449oic.153.1567472576775; Mon, 02 Sep 2019 18:02:56 -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 a21sm4299633oie.9.2019.09.02.18.02.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 02 Sep 2019 18:02:56 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Mon, 2 Sep 2019 18:02:10 -0700 Message-Id: <20190903010230.96236-6-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190903010230.96236-1-ffmpeg@tmm1.net> References: <20190903010230.96236-1-ffmpeg@tmm1.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/25] 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: lorusak@gmail.com, Aman Gupta , jorge.ramirez.ortiz@gmail.com, Aman Gupta Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta This fixes h264_v4l2m2m encoding on the Raspberry Pi Signed-off-by: Aman Gupta --- libavcodec/v4l2_buffers.c | 61 ++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 51b0d25cad..17228fe36d 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,59 @@ 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 height = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? + fmt.fmt.pix_mp.height : fmt.fmt.pix.height; + int is_planar_format = 0; + + switch (pixel_format) { + case V4L2_PIX_FMT_YUV420M: + case V4L2_PIX_FMT_YVU420M: + case V4L2_PIX_FMT_YUV422M: + case V4L2_PIX_FMT_YVU422M: + case V4L2_PIX_FMT_YUV444M: + case V4L2_PIX_FMT_YVU444M: + case V4L2_PIX_FMT_NV12M: + case V4L2_PIX_FMT_NV21M: + case V4L2_PIX_FMT_NV12MT_16X16: + case V4L2_PIX_FMT_NV12MT: + case V4L2_PIX_FMT_NV16M: + case V4L2_PIX_FMT_NV61M: + is_planar_format = 1; + } + + 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 = 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, 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, frame->buf[i]); + 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 +426,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;