From patchwork Fri Jun 30 08:52:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hsia-Jun Li X-Patchwork-Id: 42344 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1e:b0:12b:9ae3:586d with SMTP id c30csp2350434pzh; Fri, 30 Jun 2023 01:53:36 -0700 (PDT) X-Google-Smtp-Source: APBJJlGKpzhETU4v9FHEl3MBgd+5vZ0HkJp4DJYE365iW9x5bRNZSizygFDV6PpjKtRCXuRWvMPM X-Received: by 2002:a17:906:8cf:b0:96a:861:a2ac with SMTP id o15-20020a17090608cf00b0096a0861a2acmr1409467eje.0.1688115216281; Fri, 30 Jun 2023 01:53:36 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ks1-20020a170906f84100b0098cf3eaee47si8257223ejb.689.2023.06.30.01.53.35; Fri, 30 Jun 2023 01:53:36 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@Synaptics.onmicrosoft.com header.s=selector2-Synaptics-onmicrosoft-com header.b=OWcem38s; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=synaptics.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A48768C213; Fri, 30 Jun 2023 11:53:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2047.outbound.protection.outlook.com [40.107.237.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8B6EF68BEFE for ; Fri, 30 Jun 2023 11:53:24 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=arTjfu5+O/xyWbNZbp6dfSxbj5CAlwnuo8wFNfcVcz3EIEeJ0QrBuemj8mR4Ixm8J/DU7NB+bTyXL9ZoAVaokjfAdrvv967WDaEFTLO9o+qgbYwIHluPmgqmoMln40O98J6Zy7/M6e8eA0MS9BRCOtJO/c0J9+2felTZ6tEy4sVPBaXCB5auKTuoiiTbRuD5n1UZ4YPPBrjHOXcLuEvhYUocnfnc+3xxhNhYjpTpo74N3r6uZ8qZehm/cZaForg/rZ7faLiWMtSdCWtZNx+irzu1DWU9FtTR6mwYWVhRWeKvTwREfs0sRcgM3gdkKkYi/y/4v5xrf4Ht1IA9na4vSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=C9BhMpLZm3Jm5E3swa7FsgGZ7BJ15rtYNP+sMTsU0Jo=; b=IvA/LCr2Np/py6Ag+JltdZ9jXh/8dUnZ/RVR9+KcoOxbqFDuJ0jXzGcHKd7TkITv9/cPLiFU2jF559/UU8tTrt/m5GvfD/FRwujcaDRobUsIjqABl2ENrQniHw+rxay1jdb5h8jUTovUPdSYb4qgvcziRKPo+NPEah5cAPVmRvhowmoK24rBVm0A1JHOAJkV5oF8bYhu+Tta+vqb856RQ6QkR3JQmJBBCxjuD9zWXYPAUsA342l7xlRjzpTts0s1RLzCaqyrl5uGwtzi4yhTDSKAiGq6SYJUayWU9cCo1Vbklq4MX5Or5g599JyF2IArcvruB7eWB0L9QFqNnPyfJQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=synaptics.com; dmarc=pass action=none header.from=synaptics.com; dkim=pass header.d=synaptics.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Synaptics.onmicrosoft.com; s=selector2-Synaptics-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=C9BhMpLZm3Jm5E3swa7FsgGZ7BJ15rtYNP+sMTsU0Jo=; b=OWcem38sSFFl7xpq/A3YgsGSzr/70bb4wFYpWAHrXk5ZOW23Cl4YoepkZpUFLAUGy3Ir/6wPEb4WFbUPilH2VTk3KWpPiEO11jHAizVBaIdRUVLI1dTXUBNwXNhetvBqpnByRahtR0hUbvf0gsmBZ7NHjsXZAq3b2Gc375A0Hgw= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=synaptics.com; Received: from DM6PR03MB5196.namprd03.prod.outlook.com (2603:10b6:5:24a::19) by DM4PR03MB6176.namprd03.prod.outlook.com (2603:10b6:5:39c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6521.26; Fri, 30 Jun 2023 08:53:20 +0000 Received: from DM6PR03MB5196.namprd03.prod.outlook.com ([fe80::6882:b9c1:2b2d:998d]) by DM6PR03MB5196.namprd03.prod.outlook.com ([fe80::6882:b9c1:2b2d:998d%5]) with mapi id 15.20.6544.019; Fri, 30 Jun 2023 08:53:19 +0000 From: Hsia-Jun Li To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Jun 2023 16:52:49 +0800 Message-ID: <20230630085256.517640-1-randy.li@synaptics.com> X-Mailer: git-send-email 2.41.0 X-ClientProxiedBy: SJ0PR03CA0234.namprd03.prod.outlook.com (2603:10b6:a03:39f::29) To DM6PR03MB5196.namprd03.prod.outlook.com (2603:10b6:5:24a::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR03MB5196:EE_|DM4PR03MB6176:EE_ X-MS-Office365-Filtering-Correlation-Id: afcdae9c-0125-40a2-7c2f-08db79477393 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 2AXu7OQ7EXCPVjcUHh0m5ufa4NWJj6XTyIpQZzmMYV10OILi8OYoByNe4Rj+d09WsRDWQ9CIIAU89TbW5ATHhPWlz+rZxlI7QhEXO2/bzTuUm8y1Invy+szNgdYa36fJYFBuZkqCVfBHBZLXI6GzNPSdd+YI2u7f0jY/pATqk9ZzL80VxMtgpyy5ddmc4T+7u24/t1faHyzNYh+UWi1yhKd5rjmeB6kkoLgdJLB/wcesYb7l7G8dMu313Es5ElzoPHpoakjfN2SV4Xg68EqwJSwDHnV9IPb5VVun8Nuizw9HB/yTER+pgaJhhD4wBVO3NIPkv2mImt2H0DhFjlkdrRXZocR0ezVjfZYU6A6CGNFSwkslOjU4uqP31b9T5Xw0tMI83ziXRMv+q6JUphRhE8zh9kvcAi8Z2tO0MhfnjGco+nNZieJLtdZdKr3uu9RMXn1RpkR8ivLh0fjF/52ma2ptEEbQv0JyxmZdDr9LGRwz1J57orv/wb/mTtBGCNp8zgjvNxx+3yqdnJKlXikInr45W7J3jl8Kbiu++1vyVBjd7oxb9kXvhJV6S9t3cJ332vLf2UM335f6N3GbTtk62y7JBljouTZqdsQjng96EmFXznJCSMTPD+0bHP4q4TG4NPzBE18dztfy3wBp+FRfMw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR03MB5196.namprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(366004)(376002)(39860400002)(396003)(136003)(346002)(451199021)(6666004)(1076003)(52116002)(6486002)(2906002)(107886003)(83380400001)(2616005)(38100700002)(26005)(186003)(6512007)(38350700002)(6506007)(41300700001)(86362001)(4326008)(8676002)(5660300002)(478600001)(66946007)(6916009)(66476007)(8936002)(36756003)(66556008)(316002)(70780200001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tI14jNtrYsFWBxa9SUkGa+9LKJ306sHXRwszELYDb0PeaOdm/larZGp7wjupi7l0ArVslHmdQEyuLTa2A4x6SRYC+qja+W6FzGcPlGavjiMVjHKYJdq7pRZofI19levZsRKjQDY3hSvuTa4WxE5r5kdb4pMbGuNk0ZtsvPzM13Fg/Uz/v1QE6sJICvnDwIDhuIHdnBuFVfBxB7iZjZpFhKYxyd4TBcpyn8uRTcAN8bSkDVDQ5kLz5CwjJqrb5Pm5KHBiVUF3z50VsA3LE4LcP2xJIEDMFi7552MA6XfMyqjBWMZOrDbVzCgQuXuwDBtP142+N0c8r6nfe/PmD5ORQ26AASfrcH4h2LLtPz3o2XhRALL8N1iIvh4LC1dmy7vNPIPB+wTnrj/i7ZHO0Kk7RfhZZ1CqDocxo/NJhdHUdjjhR5sC75kf2c8unEKoMBFabU4WFrkasRqRuw/ZyjAuj/BIP2SPzghMZiiw5h3eCvt9TaocmeJW7LLAYpgeN+alDl1pLuXQ1gK473UKhoZ8tSh4uP+hIV5BDGZuGuMzfiySEadMNHzygYVFLOMBUmF/LNwvUzZRAkoL1NC+Q9ACoYjm/2BX0PxoEn6UFnezc93KOvvoAu3Y+a0GJoq2hnZhhBCu4N9aTthXYEoAt9+ZguKLvfbyO86Z62REzCyELch4Le5ZsgIo4/chRS56h0+VX+R2yzmV8ntBAPyYgkAOk1d3Y97K+n7FT0EOyp1Pj5ZTR0TlIOgfnl5YsC+9h1d2afF49QZ9PK5bKCmwAu71nsz4F2gykpJJbDRqWqShrWXmlk6M2myMVkhH5VkIxLdtHA+tkDmHJ6rfAKoWTnL7Qz2cKhH0yHReKqBBSCgng809d0THxfRqGGeTGLFKKfEcornDUp0A4ZPiz+vDItQPb/XcqxyM+YJ6rC8pUs9I5qv7OuvVrI8pKnVqh2M9tYHJOG9jKRmr646E8fV/J3QV1fvzzhapuTnWEvsB5QxZ78up2Ctw3LXCT/zZjGiacp65u5kA3LbMvN84LKPbkvvIRZ5TtPlITjO4fUpmcfSrukD/QqSJ7qWtzE+xmhEEELCybBjWBCXUHyZmR75B0aPUa93FM1h+z5VTfVTH9+Mlm4PDrHwnOWAcCb5PoPvkHBcbD7p/9JcQJpHaN8La/VWJE7JpI2vxASKiyRpKy98bJJ0ozBz0XcrxwS+Zf8kgGf339uZJYN2d6PcBV3bO/ZD15Gka4+n7tVQWrzDK5t5Xx7UQ+tM+iz6SJgCyMra5Mfuu2Brnw/hZHqWhx4D4JIBNQi620jW0ESc+m23O/5FBZcFOQHiwFINORbmcrJHHPd2PYS8PCT0CY0wQE5ZWWqtFKInkToAYJtxh+hgoGCPCtE8vC8KspHOLEYaiiGSPNbA4ud4I6UMvwHLAWLjqyHi+prHzq7YkuIpJMf59fEbOnUhhF0X+rCuVp8gI08/nrQnlDoLTFGBWjZKRS9F/48WsjTX5n6H4QUp6JW2ryS1+27s4NB0vqzZM4Yhomt438HsOTpug6Wxq/r4jgevS6v7sRVs60sa/X2Iiqf7IAaiSe2NqGn45/G6n4kiBMr5oq37o X-OriginatorOrg: synaptics.com X-MS-Exchange-CrossTenant-Network-Message-Id: afcdae9c-0125-40a2-7c2f-08db79477393 X-MS-Exchange-CrossTenant-AuthSource: DM6PR03MB5196.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2023 08:53:19.6547 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 335d1fbc-2124-4173-9863-17e7051a2a0e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QWymKhkMYUxBmTZFaw1xcrtZNRLsMLatVmFQeGIDz4Ggpvcx7Qn46WlH3BvsoA1FI9ukdqNRbAh0Omqi7lrbJw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR03MB6176 Subject: [FFmpeg-devel] [PATCH v2] avcodec/v4l2_m2m_dec: resolve resolution change X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: "Hsia-Jun\(Randy\) Li" , ayaka@soulik.info, jramirez@baylibre.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P8H36MAP0ZvK From: "Hsia-Jun(Randy) Li" It shouldn't allocate buffer nor get the capture fmt before the resolution change event appeared in decoder setup. And it should not apply to new resolution before the buffer from the previous sequence is dequeued. Changelog: v2 1. Decoder won't get or set format before dynamic resolution change event is received. 2. Decoder won't need order V4L2_DEC_CMD_START before STREAMON. 3. Decoder would reallocate buffer when either capture pixel fmt or image sizes changed. Change-Id: Id04550b0f17e1501b670a3bcbdd860d5836259bf Signed-off-by: Hsia-Jun(Randy) Li --- libavcodec/v4l2_context.c | 114 +++++++++++++++++++++++++++----------- libavcodec/v4l2_context.h | 6 ++ libavcodec/v4l2_m2m.c | 12 ++-- libavcodec/v4l2_m2m_dec.c | 14 +++-- 4 files changed, 102 insertions(+), 44 deletions(-) diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index a40be94690..d0f45b445e 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -81,15 +81,36 @@ static AVRational v4l2_get_sar(V4L2Context *ctx) return sar; } +static inline unsigned int v4l2_sizeimage_changed(struct v4l2_pix_format_mplane *fmt1, + struct v4l2_pix_format_mplane *fmt2) +{ + unsigned int i; + + if (fmt1->num_planes != fmt2->num_planes) + return 1; + + + for (i = 0; i < fmt2->num_planes; i++) { + if (fmt1->plane_fmt[i].sizeimage < fmt2->plane_fmt[i].sizeimage) + return 1; + } + + return 0; +} + static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2) { struct v4l2_format *fmt1 = &ctx->format; int ret = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? + fmt1->fmt.pix_mp.pixelformat != fmt2->fmt.pix_mp.pixelformat || fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width || - fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height + fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height || + v4l2_sizeimage_changed(&fmt1->fmt.pix_mp, &fmt2->fmt.pix_mp) : + fmt1->fmt.pix.pixelformat != fmt2->fmt.pix.pixelformat || fmt1->fmt.pix.width != fmt2->fmt.pix.width || - fmt1->fmt.pix.height != fmt2->fmt.pix.height; + fmt1->fmt.pix.height != fmt2->fmt.pix.height || + fmt1->fmt.pix.sizeimage != fmt2->fmt.pix.sizeimage; if (ret) av_log(logger(ctx), AV_LOG_DEBUG, "%s changed (%dx%d) -> (%dx%d)\n", @@ -169,30 +190,17 @@ static int v4l2_start_decode(V4L2Context *ctx) } /** - * handle resolution change event and end of stream event + * handle resolution change event * returns 1 if reinit was successful, negative if it failed * returns 0 if reinit was not executed */ -static int v4l2_handle_event(V4L2Context *ctx) +static int v4l2_handle_dyn_res_change(V4L2Context *ctx) { V4L2m2mContext *s = ctx_to_m2mctx(ctx); struct v4l2_format cap_fmt = s->capture.format; - struct v4l2_event evt = { 0 }; int ret; - ret = ioctl(s->fd, VIDIOC_DQEVENT, &evt); - if (ret < 0) { - av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_DQEVENT\n", ctx->name); - return 0; - } - - if (evt.type == V4L2_EVENT_EOS) { - ctx->done = 1; - return 0; - } - - if (evt.type != V4L2_EVENT_SOURCE_CHANGE) - return 0; + cap_fmt.type = s->capture.type; ret = ioctl(s->fd, VIDIOC_G_FMT, &cap_fmt); if (ret) { @@ -201,11 +209,13 @@ static int v4l2_handle_event(V4L2Context *ctx) } if (v4l2_resolution_changed(&s->capture, &cap_fmt)) { + s->capture.format.fmt.pix_mp.pixelformat = cap_fmt.fmt.pix_mp.pixelformat; s->capture.height = v4l2_get_height(&cap_fmt); s->capture.width = v4l2_get_width(&cap_fmt); s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); } else { v4l2_start_decode(ctx); + ctx->pending_res_change = 0; return 0; } @@ -222,10 +232,41 @@ static int v4l2_handle_event(V4L2Context *ctx) return AVERROR(EINVAL); } + ctx->pending_res_change = 0; /* reinit executed */ return 1; } +/** + * capture resolution change event and end of stream event + * returns 1 or negative if it failed + * returns 0 if nothing went wrong + */ +static int v4l2_handle_event(V4L2Context *ctx) +{ + V4L2m2mContext *s = ctx_to_m2mctx(ctx); + struct v4l2_event evt = { 0 }; + int ret; + + ret = ioctl(s->fd, VIDIOC_DQEVENT, &evt); + if (ret < 0) { + av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_DQEVENT\n", ctx->name); + return errno; + } + + if (evt.type == V4L2_EVENT_EOS) { + ctx->done = 1; + return 0; + } + + if (evt.type != V4L2_EVENT_SOURCE_CHANGE) + return AVERROR(EINVAL); + + ctx->pending_res_change = 1; + + return 0; +} + static int v4l2_stop_decode(V4L2Context *ctx) { struct v4l2_decoder_cmd cmd = { @@ -342,16 +383,19 @@ start: /* 1. handle resolution changes */ if (pfd.revents & POLLPRI) { ret = v4l2_handle_event(ctx); - if (ret < 0) { - /* if re-init failed, abort */ - ctx->done = 1; - return NULL; - } if (ret) { - /* if re-init was successful drop the buffer (if there was one) - * since we had to reconfigure capture (unmap all buffers) - */ + /* if event handler failed, abort */ + ctx->done = 1; return NULL; + } else if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { + if (!ctx->streamon) + ret = v4l2_handle_dyn_res_change(ctx); + if (ret == 1) + return NULL; + } else { + /* Poll the device again, we want the buffer with the flag + * that answer to the event */ + return v4l2_dequeue_v4l2buf(ctx, timeout); } } @@ -391,17 +435,23 @@ dequeue: return NULL; } - if (ctx_to_m2mctx(ctx)->draining && !V4L2_TYPE_IS_OUTPUT(ctx->type)) { + if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ? buf.m.planes[0].bytesused : buf.bytesused; + +#ifdef V4L2_BUF_FLAG_LAST + if (buf.flags & V4L2_BUF_FLAG_LAST) { + if (ctx_to_m2mctx(ctx)->draining) + ctx->done = 1; + if (ctx->pending_res_change) + ret = v4l2_handle_dyn_res_change(ctx); + } +#endif if (bytesused == 0) { - ctx->done = 1; + if (ctx_to_m2mctx(ctx)->draining) + ctx->done = 1; return NULL; } -#ifdef V4L2_BUF_FLAG_LAST - if (buf.flags & V4L2_BUF_FLAG_LAST) - ctx->done = 1; -#endif } avbuf = &ctx->buffers[buf.index]; diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h index 6f7460c89a..b30457c5ad 100644 --- a/libavcodec/v4l2_context.h +++ b/libavcodec/v4l2_context.h @@ -87,6 +87,12 @@ typedef struct V4L2Context { */ int streamon; + /** + * Pending resolution change event to handle. Only context for CAPTURE + * queue could set this flag. + */ + int pending_res_change; + /** * Either no more buffers available or an unrecoverable error was notified * by the V4L2 kernel driver: once set the context has to be exited. diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index 602efb7a16..9530898315 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -164,12 +164,6 @@ static int v4l2_configure_contexts(V4L2m2mContext *s) goto error; } - ret = ff_v4l2_context_set_format(&s->capture); - if (ret) { - av_log(log_ctx, AV_LOG_ERROR, "can't to set v4l2 capture format\n"); - goto error; - } - ret = ff_v4l2_context_init(&s->output); if (ret) { av_log(log_ctx, AV_LOG_ERROR, "no v4l2 output context's buffers\n"); @@ -178,6 +172,12 @@ static int v4l2_configure_contexts(V4L2m2mContext *s) /* decoder's buffers need to be updated at a later stage */ if (s->avctx && !av_codec_is_decoder(s->avctx->codec)) { + ret = ff_v4l2_context_set_format(&s->capture); + if (ret) { + av_log(log_ctx, AV_LOG_ERROR, "can't to set v4l2 capture format\n"); + goto error; + } + ret = ff_v4l2_context_init(&s->capture); if (ret) { av_log(log_ctx, AV_LOG_ERROR, "no v4l2 capture context's buffers\n"); diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index 4944d08511..3c38fde700 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -40,6 +40,7 @@ static int v4l2_try_start(AVCodecContext *avctx) V4L2Context *const capture = &s->capture; V4L2Context *const output = &s->output; struct v4l2_selection selection = { 0 }; + AVFrame frame; int ret; /* 1. start the output process */ @@ -54,15 +55,16 @@ static int v4l2_try_start(AVCodecContext *avctx) if (capture->streamon) return 0; - /* 2. get the capture format */ - capture->format.type = capture->type; - ret = ioctl(s->fd, VIDIOC_G_FMT, &capture->format); + /* TODO wait event here */ + ret = ff_v4l2_context_dequeue_frame(capture, &frame, 10); if (ret) { - av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_FMT ioctl\n"); - return ret; + if (ret == AVERROR(EAGAIN)) + ret = 0; + else + return ret; } - /* 2.1 update the AVCodecContext */ + /* 2 update the AVCodecContext */ avctx->pix_fmt = ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); capture->av_pix_fmt = avctx->pix_fmt;