diff --git a/driver/platform/anorak/src/msm_vidc_anorak.c b/driver/platform/anorak/src/msm_vidc_anorak.c index 39ff51c4ef..23a1764cdb 100644 --- a/driver/platform/anorak/src/msm_vidc_anorak.c +++ b/driver/platform/anorak/src/msm_vidc_anorak.c @@ -378,10 +378,14 @@ static struct msm_platform_inst_capability instance_cap_data_anorak[] = { V4L2_CID_MPEG_VIDC_SUPERFRAME, 0, CAP_FLAG_NONE}, - {SLICE_INTERFACE, DEC, CODECS_ALL, - 0, 0, 0, 0, + {SLICE_DECODE, DEC, H264|HEVC|AV1, + V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_MPEG_MSM_VIDC_ENABLE, + 1, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE, - 0}, + HFI_PROP_SLICE_DECODE, + CAP_FLAG_INPUT_PORT}, {HEADER_MODE, ENC, CODECS_ALL, V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE, @@ -1828,7 +1832,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor {META_OUTBUF_FENCE, DEC, H264|HEVC|VP9|AV1, {OUTPUT_ORDER}, - {LOWLATENCY_MODE}, + {LOWLATENCY_MODE, SLICE_DECODE}, msm_vidc_adjust_dec_outbuf_fence, NULL}, @@ -1856,6 +1860,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor NULL, NULL}, + {SLICE_DECODE, DEC, H264|HEVC|AV1, + {LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER}, + {0}, + msm_vidc_adjust_dec_slice_mode, + msm_vidc_set_u32}, + {HEADER_MODE, ENC, CODECS_ALL, {0}, {0}, @@ -1975,7 +1985,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor {LOWLATENCY_MODE, DEC, H264|HEVC|VP9|AV1, {META_OUTBUF_FENCE}, - {STAGE}, + {STAGE, SLICE_DECODE}, msm_vidc_adjust_dec_lowlatency_mode, NULL}, @@ -2272,7 +2282,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor {OUTPUT_ORDER, DEC, H264|HEVC|VP9|AV1, {THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE}, - {META_OUTBUF_FENCE}, + {META_OUTBUF_FENCE, SLICE_DECODE}, msm_vidc_adjust_output_order, msm_vidc_set_u32}, diff --git a/driver/platform/kalama/src/msm_vidc_kalama.c b/driver/platform/kalama/src/msm_vidc_kalama.c index 82d67054b5..a0736035a9 100644 --- a/driver/platform/kalama/src/msm_vidc_kalama.c +++ b/driver/platform/kalama/src/msm_vidc_kalama.c @@ -379,8 +379,11 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = { V4L2_CID_MPEG_VIDC_SUPERFRAME, 0, CAP_FLAG_NONE}, - {SLICE_INTERFACE, DEC, CODECS_ALL, - 0, 0, 0, 0, + {SLICE_DECODE, DEC, H264|HEVC|AV1, + V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_MPEG_MSM_VIDC_DISABLE, + 0, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE, 0}, @@ -1829,7 +1832,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala {META_OUTBUF_FENCE, DEC, H264|HEVC|VP9|AV1, {OUTPUT_ORDER}, - {LOWLATENCY_MODE}, + {LOWLATENCY_MODE, SLICE_DECODE}, msm_vidc_adjust_dec_outbuf_fence, NULL}, @@ -1857,6 +1860,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala NULL, NULL}, + {SLICE_DECODE, DEC, H264|HEVC|AV1, + {LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER}, + {0}, + NULL, + NULL}, + {HEADER_MODE, ENC, CODECS_ALL, {0}, {0}, @@ -1976,7 +1985,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala {LOWLATENCY_MODE, DEC, H264|HEVC|VP9|AV1, {META_OUTBUF_FENCE}, - {STAGE}, + {STAGE, SLICE_DECODE}, msm_vidc_adjust_dec_lowlatency_mode, NULL}, @@ -2273,7 +2282,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala {OUTPUT_ORDER, DEC, H264|HEVC|VP9|AV1, {THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE}, - {META_OUTBUF_FENCE}, + {META_OUTBUF_FENCE, SLICE_DECODE}, msm_vidc_adjust_output_order, msm_vidc_set_u32}, diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 8e9a448c30..1215f45cf6 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -350,8 +350,11 @@ static struct msm_platform_inst_capability instance_cap_data_waipio[] = { V4L2_CID_MPEG_VIDC_SUPERFRAME, 0, CAP_FLAG_NONE}, - {SLICE_INTERFACE, DEC, CODECS_ALL, - 0, 0, 0, 0, + {SLICE_DECODE, DEC, H264|HEVC, + V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_MPEG_MSM_VIDC_DISABLE, + 0, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE, 0}, @@ -1610,7 +1613,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip {META_OUTBUF_FENCE, DEC, H264|HEVC|VP9, {OUTPUT_ORDER}, - {LOWLATENCY_MODE}, + {LOWLATENCY_MODE, SLICE_DECODE}, NULL, NULL}, @@ -1638,6 +1641,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip NULL, NULL}, + {SLICE_DECODE, DEC, H264|HEVC, + {LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER}, + {0}, + NULL, + NULL}, + {HEADER_MODE, ENC, CODECS_ALL, {0}, {0}, @@ -1745,7 +1754,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip {LOWLATENCY_MODE, DEC, H264|HEVC|VP9, {META_OUTBUF_FENCE}, - {STAGE}, + {STAGE, SLICE_DECODE}, msm_vidc_adjust_dec_lowlatency_mode, NULL}, @@ -2030,7 +2039,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip {OUTPUT_ORDER, DEC, H264|HEVC|VP9, {THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE}, - {META_OUTBUF_FENCE}, + {META_OUTBUF_FENCE, SLICE_DECODE}, msm_vidc_adjust_output_order, msm_vidc_set_u32}, diff --git a/driver/vidc/inc/hfi_property.h b/driver/vidc/inc/hfi_property.h index f48c39ff64..b70b95ee6e 100644 --- a/driver/vidc/inc/hfi_property.h +++ b/driver/vidc/inc/hfi_property.h @@ -569,6 +569,8 @@ enum hfi_saliency_type { #define HFI_PROP_DISABLE_VUI_TIMING_INFO 0x03000194 +#define HFI_PROP_SLICE_DECODE 0x03000196 + #define HFI_PROP_END 0x03FFFFFF #define HFI_SESSION_ERROR_BEGIN 0x04000000 diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index ef8df444d5..f10159473e 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -53,6 +53,7 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_dec_slice_mode(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_preprocess(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_set_header_mode(void *instance, diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 36afe95bb5..1fd1841860 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -422,7 +422,6 @@ enum msm_vidc_inst_capability_type { FENCE_ID, FENCE_FD, TS_REORDER, - SLICE_INTERFACE, HFLIP, VFLIP, ROTATION, @@ -539,6 +538,7 @@ enum msm_vidc_inst_capability_type { OUTPUT_BUF_HOST_MAX_COUNT, DELIVERY_MODE, VUI_TIMING_INFO, + SLICE_DECODE, /* place all leaf(no child) enums before this line */ INST_CAP_MAX, }; diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index ca5d17fa49..49f0363655 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -2905,6 +2905,41 @@ int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl) return 0; } +int msm_vidc_adjust_dec_slice_mode(void *instance, struct v4l2_ctrl *ctrl) +{ + struct msm_vidc_inst_capability *capability; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + u32 adjusted_value = 0; + s32 low_latency = -1; + s32 picture_order = -1; + s32 outbuf_fence = V4L2_MPEG_VIDC_META_DISABLE; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : capability->cap[SLICE_DECODE].value; + + if (msm_vidc_get_parent_value(inst, SLICE_DECODE, LOWLATENCY_MODE, + &low_latency, __func__) || + msm_vidc_get_parent_value(inst, SLICE_DECODE, OUTPUT_ORDER, + &picture_order, __func__) || + msm_vidc_get_parent_value(inst, SLICE_DECODE, META_OUTBUF_FENCE, + &outbuf_fence, __func__)) + return -EINVAL; + + if (!low_latency || !picture_order || + !is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) + adjusted_value = V4L2_MPEG_MSM_VIDC_DISABLE; + + msm_vidc_update_cap_value(inst, SLICE_DECODE, + adjusted_value, __func__); + + return 0; +} + int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst) { struct list_head root_list, opt_list; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index ec171c8d90..d248707f57 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -116,7 +116,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = { {FENCE_ID, "FENCE_ID" }, {FENCE_FD, "FENCE_FD" }, {TS_REORDER, "TS_REORDER" }, - {SLICE_INTERFACE, "SLICE_INTERFACE" }, {HFLIP, "HFLIP" }, {VFLIP, "VFLIP" }, {ROTATION, "ROTATION" }, @@ -229,6 +228,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = { {OUTPUT_BUF_HOST_MAX_COUNT, "OUTPUT_BUF_HOST_MAX_COUNT" }, {DELIVERY_MODE, "DELIVERY_MODE" }, {VUI_TIMING_INFO, "VUI_TIMING_INFO" }, + {SLICE_DECODE, "SLICE_DECODE" }, {INST_CAP_MAX, "INST_CAP_MAX" }, }; @@ -1453,7 +1453,6 @@ bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, u32 cap_id case META_SEI_MASTERING_DISP: case META_SEI_CLL: case META_HDR10PLUS: - case META_PICTURE_TYPE: if (!is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) { i_vpr_h(inst, "%s: cap: %24s not allowed as output buffer fence is disabled\n", diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index 3cdf1accbb..4a3ed770db 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/include/uapi/vidc/media/v4l2_vidc_extensions.h @@ -428,6 +428,10 @@ enum meta_interlace_info { META_INTERLACE_FRAME_INTERLACE_BOTTOMFIELD_FIRST = 0x00000020, }; +/* + * enum meta_picture_type - specifies input picture type + * @META_PICTURE_TYPE_NEW: start of new frame or first slice in a frame + */ enum meta_picture_type { META_PICTURE_TYPE_IDR = 0x00000001, META_PICTURE_TYPE_P = 0x00000002, @@ -436,6 +440,7 @@ enum meta_picture_type { META_PICTURE_TYPE_CRA = 0x00000010, META_PICTURE_TYPE_BLA = 0x00000020, META_PICTURE_TYPE_NOSHOW = 0x00000040, + META_PICTURE_TYPE_NEW = 0x00000080, }; /* vendor controls end */