summaryrefslogtreecommitdiff
authorshihong.zheng <shihong.zheng@amlogic.com>2020-03-26 07:30:04 (GMT)
committer Hui Zhang <hui.zhang@amlogic.com>2020-04-13 03:58:48 (GMT)
commit22b36caaac2eadb0889f27d489531421db25c3f1 (patch)
tree0f408ccea8052b0fa8847c5b0651c0beeaf9c5f8
parentc8584fd5fef746a0aa415b7b1f3c32edaabcf4eb (diff)
downloadmedia_modules-22b36caaac2eadb0889f27d489531421db25c3f1.zip
media_modules-22b36caaac2eadb0889f27d489531421db25c3f1.tar.gz
media_modules-22b36caaac2eadb0889f27d489531421db25c3f1.tar.bz2
av1: av1 support dv frame mode. [1/2]
PD#SWPL-22440 Problem: av1 support frame mode dolby vision. Solution: add av1 dv deivece and set dvbl provide name when dual flag. add without display node for debug. Verify: ab311 Change-Id: I7b4f154ca565b8dd0ff8e91071fe030cdb4bdb98 Signed-off-by: shihong.zheng <shihong.zheng@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/vav1/vav1.c47
-rw-r--r--drivers/stream_input/amports/amstream.c20
2 files changed, 66 insertions, 1 deletions
diff --git a/drivers/frame_provider/decoder/vav1/vav1.c b/drivers/frame_provider/decoder/vav1/vav1.c
index d927a17..9cecb72 100644
--- a/drivers/frame_provider/decoder/vav1/vav1.c
+++ b/drivers/frame_provider/decoder/vav1/vav1.c
@@ -353,6 +353,7 @@ static u32 frame_height;
static u32 video_signal_type;
static u32 force_dv_enable;
static u32 on_no_keyframe_skiped;
+static u32 without_display_mode;
#define PROB_SIZE (496 * 2 * 4)
#define PROB_BUF_SIZE (0x5000)
@@ -440,6 +441,12 @@ static u32 udebug_pause_val;
static u32 udebug_pause_decode_idx;
+
+#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
+static u32 dv_toggle_prov_name;
+#endif
+
+
#define DEBUG_REG
#ifdef DEBUG_REG
void AV1_WRITE_VREG_DBG2(unsigned int adr, unsigned int val, int line)
@@ -5252,6 +5259,9 @@ static void vav1_vf_put(struct vframe_s *vf, void *op_arg)
uint8_t index = vf->index & 0xff;
unsigned long flags;
+ if ((vf == NULL) || (hw == NULL))
+ return;
+
kfifo_put(&hw->newframe_q, (const struct vframe_s *)vf);
hw->vf_put_count++;
if (debug & AOM_DEBUG_VFRAME) {
@@ -5810,8 +5820,11 @@ static int prepare_display_buf(struct AV1HW_s *hw,
vdec_count_info(gvs, 0, stream_offset);
#endif
hw_to_vdec(hw)->vdec_fps_detec(hw_to_vdec(hw)->id);
- vf_notify_receiver(hw->provider_name,
+ if (without_display_mode == 0) {
+ vf_notify_receiver(hw->provider_name,
VFRAME_EVENT_PROVIDER_VFRAME_READY, NULL);
+ } else
+ vav1_vf_put(vav1_vf_get(hw), hw);
} else {
hw->stat |= AV1_TRIGGER_FRAME_DONE;
hevc_source_changed(VFORMAT_AV1, 196, 196, 30);
@@ -9311,6 +9324,29 @@ static int ammvdec_av1_probe(struct platform_device *pdev)
if (pdata->use_vfm_path)
snprintf(pdata->vf_provider_name, VDEC_PROVIDER_NAME_SIZE,
VFM_DEC_PROVIDER_NAME);
+#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
+ else if (vdec_dual(pdata)) {
+ struct AV1HW_s *hevc_pair = NULL;
+
+ if (dv_toggle_prov_name) /*debug purpose*/
+ snprintf(pdata->vf_provider_name,
+ VDEC_PROVIDER_NAME_SIZE,
+ (pdata->master) ? VFM_DEC_DVBL_PROVIDER_NAME :
+ VFM_DEC_DVEL_PROVIDER_NAME);
+ else
+ snprintf(pdata->vf_provider_name,
+ VDEC_PROVIDER_NAME_SIZE,
+ (pdata->master) ? VFM_DEC_DVEL_PROVIDER_NAME :
+ VFM_DEC_DVBL_PROVIDER_NAME);
+ if (pdata->master)
+ hevc_pair = (struct AV1HW_s *)pdata->master->private;
+ else if (pdata->slave)
+ hevc_pair = (struct AV1HW_s *)pdata->slave->private;
+
+ if (hevc_pair)
+ hw->shift_byte_count_lo = hevc_pair->shift_byte_count_lo;
+ }
+#endif
else
snprintf(pdata->vf_provider_name, VDEC_PROVIDER_NAME_SIZE,
MULTI_INSTANCE_PROVIDER_NAME ".%02x", pdev->id & 0xff);
@@ -9324,6 +9360,7 @@ static int ammvdec_av1_probe(struct platform_device *pdev)
hw->platform_dev = pdev;
hw->video_signal_type = 0;
hw->m_ins_flag = 1;
+
if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_TXLX)
hw->stat |= AV1_TRIGGER_FRAME_ENABLE;
@@ -9881,6 +9918,11 @@ MODULE_PARM_DESC(get_picture_qos, "\n amvdec_av1 get_picture_qos\n");
module_param(udebug_flag, uint, 0664);
MODULE_PARM_DESC(udebug_flag, "\n amvdec_h265 udebug_flag\n");
+#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
+module_param(dv_toggle_prov_name, uint, 0664);
+MODULE_PARM_DESC(dv_toggle_prov_name, "\n dv_toggle_prov_name\n");
+#endif
+
module_param(udebug_pause_pos, uint, 0664);
MODULE_PARM_DESC(udebug_pause_pos, "\n udebug_pause_pos\n");
@@ -9893,6 +9935,9 @@ MODULE_PARM_DESC(udebug_pause_decode_idx, "\n udebug_pause_decode_idx\n");
module_param(force_pts_unstable, uint, 0664);
MODULE_PARM_DESC(force_pts_unstable, "\n force_pts_unstable\n");
+module_param(without_display_mode, uint, 0664);
+MODULE_PARM_DESC(without_display_mode, "\n without_display_mode\n");
+
module_init(amvdec_av1_driver_init_module);
module_exit(amvdec_av1_driver_remove_module);
diff --git a/drivers/stream_input/amports/amstream.c b/drivers/stream_input/amports/amstream.c
index 4c2fa85..95ea2ae 100644
--- a/drivers/stream_input/amports/amstream.c
+++ b/drivers/stream_input/amports/amstream.c
@@ -429,6 +429,13 @@ static struct stream_port_s ports[] = {
.fops = &vbuf_fops,
.vformat = VFORMAT_HEVC,
},
+ {
+ .name = "amstream_dves_av1",
+ .type = PORT_TYPE_ES | PORT_TYPE_VIDEO | PORT_TYPE_HEVC | PORT_TYPE_FRAME |
+ PORT_TYPE_DECODER_SCHED | PORT_TYPE_DUALDEC,
+ .fops = &vframe_fops,
+ .vformat = VFORMAT_AV1,
+ },
#endif
#endif
};
@@ -633,6 +640,19 @@ static int video_port_init(struct port_priv_s *priv,
return r;
}
+ if (vdec_dual(vdec)) {
+ if (port->vformat == VFORMAT_AV1) /* av1 dv only single layer */
+ return 0;
+ r = vdec_init(vdec->slave,
+ (priv->vdec->sys_info->height *
+ priv->vdec->sys_info->width) > 1920*1088);
+ if (r < 0) {
+ pr_err("video_port_init %d, vdec_init failed\n",
+ __LINE__);
+ video_port_release(priv, pbuf, 2);
+ return r;
+ }
+ }
return 0;
}