From 8e8a8990bf72de08a3c8fa1409f51f1fd9cd93a4 Mon Sep 17 00:00:00 2001 From: Sunyoung Kang Date: Sun, 17 Feb 2019 17:50:50 +0900 Subject: [PATCH] [COMMON] media: mfc: add the RES_CHANGE_INIT state to wait SEQ_DONE In case of DRC, if the g_fmt is called right after RES_CHANGE_INIT it doesn't wait SEQ_DONE. And then the updated resolution is not applied to dpb size. So this adds the RES_CHANGE_INIT state to condition for waiting SEQ_DONE. Change-Id: If4ab14548db14cdb818f9393c043c4d2220bafe4 Signed-off-by: Sunyoung Kang --- drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c | 5 +++++ drivers/media/platform/exynos/mfc/mfc_dec_vb2.c | 2 ++ drivers/media/platform/exynos/mfc/mfc_hwlock.c | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c b/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c index 727ff581f6f2..3e7a596099b6 100644 --- a/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c +++ b/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c @@ -273,6 +273,7 @@ static int mfc_dec_g_fmt_vid_cap_mplane(struct file *file, void *priv, { struct mfc_ctx *ctx = fh_to_mfc_ctx(file->private_data); struct mfc_dec *dec = ctx->dec_priv; + struct mfc_dev *dev = ctx->dev; struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp; struct mfc_raw_info *raw; int i; @@ -280,8 +281,11 @@ static int mfc_dec_g_fmt_vid_cap_mplane(struct file *file, void *priv, mfc_debug_enter(); mfc_debug(2, "dec dst g_fmt, state: %d\n", ctx->state); + MFC_TRACE_CTX("** DEC g_fmt(state:%d wait_state:%d)\n", + ctx->state, ctx->wait_state); if (ctx->state == MFCINST_GOT_INST || + ctx->state == MFCINST_RES_CHANGE_INIT || ctx->state == MFCINST_RES_CHANGE_FLUSH || ctx->state == MFCINST_RES_CHANGE_END) { /* If there is no source buffer to parsing, we can't SEQ_START */ @@ -360,6 +364,7 @@ static int mfc_dec_g_fmt_vid_cap_mplane(struct file *file, void *priv, if ((ctx->wait_state & WAIT_G_FMT) != 0) { ctx->wait_state &= ~(WAIT_G_FMT); mfc_debug(2, "clear WAIT_G_FMT %d\n", ctx->wait_state); + MFC_TRACE_CTX("** DEC clear WAIT_G_FMT(wait_state %d)\n", ctx->wait_state); } mfc_debug_leave(); diff --git a/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c b/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c index 215496c52108..6d2c4ecf4497 100644 --- a/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c +++ b/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c @@ -339,6 +339,7 @@ static void __mfc_dec_src_stop_streaming(struct mfc_ctx *ctx) static void __mfc_dec_dst_stop_streaming(struct mfc_ctx *ctx) { struct mfc_dec *dec = ctx->dec_priv; + struct mfc_dev *dev = ctx->dev; int index = 0; mfc_cleanup_assigned_fd(ctx); @@ -368,6 +369,7 @@ static void __mfc_dec_dst_stop_streaming(struct mfc_ctx *ctx) if (ctx->wait_state & WAIT_STOP) { ctx->wait_state &= ~(WAIT_STOP); mfc_debug(2, "clear WAIT_STOP %d\n", ctx->wait_state); + MFC_TRACE_CTX("** DEC clear WAIT_STOP(wait_state %d)\n", ctx->wait_state); } } diff --git a/drivers/media/platform/exynos/mfc/mfc_hwlock.c b/drivers/media/platform/exynos/mfc/mfc_hwlock.c index 6e7ebd5a0d57..e888ea7b50b5 100644 --- a/drivers/media/platform/exynos/mfc/mfc_hwlock.c +++ b/drivers/media/platform/exynos/mfc/mfc_hwlock.c @@ -590,6 +590,11 @@ static int __mfc_just_run_dec(struct mfc_ctx *ctx) ret = -EAGAIN; break; } + if (ctx->wait_state != WAIT_NONE) { + mfc_err_ctx("wait_state(%d) is not ready\n", ctx->wait_state); + ret = -EAGAIN; + break; + } ret = mfc_cmd_dec_init_buffers(ctx); break; case MFCINST_RES_CHANGE_INIT: -- 2.20.1