mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2026-01-27 12:35:36 +01:00
LF-12805: vpu: wave6: Add profile/level v4l2 ctrls for decoder
Support profile and level v4l2 controls for decoder. These controls can be used by host for reference. The control values are updated by decoder driver after parsing header. Signed-off-by: Nas Chung <nas.chung@chipsnmedia.com> Reviewed-by: TaoJiang <tao.jiang_2@nxp.com> Reviewed-by: MingQian <ming.qian@nxp.com>
This commit is contained in:
parent
74603924f9
commit
038bfb6ffb
|
|
@ -435,6 +435,135 @@ set_default_color:
|
|||
inst->xfer_func = V4L2_XFER_FUNC_DEFAULT;
|
||||
}
|
||||
|
||||
static enum v4l2_mpeg_video_hevc_profile to_v4l2_hevc_profile(s32 profile)
|
||||
{
|
||||
switch (profile) {
|
||||
case HEVC_PROFILE_MAIN:
|
||||
return V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN;
|
||||
default:
|
||||
return V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN;
|
||||
}
|
||||
}
|
||||
|
||||
static enum v4l2_mpeg_video_hevc_level to_v4l2_hevc_level(s32 level)
|
||||
{
|
||||
switch (level) {
|
||||
case 30:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_1;
|
||||
case 60:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_2;
|
||||
case 63:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1;
|
||||
case 90:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_3;
|
||||
case 93:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1;
|
||||
case 120:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_4;
|
||||
case 123:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1;
|
||||
case 150:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_5;
|
||||
case 153:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1;
|
||||
default:
|
||||
return V4L2_MPEG_VIDEO_HEVC_LEVEL_5;
|
||||
}
|
||||
}
|
||||
|
||||
static enum v4l2_mpeg_video_h264_profile to_v4l2_h264_profile(s32 profile)
|
||||
{
|
||||
switch (profile) {
|
||||
case H264_PROFILE_BP:
|
||||
return V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
|
||||
case H264_PROFILE_MP:
|
||||
return V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
|
||||
case H264_PROFILE_EXTENDED:
|
||||
return V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
|
||||
case H264_PROFILE_HP:
|
||||
return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
|
||||
default:
|
||||
return V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
|
||||
}
|
||||
}
|
||||
|
||||
static enum v4l2_mpeg_video_h264_level to_v4l2_h264_level(s32 level)
|
||||
{
|
||||
switch (level) {
|
||||
case 10:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
|
||||
case 9:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_1B;
|
||||
case 11:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
|
||||
case 12:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
|
||||
case 13:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
|
||||
case 20:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
|
||||
case 21:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
|
||||
case 22:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
|
||||
case 30:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
|
||||
case 31:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
|
||||
case 32:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
|
||||
case 40:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
|
||||
case 41:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
|
||||
case 42:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
|
||||
case 50:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
|
||||
case 51:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
|
||||
case 52:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_5_2;
|
||||
default:
|
||||
return V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
|
||||
}
|
||||
}
|
||||
|
||||
static void wave6_update_v4l2_ctrls(struct vpu_instance *inst,
|
||||
struct dec_initial_info *info)
|
||||
{
|
||||
struct v4l2_ctrl *ctrl;
|
||||
u32 min_disp_cnt;
|
||||
|
||||
min_disp_cnt = info->frame_buf_delay + 1;
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MIN_BUFFERS_FOR_CAPTURE);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, min_disp_cnt);
|
||||
|
||||
if (inst->src_fmt.pixelformat == V4L2_PIX_FMT_HEVC) {
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_PROFILE);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, to_v4l2_hevc_profile(info->profile));
|
||||
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_LEVEL);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, to_v4l2_hevc_level(info->level));
|
||||
} else if (inst->src_fmt.pixelformat == V4L2_PIX_FMT_H264) {
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MPEG_VIDEO_H264_PROFILE);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, to_v4l2_h264_profile(info->profile));
|
||||
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MPEG_VIDEO_H264_LEVEL);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, to_v4l2_h264_level(info->level));
|
||||
}
|
||||
}
|
||||
|
||||
static int wave6_vpu_dec_start_decode(struct vpu_instance *inst)
|
||||
{
|
||||
struct dec_param pic_param;
|
||||
|
|
@ -658,8 +787,6 @@ static void wave6_vpu_dec_handle_source_change(struct vpu_instance *inst,
|
|||
.type = V4L2_EVENT_SOURCE_CHANGE,
|
||||
.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
|
||||
};
|
||||
struct v4l2_ctrl *ctrl;
|
||||
unsigned int min_disp_cnt;
|
||||
|
||||
dprintk(inst->dev->dev, "pic size %dx%d profile %d, min_fb_cnt : %d | min_disp_cnt : %d\n",
|
||||
info->pic_width, info->pic_height,
|
||||
|
|
@ -669,18 +796,13 @@ static void wave6_vpu_dec_handle_source_change(struct vpu_instance *inst,
|
|||
wave6_vpu_dec_give_command(inst, DEC_RESET_FRAMEBUF_INFO, NULL);
|
||||
|
||||
wave6_vpu_set_instance_state(inst, VPU_INST_STATE_INIT_SEQ);
|
||||
min_disp_cnt = info->frame_buf_delay + 1;
|
||||
|
||||
inst->crop.left = info->pic_crop_rect.left;
|
||||
inst->crop.top = info->pic_crop_rect.top;
|
||||
inst->crop.width = info->pic_crop_rect.right - inst->crop.left;
|
||||
inst->crop.height = info->pic_crop_rect.bottom - inst->crop.top;
|
||||
|
||||
ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
|
||||
V4L2_CID_MIN_BUFFERS_FOR_CAPTURE);
|
||||
if (ctrl)
|
||||
v4l2_ctrl_s_ctrl(ctrl, min_disp_cnt);
|
||||
|
||||
wave6_update_v4l2_ctrls(inst, info);
|
||||
wave6_update_color_info(inst, info);
|
||||
wave6_update_pix_fmt(&inst->src_fmt, info->pic_width, info->pic_height);
|
||||
wave6_update_pix_fmt_cap(&inst->dst_fmt,
|
||||
|
|
@ -1218,13 +1340,16 @@ static int wave6_vpu_dec_s_ctrl(struct v4l2_ctrl *ctrl)
|
|||
case V4L2_CID_VPU_THUMBNAIL_MODE:
|
||||
inst->thumbnail_mode = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE:
|
||||
inst->disp_mode = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:
|
||||
case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
|
||||
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
|
||||
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -1792,6 +1917,22 @@ static int wave6_vpu_open_dec(struct file *filp)
|
|||
v4l2_ctrl_new_std(&inst->v4l2_ctrl_hdl, &wave6_vpu_dec_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE,
|
||||
0, 1, 1, 0);
|
||||
v4l2_ctrl_new_std_menu(&inst->v4l2_ctrl_hdl, &wave6_vpu_dec_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
|
||||
V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, 0,
|
||||
V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN);
|
||||
v4l2_ctrl_new_std_menu(&inst->v4l2_ctrl_hdl, &wave6_vpu_dec_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
|
||||
V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, 0,
|
||||
V4L2_MPEG_VIDEO_HEVC_LEVEL_5);
|
||||
v4l2_ctrl_new_std_menu(&inst->v4l2_ctrl_hdl, &wave6_vpu_dec_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_H264_PROFILE,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 0,
|
||||
V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);
|
||||
v4l2_ctrl_new_std_menu(&inst->v4l2_ctrl_hdl, &wave6_vpu_dec_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_H264_LEVEL,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_5_2, 0,
|
||||
V4L2_MPEG_VIDEO_H264_LEVEL_5_0);
|
||||
|
||||
if (inst->v4l2_ctrl_hdl.error) {
|
||||
ret = -ENODEV;
|
||||
|
|
|
|||
|
|
@ -1457,9 +1457,6 @@ static int wave6_vpu_enc_s_ctrl(struct v4l2_ctrl *ctrl)
|
|||
case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
|
||||
p->level = 51 * 3;
|
||||
break;
|
||||
case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2:
|
||||
p->level = 52 * 3;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user