author | shihong.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) |
commit | 22b36caaac2eadb0889f27d489531421db25c3f1 (patch) | |
tree | 0f408ccea8052b0fa8847c5b0651c0beeaf9c5f8 | |
parent | c8584fd5fef746a0aa415b7b1f3c32edaabcf4eb (diff) | |
download | media_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>
-rw-r--r-- | drivers/frame_provider/decoder/vav1/vav1.c | 47 | ||||
-rw-r--r-- | drivers/stream_input/amports/amstream.c | 20 |
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; } |