sizeof(share_info->h264_slice_params));
 
        fb = ctx->dev->vdec_pdata->get_cap_buffer(ctx);
-       y_fb_dma = fb ? (u64)fb->base_y.dma_addr : 0;
-       vdec_fb_va = (unsigned long)fb;
+       if (!fb) {
+               err = -EBUSY;
+               mtk_vcodec_err(inst, "fb buffer is NULL");
+               goto vdec_dec_end;
+       }
 
+       vdec_fb_va = (unsigned long)fb;
+       y_fb_dma = (u64)fb->base_y.dma_addr;
        if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
                c_fb_dma =
                        y_fb_dma + inst->ctx->picinfo.buf_w * inst->ctx->picinfo.buf_h;
        else
-               c_fb_dma = fb ? (u64)fb->base_c.dma_addr : 0;
+               c_fb_dma = (u64)fb->base_c.dma_addr;
 
        mtk_vcodec_debug(inst, "[h264-core] y/c addr = 0x%llx 0x%llx", y_fb_dma,
                         c_fb_dma);
        err = vpu_dec_start(vpu, data, 2);
        if (err) {
                mtk_vcodec_debug(inst, "lat decode err: %d", err);
-               goto err_scp_decode;
+               goto err_free_fb_out;
        }
 
        share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
        /* wait decoder done interrupt */
        timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
                                               WAIT_INTR_TIMEOUT_MS, MTK_VDEC_LAT0);
+       if (timeout)
+               mtk_vcodec_err(inst, "lat decode timeout: pic_%d", inst->slice_dec_num);
        inst->vsi->dec.timeout = !!timeout;
 
        err = vpu_dec_end(vpu);
-       if (err == SLICE_HEADER_FULL || timeout || err == TRANS_BUFFER_FULL) {
-               err = -EINVAL;
-               goto err_scp_decode;
+       if (err == SLICE_HEADER_FULL || err == TRANS_BUFFER_FULL) {
+               if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability))
+                       vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
+               inst->slice_dec_num++;
+               mtk_vcodec_err(inst, "lat dec fail: pic_%d err:%d", inst->slice_dec_num, err);
+               return -EINVAL;
        }
 
        share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
 
        inst->slice_dec_num++;
        return 0;
-
-err_scp_decode:
-       if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability))
-               vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
 err_free_fb_out:
        vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
        mtk_vcodec_err(inst, "slice dec number: %d err: %d", inst->slice_dec_num, err);