From: Sunyoung Kang Date: Tue, 23 Oct 2018 09:23:23 +0000 (+0900) Subject: [RAMEN9610-10029][COMMON] media: mfc: fix the WAIT state for decoder DRC X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=7b659a3facfc2fc72391d25f48f2dbbe48535db2;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git [RAMEN9610-10029][COMMON] media: mfc: fix the WAIT state for decoder DRC In case of UTC, it calls g_fmt after streamoff so can't out from WAIT_DPB_FLUSH state. This modified that it can wait both g_fmt and streamoff regardless of the order. When DRC is detected the wait_state set to (WAIT_G_FMT | WAIT_STOP). If the g_fmt is called WAIT_G_FMT is cleared and if the streamoff is called WAIT_STOP is cleared. Change-Id: I90326d191de2ba164060673e8b124227fda3a397 Signed-off-by: Sunyoung Kang --- diff --git a/drivers/media/platform/exynos/mfc/mfc_data_struct.h b/drivers/media/platform/exynos/mfc/mfc_data_struct.h index bda4b0556eaa..5a2b015d7c80 100644 --- a/drivers/media/platform/exynos/mfc/mfc_data_struct.h +++ b/drivers/media/platform/exynos/mfc/mfc_data_struct.h @@ -130,9 +130,9 @@ enum mfc_queue_state { }; enum mfc_dec_wait_state { - WAIT_NONE = 0, - WAIT_DECODING, - WAIT_DPB_FLUSH, + WAIT_NONE = 0, + WAIT_G_FMT = (1 << 0), + WAIT_STOP = (1 << 1), }; /** diff --git a/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c b/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c index 785de4bcbbf1..727ff581f6f2 100644 --- a/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c +++ b/drivers/media/platform/exynos/mfc/mfc_dec_v4l2.c @@ -285,7 +285,7 @@ static int mfc_dec_g_fmt_vid_cap_mplane(struct file *file, void *priv, 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 */ - if ((ctx->wait_state == WAIT_DECODING) && + if (((ctx->wait_state & WAIT_G_FMT) != 0) && mfc_is_queue_count_same(&ctx->buf_queue_lock, &ctx->src_buf_queue, 0)) { mfc_err_dev("There is no source buffer to parsing, keep previous resolution\n"); return -EAGAIN; @@ -357,9 +357,9 @@ static int mfc_dec_g_fmt_vid_cap_mplane(struct file *file, void *priv, } } - if (ctx->wait_state == WAIT_DECODING) { - ctx->wait_state = WAIT_DPB_FLUSH; - mfc_debug(2, "wait DPB flush for decoding(INIT_BUFFER)\n"); + 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_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 bcc8a2629e3d..215496c52108 100644 --- a/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c +++ b/drivers/media/platform/exynos/mfc/mfc_dec_vb2.c @@ -365,9 +365,9 @@ static void __mfc_dec_dst_stop_streaming(struct mfc_ctx *ctx) index++; } - if (ctx->wait_state == WAIT_DPB_FLUSH) { - ctx->wait_state = WAIT_NONE; - mfc_debug(2, "Decoding(INIT_BUFFER) can be started now\n"); + if (ctx->wait_state & WAIT_STOP) { + ctx->wait_state &= ~(WAIT_STOP); + mfc_debug(2, "clear WAIT_STOP %d\n", ctx->wait_state); } } diff --git a/drivers/media/platform/exynos/mfc/mfc_isr.c b/drivers/media/platform/exynos/mfc/mfc_isr.c index ba32eb746b45..f2edb8449392 100644 --- a/drivers/media/platform/exynos/mfc/mfc_isr.c +++ b/drivers/media/platform/exynos/mfc/mfc_isr.c @@ -643,7 +643,7 @@ static void __mfc_handle_frame(struct mfc_ctx *ctx, if (res_change) { mfc_debug(2, "[DRC] Resolution change set to %d\n", res_change); mfc_change_state(ctx, MFCINST_RES_CHANGE_INIT); - ctx->wait_state = WAIT_DECODING; + ctx->wait_state = WAIT_G_FMT | WAIT_STOP; mfc_debug(2, "[DRC] Decoding waiting! : %d\n", ctx->wait_state); return; } @@ -667,7 +667,7 @@ static void __mfc_handle_frame(struct mfc_ctx *ctx, ctx->is_dpb_realloc = 1; mfc_change_state(ctx, MFCINST_HEAD_PARSED); ctx->capture_state = QUEUE_FREE; - ctx->wait_state = WAIT_DECODING; + ctx->wait_state = WAIT_STOP; __mfc_handle_frame_all_extracted(ctx); goto leave_handle_frame; } diff --git a/drivers/media/platform/exynos/mfc/mfc_nal_q.c b/drivers/media/platform/exynos/mfc/mfc_nal_q.c index e3889948e956..987ab982033d 100644 --- a/drivers/media/platform/exynos/mfc/mfc_nal_q.c +++ b/drivers/media/platform/exynos/mfc/mfc_nal_q.c @@ -1652,7 +1652,7 @@ void __mfc_nal_q_handle_frame(struct mfc_ctx *ctx, DecoderOutputStr *pOutStr) if (res_change) { mfc_debug(2, "[NALQ][DRC] Resolution change set to %d\n", res_change); mfc_change_state(ctx, MFCINST_RES_CHANGE_INIT); - ctx->wait_state = WAIT_DECODING; + ctx->wait_state = WAIT_G_FMT | WAIT_STOP; dev->nal_q_handle->nal_q_exception = 1; mfc_info_ctx("[NALQ][DRC] nal_q_exception is set (res change)\n"); goto leave_handle_frame;