From patchwork Fri Oct 2 14:31:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean-Michel Hautbois X-Patchwork-Id: 31560 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1Zi1N3-00085p-V4; Fri, 02 Oct 2015 16:31:37 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.76/mailfrontend-5) with esmtp id 1Zi1N1-0008JF-8N; Fri, 02 Oct 2015 16:31:37 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752068AbbJBObd (ORCPT + 1 other); Fri, 2 Oct 2015 10:31:33 -0400 Received: from mail-oi0-f50.google.com ([209.85.218.50]:36137 "EHLO mail-oi0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751800AbbJBObc (ORCPT ); Fri, 2 Oct 2015 10:31:32 -0400 Received: by oibi136 with SMTP id i136so58792436oib.3 for ; Fri, 02 Oct 2015 07:31:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc :content-type; bh=XefYtCn0/SYnGJXcoZegp6zjqD5OJWwrJYHhwi2Q6Qc=; b=hv4dLL/iTqmeT190+L7iRl1sFcL+UlfDHH5CjfylD3T9gnGexZPr/B36tAE4ZAffrb 19FlmzB4NXES/Bsc5vlw/Ew6hwMRxFQuuuOMOLeZaPpCKBxYHINXcOaLeTHjpH9Ea3lT WmnDgqkoeP8tu/03sBljBD4cfLHd0DEHPOq3OgjH/LiHe0vvWkkCcpQfxbMMPSEpQBED UeFNjRMz3NFl9qIsjK7XI0i4f83oKwUZGbBkVmcPZA81+PcfPVMW7/fEIbBmxZU0HTio zbKzZuZyulWUUYw37xit1YnS5v8fHen1/6H9d198Xnolh4BOBIR6NCYv6ysoNS8lY4SZ 5SZg== X-Gm-Message-State: ALoCoQk4vwkPPqQd24whU+WOakZTjLD2RQ8CaWUd4MevMtLVbDOzfEFi8h3yzfRlkzbmN2WB9C7u X-Received: by 10.202.46.207 with SMTP id u198mr8285862oiu.66.1443796292242; Fri, 02 Oct 2015 07:31:32 -0700 (PDT) MIME-Version: 1.0 Received: by 10.202.171.10 with HTTP; Fri, 2 Oct 2015 07:31:12 -0700 (PDT) From: Jean-Michel Hautbois Date: Fri, 2 Oct 2015 16:31:12 +0200 Message-ID: Subject: Coda encoder stop To: Philipp Zabel Cc: Linux Media Mailing List Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2015.10.2.142416 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' HTML_00_01 0.05, HTML_00_10 0.05, MSGID_ADDED_BY_MTA 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, CT_TEXT_PLAIN_UTF8_CAPS 0, URI_ENDS_IN_HTML 0, WEBMAIL_SOURCE 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CT_TEXT_PLAIN 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILING_LIST 0, __HTTPS_URI 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __MULTIPLE_URI_TEXT 0, __PHISH_SPEAR_HTTP_RECEIVED 0, __PHISH_SPEAR_STRUCTURE_1 0, __PHISH_SPEAR_STRUCTURE_2 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __URI_IN_BODY 0, __URI_NO_WWW 0, __URI_NS , __YOUTUBE_RCVD 0' Hi Philipp, I have tried to implement V4L2_ENC_CMD_STOP command in coda encoder but can't make it work with gstreamer (I have modified my gst element to use the correct command, based on your work on bug https://bugzilla.gnome.org/show_bug.cgi?id=733864). Here is what I have tried : From 1dd2f797b2b368d44c1a1bd992379c252e1b57e1 Mon Sep 17 00:00:00 2001 From: Jean-Michel Hautbois Date: Fri, 2 Oct 2015 11:18:27 +0200 Subject: [PATCH] coda: Add support for [try]encoder_cmd ioctl This allows userspace to ask for the encoder to stop. When last buffer is received it sends a EOS event. Signed-off-by: Jean-Michel Hautbois --- drivers/media/platform/coda/coda-common.c | 58 ++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 5 deletions(-) v4l2_event_queue_fh(&ctx->fh, &eos_event); @@ -791,6 +803,40 @@ static int coda_decoder_cmd(struct file *file, void *fh, return 0; } +static int coda_try_encoder_cmd(struct file *file, void *fh, + struct v4l2_encoder_cmd *ec) +{ + if (ec->cmd != V4L2_ENC_CMD_STOP) + return -EINVAL; + + if (ec->flags & V4L2_ENC_CMD_STOP_AT_GOP_END) + return -EINVAL; + + return 0; +} + +static int coda_encoder_cmd(struct file *file, void *fh, + struct v4l2_encoder_cmd *ec) +{ + struct coda_ctx *ctx = fh_to_ctx(fh); + int ret; + + ret = coda_try_encoder_cmd(file, fh, ec); + if (ret < 0) + return ret; + + /* Ignore encoder stop command silently in decoder context */ + if (ctx->inst_type != CODA_INST_ENCODER) + return 0; + + /* Set the stream-end flag on this context */ + coda_bit_stream_end_flag(ctx); + ctx->hold = false; + v4l2_m2m_try_schedule(ctx->fh.m2m_ctx); + + return 0; +} + static int coda_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a) { struct coda_ctx *ctx = fh_to_ctx(fh); @@ -928,6 +974,8 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = { .vidioc_try_decoder_cmd = coda_try_decoder_cmd, .vidioc_decoder_cmd = coda_decoder_cmd, + .vidioc_try_encoder_cmd = coda_try_encoder_cmd, + .vidioc_encoder_cmd = coda_encoder_cmd, .vidioc_g_parm = coda_g_parm, .vidioc_s_parm = coda_s_parm, diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index a4654e0..7dd7bd9 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c @@ -686,12 +686,23 @@ static int coda_qbuf(struct file *file, void *priv, static bool coda_buf_is_end_of_stream(struct coda_ctx *ctx, struct vb2_buffer *buf) { - struct vb2_queue *src_vq; - - src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); + int ret = false; - return ((ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG) && - (buf->v4l2_buf.sequence == (ctx->qsequence - 1))); + if (ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG) { + switch (ctx->inst_type) { + case CODA_INST_DECODER: + if (buf->v4l2_buf.sequence == (ctx->qsequence - 1)) + ret = true; + break; + case CODA_INST_ENCODER: + if (buf->v4l2_buf.sequence == (ctx->osequence - 1)) + ret = true; + break; + default: + break; + } + } + return ret; } void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_buffer *buf, @@ -702,6 +713,7 @@ void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_buffer *buf, }; if (coda_buf_is_end_of_stream(ctx, buf)) { + v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, "send EOS"); buf->v4l2_buf.flags |= V4L2_BUF_FLAG_LAST;