[COMMON] media: mfc: add the RES_CHANGE_INIT state to wait SEQ_DONE
authorSunyoung Kang <sy0816.kang@samsung.com>
Sun, 17 Feb 2019 08:50:50 +0000 (17:50 +0900)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:45:40 +0000 (23:45 +0900)
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 <sy0816.kang@samsung.com>
drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c
drivers/media/platform/exynos/mfc/mfc_dec_vb2.c
drivers/media/platform/exynos/mfc/mfc_hwlock.c

index 727ff581f6f2e35a53fd145796f50243a4609f1a..3e7a596099b607000ae5bcc9fa371dc07936236d 100644 (file)
@@ -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();
index 215496c52108c272f5d1ea55b203db97a8df319f..6d2c4ecf44970b8e61958fddbb4fcb32347f38ca 100644 (file)
@@ -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);
        }
 }
 
index 6e7ebd5a0d5764009037b03be41ab8b0321d8b04..e888ea7b50b5c3af1d0b89085270cb480ddf0ba0 100644 (file)
@@ -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: