From 0126cc3d4b778ab5a4a762dd82090b4e2c8a8f2e Mon Sep 17 00:00:00 2001 From: Darshana Patil Date: Thu, 18 Feb 2021 18:26:43 -0800 Subject: [PATCH] video: driver: modify decoder subscribe psc list modify decoder subscribe psc list according to supported codecs. Change-Id: Id54ea26bac07491b80877ef88ab7888c08750335 Signed-off-by: Darshana Patil --- driver/vidc/src/msm_vdec.c | 97 ++++++++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 19 deletions(-) diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index de36f8b734..6e391e0a54 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -19,17 +19,35 @@ #include "venus_hfi.h" #include "hfi_packet.h" -u32 msm_vdec_subscribe_for_port_settings_change[] = { +u32 msm_vdec_subscribe_for_psc_avc[] = { HFI_PROP_BITSTREAM_RESOLUTION, HFI_PROP_CROP_OFFSETS, - HFI_PROP_LUMA_CHROMA_BIT_DEPTH, HFI_PROP_CODED_FRAMES, HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, HFI_PROP_PIC_ORDER_CNT_TYPE, + HFI_PROP_PROFILE, + HFI_PROP_LEVEL, HFI_PROP_SIGNAL_COLOR_INFO, +}; + +u32 msm_vdec_subscribe_for_psc_hevc[] = { + HFI_PROP_BITSTREAM_RESOLUTION, + HFI_PROP_CROP_OFFSETS, + HFI_PROP_LUMA_CHROMA_BIT_DEPTH, + HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, HFI_PROP_PROFILE, HFI_PROP_LEVEL, HFI_PROP_TIER, + HFI_PROP_SIGNAL_COLOR_INFO, +}; + +u32 msm_vdec_subscribe_for_psc_vp9[] = { + HFI_PROP_BITSTREAM_RESOLUTION, + HFI_PROP_CROP_OFFSETS, + HFI_PROP_LUMA_CHROMA_BIT_DEPTH, + HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, + HFI_PROP_PROFILE, + HFI_PROP_LEVEL, }; u32 msm_vdec_subscribe_for_properties[] = { @@ -1006,6 +1024,8 @@ static int msm_vdec_subscribe_input_port_settings_change(struct msm_vidc_inst *i struct msm_vidc_core *core; u32 payload[32] = {0}; u32 i; + u32 subscribe_psc_size = 0; + u32 *psc = NULL; if (!inst || !inst->core) { d_vpr_e("%s: invalid params\n", __func__); @@ -1015,21 +1035,39 @@ static int msm_vdec_subscribe_input_port_settings_change(struct msm_vidc_inst *i d_vpr_h("%s()\n", __func__); payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE; - for (i = 0; i < ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change); - i++) - payload[i + 1] = msm_vdec_subscribe_for_port_settings_change[i]; + if (inst->codec == MSM_VIDC_H264) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_avc); + psc = msm_vdec_subscribe_for_psc_avc; + } else if (inst->codec == MSM_VIDC_HEVC) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_hevc); + psc = msm_vdec_subscribe_for_psc_hevc; + } else if (inst->codec == MSM_VIDC_VP9) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_vp9); + psc = msm_vdec_subscribe_for_psc_vp9; + } else { + d_vpr_e("%s: unsupported codec: %d\n", __func__, inst->codec); + psc = NULL; + return -EINVAL; + } + if (!psc || !subscribe_psc_size) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE; + for (i = 0; i < subscribe_psc_size; i++) + payload[i + 1] = psc[i]; rc = venus_hfi_session_command(inst, HFI_CMD_SUBSCRIBE_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change) + 1) * - sizeof(u32)); + ((subscribe_psc_size + 1) * + sizeof(u32))); - for (i = 0; i < ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change); - i++) { - switch (msm_vdec_subscribe_for_port_settings_change[i]) { + for (i = 0; i < subscribe_psc_size; i++) { + switch (psc[i]) { case HFI_PROP_BITSTREAM_RESOLUTION: rc = msm_vdec_set_bitstream_resolution(inst, port); break; @@ -1062,7 +1100,7 @@ static int msm_vdec_subscribe_input_port_settings_change(struct msm_vidc_inst *i break; default: d_vpr_e("%s: unknown property %#x\n", __func__, - msm_vdec_subscribe_for_port_settings_change[i]); + psc[i]); rc = -EINVAL; break; } @@ -1482,30 +1520,51 @@ static int msm_vdec_subscribe_output_port_settings_change(struct msm_vidc_inst * u32 prop_type, payload_size, payload_type; u32 i; struct msm_vidc_subscription_params subsc_params; + u32 subscribe_psc_size = 0; + u32 *psc = NULL; d_vpr_h("%s()\n", __func__); payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE; - for (i = 0; i < ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change); - i++) - payload[i + 1] = msm_vdec_subscribe_for_port_settings_change[i]; + if (inst->codec == MSM_VIDC_H264) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_avc); + psc = msm_vdec_subscribe_for_psc_avc; + } else if (inst->codec == MSM_VIDC_HEVC) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_hevc); + psc = msm_vdec_subscribe_for_psc_hevc; + } else if (inst->codec == MSM_VIDC_VP9) { + subscribe_psc_size = ARRAY_SIZE(msm_vdec_subscribe_for_psc_vp9); + psc = msm_vdec_subscribe_for_psc_vp9; + } else { + d_vpr_e("%s: unsupported codec: %d\n", __func__, inst->codec); + psc = NULL; + return -EINVAL; + } + + if (!psc || !subscribe_psc_size) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE; + for (i = 0; i < subscribe_psc_size; i++) + payload[i + 1] = psc[i]; rc = venus_hfi_session_command(inst, HFI_CMD_SUBSCRIBE_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change) + 1) * - sizeof(u32)); + ((subscribe_psc_size + 1) * + sizeof(u32))); subsc_params = inst->subcr_params[port]; - for (i = 0; i < ARRAY_SIZE(msm_vdec_subscribe_for_port_settings_change); - i++) { + for (i = 0; i < subscribe_psc_size; i++) { payload[0] = 0; payload[1] = 0; payload_size = 0; payload_type = 0; - prop_type = msm_vdec_subscribe_for_port_settings_change[i]; + prop_type = psc[i]; switch (prop_type) { case HFI_PROP_BITSTREAM_RESOLUTION: payload[0] = subsc_params.bitstream_resolution;