From patchwork Thu Jan 29 02:44:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miguel Casas-Sanchez X-Patchwork-Id: 5735641 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 445CEBF440 for ; Thu, 29 Jan 2015 02:44:45 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E0FDF201FA for ; Thu, 29 Jan 2015 02:44:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3D96820160 for ; Thu, 29 Jan 2015 02:44:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759996AbbA2Coj (ORCPT ); Wed, 28 Jan 2015 21:44:39 -0500 Received: from mail-ie0-f178.google.com ([209.85.223.178]:45146 "EHLO mail-ie0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755786AbbA2Coh (ORCPT ); Wed, 28 Jan 2015 21:44:37 -0500 Received: by mail-ie0-f178.google.com with SMTP id rp18so28123210iec.9 for ; Wed, 28 Jan 2015 18:44:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:date:message-id:subject:from:to:content-type; bh=vZIzcje20z2aDfOeNuX9p27hackQJnytt+OEMyYtZ54=; b=LbzrAe/l125bmXrL1z26ctoCkaNnPpp8lDL1qbeWkfxFZwsmr8wV7aF0t9lQSXpEk+ LSWeUvu/xUNLnurvq2A5VpzVz6I3C7a54JUhj5xj3VYlKKAR44KpI8k989PCrVX8qd1u ksJ+8nkQyNwETH9VN9B0+aRpNWs8Lq91m0+Dg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=vZIzcje20z2aDfOeNuX9p27hackQJnytt+OEMyYtZ54=; b=kQKm5wdE/EVc5n6JyJnOpbHl65o2sOAdbVpoGKgYhWPskUcNug8JTLzE4V/x5wgoH1 s2yHnbOZPg6IMKpXOfDf4a5t8Vev8JLGSWsy4pKA6x8uyLzdQmZT/e3VQEbKdrDVvhsj tT6QqoIcpbbIt2e5dtKyYtbvWLeHGwl/HxEgpju7uat17h7Ar7+d2Swl/ZLlXkjWQH6i jU8yQyza9s9HGjQ3rFmPVnh/5jQ3SC6PlSZI5yxbro2LHOQrznsjcuiABEXw3ugJaD9/ A1G5ajWfBBviZVh6tfJ8/98dYW07TPgAqUxBv/RkzZt9k3mf6ujRAQ0WeWxmJyN8Ipn4 uS6w== X-Gm-Message-State: ALoCoQluZ/0o4vKUF4VrPEIMHA0z7ws4dYIu9zMfjdlyXMzPxFZjN3nV6hfLHc1kGG/jq1itVHf/ MIME-Version: 1.0 X-Received: by 10.50.43.138 with SMTP id w10mr7411770igl.19.1422499476883; Wed, 28 Jan 2015 18:44:36 -0800 (PST) Received: by 10.36.22.79 with HTTP; Wed, 28 Jan 2015 18:44:36 -0800 (PST) Date: Wed, 28 Jan 2015 18:44:36 -0800 Message-ID: Subject: Vivid test device: adding YU12 From: Miguel Casas-Sanchez To: linux-media@vger.kernel.org Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,T_TVD_MIME_EPI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi folks, I've been trying to add a triplanar format to those that vivid can generate, and didn't quite manage :( So, I tried adding code for it like in the patch (with some dprintk() as well) to clarify what I wanted to do. Module is insmod'ed like "insmod vivid.ko n_devs=1 node_types=0x1 multiplanar=2 vivid_debug=1" With the patch, vivid: - seems to enumerate the new triplanar format all right - vid_s_fmt_vid_cap() works as intended too, apparently - when arriving to vid_cap_queue_setup(), the size of the different sub-arrays does not look quite ok. - Generated video is, visually, all green. I added as well a capture output dmesgs. Not much of interest here, the first few lines configure the queue -- with my few added dprintk it can be seen that the queue sizes are seemingly incorrect. If and when this part is up and running, I wanted to use Vivid to test dma-buf based capture. Big thanks! Jan 28 18:05:23 kernel: [ 884.446334] vivid-000: @vivid_s_fmt_vid_cap Jan 28 18:05:23 kernel: [ 884.446350] vivid-000: vid_cap_queue_setup, fourcc=0x32315559, planes=3 Jan 28 18:05:23 kernel: [ 884.446351] vivid-000: vid_cap_queue_setup, 0 bpl=640, 2bytesize=2 Jan 28 18:05:23 kernel: [ 884.446352] vivid-000: vid_cap_queue_setup, 1 bpl=640, 2bytesize=1 Jan 28 18:05:23 kernel: [ 884.446353] vivid-000: vid_cap_queue_setup, 2 bpl=640, 2bytesize=1 Jan 28 18:05:23 kernel: [ 884.446354] vivid-000: vid_cap_queue_setup, count=2, sizes=230400, 230400, 230400 Jan 28 18:05:23 kernel: [ 884.447130] vivid-000: vid_cap_buf_prepare Jan 28 18:05:23 kernel: [ 884.447401] vivid-000: vid_cap_buf_prepare Jan 28 18:05:23 kernel: [ 884.447405] vivid-000: vid_cap_buf_queue Jan 28 18:05:23 kernel: [ 884.447406] vivid-000: vid_cap_buf_queue Jan 28 18:05:23 kernel: [ 884.447407] vivid-000: vid_cap_start_streaming Jan 28 18:05:23 kernel: [ 884.447408] vivid-000: vivid_start_generating_vid_cap Jan 28 18:05:23 kernel: [ 884.447442] vivid-000: returning from vivid_start_generating_vid_cap Jan 28 18:05:23 kernel: [ 884.447443] vivid-000: Video Capture Thread Start Jan 28 18:05:23 kernel: [ 884.447444] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.447448] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:23 kernel: [ 884.447450] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:23 kernel: [ 884.447987] vivid-000: filled buffer 0 Jan 28 18:05:23 kernel: [ 884.478491] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.478494] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:23 kernel: [ 884.478496] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:23 kernel: [ 884.478945] vivid-000: filled buffer 1 Jan 28 18:05:23 kernel: [ 884.479243] vivid-000: vid_cap_buf_prepare Jan 28 18:05:23 kernel: [ 884.479246] vivid-000: vid_cap_buf_queue Jan 28 18:05:23 kernel: [ 884.514523] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.514526] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:23 kernel: [ 884.514527] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:23 kernel: [ 884.514723] vivid-000: filled buffer 0 Jan 28 18:05:23 kernel: [ 884.546620] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.578592] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.614667] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.646706] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.678709] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.714780] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.715555] vivid-000: vid_cap_buf_prepare Jan 28 18:05:23 kernel: [ 884.715557] vivid-000: vid_cap_buf_queue Jan 28 18:05:23 kernel: [ 884.746817] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.746845] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:23 kernel: [ 884.746846] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:23 kernel: [ 884.747119] vivid-000: filled buffer 1 Jan 28 18:05:23 kernel: [ 884.778812] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.814849] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.846895] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.878922] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.914996] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.947015] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.947899] vivid-000: vid_cap_buf_prepare Jan 28 18:05:23 kernel: [ 884.947901] vivid-000: vid_cap_buf_queue Jan 28 18:05:23 kernel: [ 884.979071] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 884.979089] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:23 kernel: [ 884.979090] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:23 kernel: [ 884.979436] vivid-000: filled buffer 0 Jan 28 18:05:23 kernel: [ 885.015092] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 885.047140] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 885.079136] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 885.115176] vivid-000: Video Capture Thread Tick Jan 28 18:05:23 kernel: [ 885.147235] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.179275] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.180183] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 885.180185] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 885.215290] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.215293] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:24 kernel: [ 885.215295] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:24 kernel: [ 885.215603] vivid-000: filled buffer 1 Jan 28 18:05:24 kernel: [ 885.247319] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.279353] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.315427] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.347465] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.379524] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.415550] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.416342] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 885.416345] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 885.447609] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.447612] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:24 kernel: [ 885.447614] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:24 kernel: [ 885.447887] vivid-000: filled buffer 0 Jan 28 18:05:24 kernel: [ 885.479599] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.515640] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.547641] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.579707] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.615761] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.647814] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.648717] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 885.648720] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 885.679806] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.679809] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:24 kernel: [ 885.679811] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:24 kernel: [ 885.680159] vivid-000: filled buffer 1 Jan 28 18:05:24 kernel: [ 885.715878] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.747901] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.779951] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.816001] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.848012] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.880059] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.880897] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 885.880899] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 885.916090] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.916107] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:24 kernel: [ 885.916109] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:24 kernel: [ 885.916513] vivid-000: filled buffer 0 Jan 28 18:05:24 kernel: [ 885.948082] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 885.980152] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.016203] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.048236] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.080253] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.116308] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.117211] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 886.117213] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 886.148356] vivid-000: Video Capture Thread Tick Jan 28 18:05:24 kernel: [ 886.148360] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0 Jan 28 18:05:24 kernel: [ 886.148361] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0 Jan 28 18:05:24 kernel: [ 886.148771] vivid-000: filled buffer 1 Jan 28 18:05:24 kernel: [ 886.148976] vivid-000: vid_cap_buf_prepare Jan 28 18:05:24 kernel: [ 886.148978] vivid-000: vid_cap_buf_queue Jan 28 18:05:24 kernel: [ 886.148993] vivid-000: vid_cap_stop_streaming Jan 28 18:05:24 kernel: [ 886.148994] vivid-000: vivid_stop_generating_vid_cap Jan 28 18:05:24 kernel: [ 886.148998] vivid-000: Video Capture Thread End diff --git a/drivers/media/platform/vivid/vivid-core.h b/drivers/media/platform/vivid/vivid-core.h index 4b497df..debc66f 100644 --- a/drivers/media/platform/vivid/vivid-core.h +++ b/drivers/media/platform/vivid/vivid-core.h @@ -84,7 +84,7 @@ struct vivid_fmt { bool can_do_overlay; u32 alpha_mask; u8 planes; - u32 data_offset[2]; + u32 data_offset[TPG_MAX_PLANES]; }; extern struct vivid_fmt vivid_formats[]; diff --git a/drivers/media/platform/vivid/vivid-tpg.c b/drivers/media/platform/vivid/vivid-tpg.c index fc9c653..596828e 100644 --- a/drivers/media/platform/vivid/vivid-tpg.c +++ b/drivers/media/platform/vivid/vivid-tpg.c @@ -185,6 +185,10 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc) case V4L2_PIX_FMT_ABGR32: tpg->is_yuv = false; break; + case V4L2_PIX_FMT_YUV420: + tpg->planes = 3; + tpg->is_yuv = true; + break; case V4L2_PIX_FMT_NV16M: case V4L2_PIX_FMT_NV61M: tpg->planes = 2; @@ -229,6 +233,11 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc) tpg->twopixelsize[0] = 2; tpg->twopixelsize[1] = 2; break; + case V4L2_PIX_FMT_YUV420: + tpg->twopixelsize[0] = 2; + tpg->twopixelsize[1] = 1; + tpg->twopixelsize[2] = 1; + break; } return true; } @@ -671,6 +680,11 @@ static void gen_twopix(struct tpg_data *tpg, buf[0][offset] = r_y; buf[1][offset] = odd ? g_u : b_v; break; + case V4L2_PIX_FMT_YUV420: + buf[0][offset] = r_y; + buf[1][offset / 2] = g_u; + buf[2][offset / 2] = b_v; + break; case V4L2_PIX_FMT_YUYV: buf[0][offset] = r_y; diff --git a/drivers/media/platform/vivid/vivid-tpg.h b/drivers/media/platform/vivid/vivid-tpg.h index bd8b1c7..9014324 100644 --- a/drivers/media/platform/vivid/vivid-tpg.h +++ b/drivers/media/platform/vivid/vivid-tpg.h @@ -87,7 +87,7 @@ enum tpg_move_mode { extern const char * const tpg_aspect_strings[]; -#define TPG_MAX_PLANES 2 +#define TPG_MAX_PLANES 3 #define TPG_MAX_PAT_LINES 8 struct tpg_data { diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c index 867a29a..3c2f584 100644 --- a/drivers/media/platform/vivid/vivid-vid-cap.c +++ b/drivers/media/platform/vivid/vivid-vid-cap.c @@ -98,6 +98,13 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f unsigned h = dev->fmt_cap_rect.height; unsigned p; + dprintk(dev, 1, "%s, fourcc=0x%x, planes=%u\n", __func__, dev->tpg.fourcc, + planes); + //for (p = 0; p < planes; p++) { + //dprintk(dev, 1, "%s, %u bpl=%u, 2bytesize=%u\n", __func__, + // p, tpg_g_bytesperline(&dev->tpg, p), tpg_g_twopixelsize(&dev->tpg, p)); + //} + if (dev->field_cap == V4L2_FIELD_ALTERNATE) { /* * You cannot use read() with FIELD_ALTERNATE since the field @@ -149,12 +156,20 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f *nplanes = planes; + for (p = 0; p < planes; p++) { + dprintk(dev, 1, "%s, %u bpl=%u, 2bytesize=%u\n", __func__, + p, tpg_g_bytesperline(&dev->tpg, p), tpg_g_twopixelsize(&dev->tpg, p)); + + } /* * videobuf2-vmalloc allocator is context-less so no need to set * alloc_ctxs array. */ - if (planes == 2) + if (planes == 3) + dprintk(dev, 1, "%s, count=%d, sizes=%u, %u, %u\n", __func__, + *nbuffers, sizes[0], sizes[1], sizes[2]); + else if (planes == 2) dprintk(dev, 1, "%s, count=%d, sizes=%u, %u\n", __func__, *nbuffers, sizes[0], sizes[1]); else @@ -519,6 +534,8 @@ int vivid_g_fmt_vid_cap(struct file *file, void *priv, struct v4l2_pix_format_mplane *mp = &f->fmt.pix_mp; unsigned p; + dprintk(dev, 1, "%s, planes=%u\n", __func__, dev->fmt_cap->planes); + mp->width = dev->fmt_cap_rect.width; mp->height = dev->fmt_cap_rect.height; mp->field = dev->field_cap; @@ -629,6 +646,8 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv, unsigned factor = 1; unsigned i; + dprintk(dev, 1, "@%s\n", __func__); + if (ret < 0) return ret; @@ -645,6 +664,10 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv, dev->fmt_cap = vivid_get_format(dev, mp->pixelformat); if (V4L2_FIELD_HAS_T_OR_B(mp->field)) factor = 2; + if (V4L2_TYPE_IS_MULTIPLANAR(f->type)) { + tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); + dev->tpg.planes = mp->num_planes; + } /* Note: the webcam input doesn't support scaling, cropping or composing */ @@ -732,6 +755,8 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv, tpg_s_bytesperline(&dev->tpg, 0, mp->plane_fmt[0].bytesperline); if (tpg_g_planes(&dev->tpg) > 1) tpg_s_bytesperline(&dev->tpg, 1, mp->plane_fmt[1].bytesperline); + if (tpg_g_planes(&dev->tpg) > 2) + tpg_s_bytesperline(&dev->tpg, 2, mp->plane_fmt[2].bytesperline); dev->field_cap = mp->field; tpg_s_field(&dev->tpg, dev->field_cap); tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap); diff --git a/drivers/media/platform/vivid/vivid-vid-common.c b/drivers/media/platform/vivid/vivid-vid-common.c index 6bef1e6..6281e13 100644 --- a/drivers/media/platform/vivid/vivid-vid-common.c +++ b/drivers/media/platform/vivid/vivid-vid-common.c @@ -181,10 +181,18 @@ struct vivid_fmt vivid_formats[] = { .planes = 2, .data_offset = { 0, PLANE0_DATA_OFFSET }, }, + { + .name = "4:2:0, planar, YUV", + .fourcc = V4L2_PIX_FMT_YUV420, + .depth = 8, + .is_yuv = true, + .planes = 3, + .data_offset = { 0, 0, 0}, + }, }; -/* There are 2 multiplanar formats in the list */ -#define VIVID_MPLANAR_FORMATS 2 +/* There are 3 multiplanar formats in the list */ +#define VIVID_MPLANAR_FORMATS 3 const struct vivid_fmt *vivid_get_format(struct vivid_dev *dev, u32 pixelformat) {