dp: check if buf_mgr is changed when set frame. [1/3]
PD#SWPL-195524
Problem:
dp does not drop the last interlace frame
Solution:
check if buf_mgr is changed when set frame
Verify:
SC2/T6d
Change-Id: I7f87183af13654704ab66aac7111ad2a7382d698
Signed-off-by: zhenteng.tian <zhenteng.tian@amlogic.com>
diff --git a/drivers/media/video_processor/di_process/di_proc_buf_mgr.c b/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
index 2953877..ee93f57 100644
--- a/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
+++ b/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
@@ -1068,9 +1068,8 @@
return 0;
}
-static struct dp_buf_mgr_t *get_di_mgr_data(struct file *file)
+struct dp_buf_mgr_t *get_buf_mgr(struct file *file)
{
- struct uvm_hook_mod *uhmod;
struct uvm_di_mgr_t *uvm_di_mgr = NULL;
if (!file) {
@@ -1078,20 +1077,12 @@
return NULL;
}
- uhmod = uvm_get_hook_mod((struct dma_buf *)(file->private_data), PROCESS_DI_MGR);
- if (!uhmod) {
- pr_err("%s fail uhmod is NULL\n", __func__);
+ uvm_di_mgr = get_uvm_di_mgr(file);
+ if (!uvm_di_mgr) {
+ pr_err("%s: get uvm_di_mgr failed.\n", __func__);
return NULL;
}
- if (IS_ERR_VALUE(uhmod) || !uhmod->arg) {
- pr_err("%s fail file_private_data is NULL\n", __func__);
- return NULL;
- }
- uvm_di_mgr = uhmod->arg;
- uvm_put_hook_mod((struct dma_buf *)(file->private_data),
- PROCESS_DI_MGR);
-
return uvm_di_mgr->buf_mgr;
}
@@ -1112,7 +1103,7 @@
struct dp_buf_mgr_t *buf_mgr = NULL;
int need_dec_two = false;
- buf_mgr = get_di_mgr_data(file);
+ buf_mgr = get_buf_mgr(file);
if (!buf_mgr) {
pr_err("%s get buf_mgr fail\n", __func__);
return -1;
@@ -1203,7 +1194,7 @@
*file_1 = NULL;
*file_2 = NULL;
- buf_mgr = get_di_mgr_data(file);
+ buf_mgr = get_buf_mgr(file);
if (!buf_mgr) {
pr_err("%s get buf_mgr fail\n", __func__);
return -1;
@@ -1295,7 +1286,7 @@
struct vframe_s *vf = NULL;
struct vf_ref_t *vf_ref = NULL;
- buf_mgr = get_di_mgr_data(file);
+ buf_mgr = get_buf_mgr(file);
if (!buf_mgr) {
pr_err("%s get buf_mgr fail\n", __func__);
return -1;
diff --git a/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h b/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
index 1877f37..0b64b50 100644
--- a/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
+++ b/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
@@ -35,3 +35,4 @@
void buf_mgr_file_lock(struct uvm_di_mgr_t *uvm_di_mgr);
void buf_mgr_file_unlock(struct uvm_di_mgr_t *uvm_di_mgr);
int update_di_process_state(struct file *file);
+struct dp_buf_mgr_t *get_buf_mgr(struct file *file);
diff --git a/drivers/media/video_processor/di_process/di_process.c b/drivers/media/video_processor/di_process/di_process.c
index bcba3d6..54cf9d4 100644
--- a/drivers/media/video_processor/di_process/di_process.c
+++ b/drivers/media/video_processor/di_process/di_process.c
@@ -1236,6 +1236,7 @@
dev->q_dummy_frame_done = false;
dev->last_frame_bypass = false;
dev->cur_is_i = false;
+ dev->last_buf_mgr = NULL;
receive_q_init(dev);
di_input_free_q_init(dev);
@@ -1431,6 +1432,8 @@
u32 max_width_new = 0, max_width_last = 0;
bool ip_switch = false, tvp_switch = false;
bool need_do_dummy = false;
+ struct dp_buf_mgr_t *cur_buf_mgr;
+ int ret = 0;
if (!dev || !frame_info) {
pr_err("%s: param is invalid.\n", __func__);
@@ -1466,6 +1469,19 @@
__func__, kfifo_len(&dev->receive_q), frame_info->in_fd, vf->frame_index,
file_vf, file_count(file_vf));
+ cur_buf_mgr = get_buf_mgr(file_vf);
+ if (!dev->last_buf_mgr) {
+ dev->last_buf_mgr = cur_buf_mgr;
+ dp_print(dev->index, PRINT_OTHER,
+ "%s: new stream is on, first frame is set\n",
+ __func__);
+ } else if (cur_buf_mgr != dev->last_buf_mgr) {
+ dev->last_buf_mgr = cur_buf_mgr;
+ dp_print(dev->index, PRINT_OTHER,
+ "%s: stream changed, need notify processor\n",
+ __func__);
+ ret = 3;
+ }
if ((vf->type & VIDTYPE_COMPRESS) &&
di_rotate[dev->index] != frame_info->transform) {
switch (frame_info->transform) {
@@ -1495,7 +1511,7 @@
dev->last_file = file_vf;
dp_put_file(dev, file_vf);
- return 0;
+ return ret;
}
/*vf need check tvp switch*/
@@ -1755,7 +1771,7 @@
dev->last_dmabuf = dmabuf;
dev->last_frame_bypass = false;
- return 0;
+ return ret;
}
static int di_process_q_output(struct di_process_dev *dev, u32 fd)
@@ -1878,16 +1894,13 @@
ret = di_process_uninit(dev);
break;
case DI_PROCESS_IOCTL_SET_FRAME:
- if (copy_from_user(&frame_info, argp,
- sizeof(frame_info)) == 0) {
- ret = di_process_set_frame(dev, &frame_info);
- if (ret != 0)
- return ret;
- ret = copy_to_user(argp, &frame_info,
- sizeof(struct frame_info_t));
- } else {
- ret = -EFAULT;
- }
+ if (copy_from_user(&frame_info, argp, sizeof(frame_info)) != 0)
+ return -EFAULT;
+ ret = di_process_set_frame(dev, &frame_info);
+ if (ret != 0 && ret != 3)
+ return ret;
+ if (copy_to_user(argp, &frame_info, sizeof(struct frame_info_t)) != 0)
+ return -EFAULT;
break;
case DI_PROCESS_IOCTL_Q_OUTPUT:
if (copy_from_user(&fd, argp, sizeof(u32)) == 0)
diff --git a/drivers/media/video_processor/di_process/di_process.h b/drivers/media/video_processor/di_process/di_process.h
index e7eb5a3..14d164c 100644
--- a/drivers/media/video_processor/di_process/di_process.h
+++ b/drivers/media/video_processor/di_process/di_process.h
@@ -115,6 +115,7 @@
struct di_out_buf_t di_out_buf[DIPR_POOL_SIZE];
DECLARE_KFIFO(di_out_q, struct di_out_buf_t *, DIPR_POOL_SIZE);
struct file *last_file;
+ struct dp_buf_mgr_t *last_buf_mgr;
struct dma_buf *last_dmabuf;
struct dma_buf *out_dmabuf[DIPR_POOL_SIZE];
unsigned long long fence_creat_count;