From patchwork Wed Apr 1 02:38:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ming Qian X-Patchwork-Id: 18560 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 DC84844B8D7 for ; Wed, 1 Apr 2020 05:39:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BCC9B68AFD5; Wed, 1 Apr 2020 05:39:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20066.outbound.protection.outlook.com [40.107.2.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D074A68AE8D for ; Wed, 1 Apr 2020 05:39:03 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=C9JNnyXMOGUQnnLC23z2V+gpowYAatMp6vG/Xs1mOPDg6ebpKNFFZ3mZzDDu44ZaEmvJErYPgPhFMvPBWN7u3pefi0gZNtJxkG6AfkXji1CNlfmYGjfPOTdARYVQftq697JaTuekFykCnxMB91dlsOwnC+6J0cyIXW6xyT/pjDhVB0hWP+ztFwz6c6YMC4grFIf+Hk+zb4yX8ikM2vq628S8r8rZruvpy4mee43RJ5CzPEL0wRDmrGa+YI7Q0zbCAzc6906BP9nCyC02parrAjlX+hEppsonJOdL4Wx9tjO22DBt+sF9NGJS8yfy8a3fn7yOakcLZq8C369RtmKfVA== 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-SenderADCheck; bh=IU2ZdWcN8fZNrR2D1o1vUCcnJCcu2Ed/FRFh46npmrY=; b=PKmjYnRuRy6o2eXlmH7BhFZ53uyuch4GwPLfYdi0CDSzuxVWNvyrVC43uppJ4LzuSx9hJqljp4I3fQqx/H92yQjEGcZqx+ru2Ut628ruju7W+66L/AjoNq2zKnSxdBkMCq6VGlTzfWesrJjthdAgBeBJ+lCKA4zCGCt8suftPQIvgaAYpIwb10rnpsUS37iwFhkC5RDjX3h5UAOQTNp8nzqQalj+8jph/c0Gzz3Losp1dSJDsoil4QRA8Z493mnraRSKar/j5tmUwyB/z1X1TiiZOP/Wen9pH71HCxyBTk4p1EtBA7K+d9YRxgQE+IJ+3/F+/KdUhi+TmOy+J8bbJg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IU2ZdWcN8fZNrR2D1o1vUCcnJCcu2Ed/FRFh46npmrY=; b=Y41Tvbz89LCS8Wh/2BbJdQAeMxWLaJ8/7TZLbm+I4o7/T5uRCrWlbqO18QE4Z19NRFpKagsJyDI0jf84OVrub21T/GZIHuRQrisBWaPjVjGRAyolHcriyikrfuZlY3pROmSP67QxEUtqjJyrBz64Y+OarrooC1LiYYMblsanT6g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ming.qian@nxp.com; Received: from VE1PR04MB6368.eurprd04.prod.outlook.com (20.179.232.146) by VE1PR04MB6431.eurprd04.prod.outlook.com (10.255.118.77) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2856.19; Wed, 1 Apr 2020 02:39:01 +0000 Received: from VE1PR04MB6368.eurprd04.prod.outlook.com ([fe80::c962:b871:9b:853]) by VE1PR04MB6368.eurprd04.prod.outlook.com ([fe80::c962:b871:9b:853%7]) with mapi id 15.20.2856.019; Wed, 1 Apr 2020 02:39:01 +0000 From: Ming Qian To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Apr 2020 10:38:45 +0800 Message-Id: <20200401023845.4861-1-ming.qian@nxp.com> X-Mailer: git-send-email 2.26.0 X-ClientProxiedBy: SG2PR0401CA0013.apcprd04.prod.outlook.com (2603:1096:3:1::23) To VE1PR04MB6368.eurprd04.prod.outlook.com (2603:10a6:803:11b::18) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from lsv11149.swis.cn-sha01.nxp.com (119.31.174.70) by SG2PR0401CA0013.apcprd04.prod.outlook.com (2603:1096:3:1::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2856.20 via Frontend Transport; Wed, 1 Apr 2020 02:39:00 +0000 X-Mailer: git-send-email 2.26.0 X-Originating-IP: [119.31.174.70] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 33dae770-deef-4475-fab8-08d7d5e5d602 X-MS-TrafficTypeDiagnostic: VE1PR04MB6431: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:751; X-Forefront-PRVS: 03607C04F0 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR04MB6368.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(10009020)(4636009)(346002)(39860400002)(376002)(396003)(366004)(136003)(86362001)(6916009)(66476007)(81156014)(316002)(4326008)(6486002)(8936002)(81166006)(66946007)(66556008)(478600001)(52116002)(7696005)(5660300002)(186003)(44832011)(8676002)(956004)(2616005)(6666004)(16526019)(36756003)(26005)(1076003)(2906002); DIR:OUT; SFP:1101; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CBwaLkY5nEhuPgqGSNneYlANNrw8iKsWEhZVaTwV/6wCGuqBYu0My0uaXUUps30wd67oLxE2fNrM2qXH/yFLLCcttppLZasn58z6arELWrKQGQHh3YmUvtATWtDd9voIQm0TWif8yHB+X/fqt76KP4CEcJuHiP0OYulPCYPEgo1NfiBxrkV7YK4uh/cAEe6dR31qgVR9vWZgJef/i51AA9muAi2hc5m8lu/jSO6NBAza8JHcMEoYaHITQxb0RjQ1C2g9aakDw3QRC2mGswPF0X5larlNWl3PAaMwb+dERkxZPqJIXMeo5M8uFB65Lu4w+nN4d98fxTHzDSp0lWDd/ofGHNXL0JEDnwnrWgiMH/Uf6KGcj/Sxylq6w11AI12+dwwb1kcRV/9x+w94OYz71GGaARLAP6PkUmhRgH+H4TD1I6B15wW5apMpP9XMoqqq X-MS-Exchange-AntiSpam-MessageData: lxsrTXu0ryafYbq4QN9gmNTqWU1kezLdo4VLIeUBjYW/ie3uddNSFlrAN7rLCOMfjKIGmq/7kDufoUtApGHZJDp/dovS1tvyhjP/yd56j+/kpjJC0B6N7sVgu0jmXnEV7Xz0cSjWYBwXvD8Jk+I7KA== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 33dae770-deef-4475-fab8-08d7d5e5d602 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Apr 2020 02:39:01.3089 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4sNg7lj7tnXHcHxyXDN/+qoharMCVbUvy81EtCkSHWDSe6r3t+Jg62c8Y8/P1hWm4eW7X2SfYhQrZ9t3yRfOWw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB6431 Subject: [FFmpeg-devel] [PATCH v4] avcodec/v4l2_m2m: handle the v4l2 eos event 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: xxjsqm@126.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" when the last frame of capture is dequeueed, driver may send this V4L2_EVENT_EOS event, If this event is received, then the capture buffers have been flushed and avcodec_receive_packet()/avcodec_receive_frame() can return AVERROR_EOF. Otherwise, the draining continues until all the capture buffers have been dequeued or VIDIOC_DQBUF ioctl returns an EPIPE error. Some devices may not support V4L2_EVENT_EOS. This is logged as a warning message and not treated as a fatal error during initialization. Without this patch imx8qm often hangs at the end of encoding/decoding when flushing the capture buffers Signed-off-by: Ming Qian --- libavcodec/v4l2_context.c | 6 ++++++ libavcodec/v4l2_m2m_dec.c | 8 ++++++++ libavcodec/v4l2_m2m_enc.c | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index 8110bbb555..6b1f65fe4c 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -154,6 +154,7 @@ static inline void v4l2_save_to_context(V4L2Context* ctx, struct v4l2_format_upd } /** + * handle resolution change event and end of stream event * returns 1 if reinit was successful, negative if it failed * returns 0 if reinit was not executed */ @@ -171,6 +172,11 @@ static int v4l2_handle_event(V4L2Context *ctx) return 0; } + if (evt.type == V4L2_EVENT_EOS) { + ctx->done = 1; + return 0; + } + if (evt.type != V4L2_EVENT_SOURCE_CHANGE) return 0; diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index d666edffe4..9989649784 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -123,6 +123,14 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) } } + memset(&sub, 0, sizeof(sub)); + sub.type = V4L2_EVENT_EOS; + ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, &sub); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, + "the v4l2 driver does not support end of stream VIDIOC_SUBSCRIBE_EVENT\n"); + } + return 0; } diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index 84de63ec9d..78cf9ba47a 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -155,6 +155,23 @@ static int v4l2_check_b_frame_support(V4L2m2mContext *s) return AVERROR_PATCHWELCOME; } +static int v4l2_subscribe_eos_event(V4L2m2mContext *s) +{ + struct v4l2_event_subscription sub; + int ret; + + memset(&sub, 0, sizeof(sub)); + sub.type = V4L2_EVENT_EOS; + ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, &sub); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, + "the v4l2 driver does not support end of stream VIDIOC_SUBSCRIBE_EVENT\n"); + return ret; + } + + return 0; +} + static int v4l2_prepare_encoder(V4L2m2mContext *s) { AVCodecContext *avctx = s->avctx; @@ -164,6 +181,8 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) /** * requirements */ + v4l2_subscribe_eos_event(s); + ret = v4l2_check_b_frame_support(s); if (ret) return ret;