Project import generated by Copybara.

GitOrigin-RevId: e1a295800b4c012273cda8d4fdcda2c9a12ac4f1
diff --git a/drivers/amvdec_ports/aml_vcodec_dec.c b/drivers/amvdec_ports/aml_vcodec_dec.c
index 2bbfb6e..f40d3fd 100644
--- a/drivers/amvdec_ports/aml_vcodec_dec.c
+++ b/drivers/amvdec_ports/aml_vcodec_dec.c
@@ -1935,7 +1935,8 @@
 			if (ctx->vpp_cfg.fmt == 0)
 				ctx->vpp_cfg.fmt = ctx->cap_pix_fmt;
 
-			if (ctx->vpp == NULL)
+			if (ctx->vpp == NULL &&
+				vdec_get_instance_num() <= max_di_instance)
 				aml_wait_resource(ctx);
 
 			if ((atomic_read(&ctx->dev->vpp_count) < max_di_instance) ||
@@ -3336,6 +3337,20 @@
 	}
 }
 
+void aml_v4l_vpp_release_early(struct aml_vcodec_ctx * ctx)
+{
+	if (ctx->vpp && !(ctx->vpp_cfg.enable_nr &&
+		atomic_read(&ctx->vpp->local_buf_out))) {
+		aml_v4l2_vpp_destroy(ctx->vpp);
+		atomic_dec(&ctx->dev->vpp_count);
+		ctx->vpp = NULL;
+
+		v4l_dbg(ctx, V4L_DEBUG_CODEC_PRINFO,
+			"vpp destroy inst count:%d.\n",
+			atomic_read(&ctx->dev->vpp_count));
+	}
+}
+
 void aml_v4l_ctx_release(struct kref *kref)
 {
 	struct aml_vcodec_ctx * ctx;
@@ -3345,6 +3360,7 @@
 	if (ctx->vpp) {
 		atomic_dec(&ctx->dev->vpp_count);
 		aml_v4l2_vpp_destroy(ctx->vpp);
+		ctx->vpp = NULL;
 
 		v4l_dbg(ctx, V4L_DEBUG_CODEC_PRINFO,
 			"vpp destory inst count:%d.\n",
diff --git a/drivers/amvdec_ports/aml_vcodec_dec.h b/drivers/amvdec_ports/aml_vcodec_dec.h
index a23522c..649c977 100644
--- a/drivers/amvdec_ports/aml_vcodec_dec.h
+++ b/drivers/amvdec_ports/aml_vcodec_dec.h
@@ -134,6 +134,7 @@
 void vdec_frame_buffer_release(void *data);
 void aml_vdec_dispatch_event(struct aml_vcodec_ctx *ctx, u32 changes);
 void* v4l_get_vf_handle(int fd);
+void aml_v4l_vpp_release_early(struct aml_vcodec_ctx * ctx);
 void aml_v4l_ctx_release(struct kref *kref);
 void dmabuff_recycle_worker(struct work_struct *work);
 void aml_buffer_status(struct aml_vcodec_ctx *ctx);
diff --git a/drivers/amvdec_ports/aml_vcodec_dec_drv.c b/drivers/amvdec_ports/aml_vcodec_dec_drv.c
index 18f0254..f92f4a8 100644
--- a/drivers/amvdec_ports/aml_vcodec_dec_drv.c
+++ b/drivers/amvdec_ports/aml_vcodec_dec_drv.c
@@ -197,6 +197,7 @@
 	list_del_init(&ctx->list);
 
 	kfree(ctx->empty_flush_buf);
+	aml_v4l_vpp_release_early(ctx);
 	kref_put(&ctx->ctx_ref, aml_v4l_ctx_release);
 	mutex_unlock(&dev->dev_mutex);
 	return 0;
diff --git a/drivers/amvdec_ports/aml_vcodec_vpp.c b/drivers/amvdec_ports/aml_vcodec_vpp.c
index 9f4e960..5a86c1f 100644
--- a/drivers/amvdec_ports/aml_vcodec_vpp.c
+++ b/drivers/amvdec_ports/aml_vcodec_vpp.c
@@ -214,6 +214,7 @@
 		vpp_buf->di_local_buf = buf;
 		vpp_buf->di_buf.vf->vf_ext = buf->vf;
 		vpp_buf->di_buf.vf->flag |= VFRAME_FLAG_CONTAIN_POST_FRAME;
+		atomic_set(&vpp->local_buf_out, 1);
 	}
 
 	kfifo_put(&vpp->out_done_q, vpp_buf);
@@ -890,6 +891,7 @@
 	mutex_init(&vpp->output_lock);
 	sema_init(&vpp->sem_in, 0);
 	sema_init(&vpp->sem_out, 0);
+	atomic_set(&vpp->local_buf_out, 0);
 
 	vpp->running = true;
 	vpp->task = kthread_run(aml_v4l2_vpp_thread, vpp,
@@ -947,6 +949,7 @@
 {
 	v4l_dbg(vpp->ctx, V4L_DEBUG_VPP_DETAIL,
 		"vpp destroy begin\n");
+	atomic_set(&vpp->local_buf_out, 0);
 	vpp->running = false;
 	up(&vpp->sem_in);
 	up(&vpp->sem_out);
diff --git a/drivers/amvdec_ports/aml_vcodec_vpp.h b/drivers/amvdec_ports/aml_vcodec_vpp.h
index 7a5771d..27ffbe6 100644
--- a/drivers/amvdec_ports/aml_vcodec_vpp.h
+++ b/drivers/amvdec_ports/aml_vcodec_vpp.h
@@ -87,6 +87,7 @@
 	bool is_bypass_p;
 	int di_ibuf_num;
 	int di_obuf_num;
+	atomic_t local_buf_out;
 };
 
 struct task_ops_s *get_vpp_ops(void);
diff --git a/drivers/frame_provider/decoder_v4l/vav1/vav1.c b/drivers/frame_provider/decoder_v4l/vav1/vav1.c
old mode 100755
new mode 100644
index 132341b..b804bc5
--- a/drivers/frame_provider/decoder_v4l/vav1/vav1.c
+++ b/drivers/frame_provider/decoder_v4l/vav1/vav1.c
@@ -484,7 +484,7 @@
 static u32 dv_toggle_prov_name;
 #endif
 
-static u32 run_ready_min_buf_num = 2;
+static u32 run_ready_min_buf_num = 1;
 #ifdef DEBUG_CRC_ERROR
 /*
   bit[4] fill zero in header before starting