From patchwork Tue Sep 3 01:02:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 14854 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 C663C449F2B for ; Tue, 3 Sep 2019 04:03:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A51EB687F4A; Tue, 3 Sep 2019 04:03:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f194.google.com (mail-oi1-f194.google.com [209.85.167.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A2A16680D42 for ; Tue, 3 Sep 2019 04:03:07 +0300 (EEST) Received: by mail-oi1-f194.google.com with SMTP id k20so5076424oih.3 for ; Mon, 02 Sep 2019 18:03:07 -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=is0weFA5wAGcNLfFe3ksOatiMXDlkulxFdLLa2ysCbU=; b=kH7V5l9o4vXpddC+7q9GwbK2z7MoncwwhJBjGQk4XyMKgfQhC1b5v349sB3Pd6QXoE UVjVuebl9rV+qul78EZ0/d2rseUhf525AwpIIoLE4gBRslAMwT6V+/HS6DgUXnGW7ebn BsI2CRSm7SXOxmBY/Ce/9cCP/vSWPyP65VQCXKIgvQTN8bj3yoeLY5TgPI8/qTussm42 dyrs/tHcKoHIdgJGxC544u4zl9BQzs3CGeX58ogesqSCODwYembpRxoNy/cpMP6CZo5B yWX9mqTzvRkaIP8NDmaqh7qXEI+qYw769UIs2VWaQ1DrPmIPvoZdw41ifDGmLt8mYmWP DAqw== 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=is0weFA5wAGcNLfFe3ksOatiMXDlkulxFdLLa2ysCbU=; b=ccuySbKMiYEB0qr9vXDm6hP40pB8BwNgw70TvKOOGF9xNey4TfS8HDFobo9Mh/jTOw 7r3LN59gQqEDiP24PgPj3qVYRhnwZENSvIsxsypfSKYaJ/YoFRFcV5QrTauaMBY+/QZY 0sww1WvilcPSaRLx05zWQU4EgZzI6fzYRDyjknEDYxZPei52Ogv58X3gVFcFrCx2b15U lVt8GW5V7XALcgAScIM2lNnwtIQpa1RNe6BawywLD5YusEa7jQam8EQu4j/lPVx7HbmX g9kST7pe7FOD05UnclxA7FrTwHPJwT76nhX89I2rYpZlwN5p0ZJLWw6r06qGHoe858fj bZCA== X-Gm-Message-State: APjAAAUyjytAszpQhMO0AQs/ld1rC34qXlMEDkU0XvenvIZQUfa7jkhZ 3SKN+I5l98nTq2roU1zwhu7zo0Ol3y4= X-Google-Smtp-Source: APXvYqyYxDxxvtsWSLrQ3gCySm6oJPe4mAsrHdb4+1EbZjxka45T2vPTVxQxa3RqY6g5MY+UQQP6IA== X-Received: by 2002:aca:f305:: with SMTP id r5mr2298784oih.131.1567472585804; Mon, 02 Sep 2019 18:03:05 -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.03.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 02 Sep 2019 18:03:05 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Mon, 2 Sep 2019 18:02:16 -0700 Message-Id: <20190903010230.96236-12-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 11/25] avcodec/v4l2_buffers: split out AVFrame generation into helper method 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 Signed-off-by: Aman Gupta --- libavcodec/v4l2_buffers.c | 76 +++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 4982fc564e..784ea94d4c 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -281,6 +281,47 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i return 0; } +static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) +{ + int i, ret; + + frame->format = avbuf->context->av_pix_fmt; + + for (i = 0; i < avbuf->num_planes; i++) { + ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); + if (ret) + return ret; + + frame->linesize[i] = avbuf->plane_info[i].bytesperline; + frame->data[i] = frame->buf[i]->data; + } + + /* fixup special cases */ + switch (avbuf->context->av_pix_fmt) { + case AV_PIX_FMT_NV12: + case AV_PIX_FMT_NV21: + if (avbuf->num_planes > 1) + break; + frame->linesize[1] = avbuf->plane_info[0].bytesperline; + frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; + break; + + case AV_PIX_FMT_YUV420P: + if (avbuf->num_planes > 1) + break; + frame->linesize[1] = avbuf->plane_info[0].bytesperline >> 1; + frame->linesize[2] = avbuf->plane_info[0].bytesperline >> 1; + frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; + frame->data[2] = frame->data[1] + ((avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height) >> 2); + break; + + default: + break; + } + + return 0; +} + /****************************************************************************** * * V4L2Buffer interface @@ -349,44 +390,17 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) { V4L2m2mContext *s = buf_to_m2mctx(avbuf); - int i, ret; + int ret; av_frame_unref(frame); /* 1. get references to the actual data */ - for (i = 0; i < avbuf->num_planes; i++) { - ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); - if (ret) - return ret; - - frame->linesize[i] = avbuf->plane_info[i].bytesperline; - frame->data[i] = frame->buf[i]->data; - } - - /* 1.1 fixup special cases */ - switch (avbuf->context->av_pix_fmt) { - case AV_PIX_FMT_NV12: - case AV_PIX_FMT_NV21: - if (avbuf->num_planes > 1) - break; - frame->linesize[1] = avbuf->plane_info[0].bytesperline; - frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; - break; - case AV_PIX_FMT_YUV420P: - if (avbuf->num_planes > 1) - break; - frame->linesize[1] = avbuf->plane_info[0].bytesperline >> 1; - frame->linesize[2] = avbuf->plane_info[0].bytesperline >> 1; - frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; - frame->data[2] = frame->data[1] + ((avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height) >> 2); - break; - default: - break; - } + ret = v4l2_buffer_buf_to_swframe(frame, avbuf); + if (ret) + return ret; /* 2. get frame information */ frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME); - frame->format = avbuf->context->av_pix_fmt; frame->color_primaries = v4l2_get_color_primaries(avbuf); frame->colorspace = v4l2_get_color_space(avbuf); frame->color_range = v4l2_get_color_range(avbuf);