diff --git a/driver/platform/common/inc/msm_vidc_platform.h b/driver/platform/common/inc/msm_vidc_platform.h index c2486a52f3..a454812535 100644 --- a/driver/platform/common/inc/msm_vidc_platform.h +++ b/driver/platform/common/inc/msm_vidc_platform.h @@ -248,10 +248,22 @@ struct msm_vidc_platform_data { unsigned int psc_vp9_tbl_size; const u32 *psc_av1_tbl; unsigned int psc_av1_tbl_size; - const u32 *dec_input_prop; - unsigned int dec_input_prop_size; - const u32 *dec_output_prop; - unsigned int dec_output_prop_size; + const u32 *dec_input_prop_avc; + unsigned int dec_input_prop_size_avc; + const u32 *dec_input_prop_hevc; + unsigned int dec_input_prop_size_hevc; + const u32 *dec_input_prop_vp9; + unsigned int dec_input_prop_size_vp9; + const u32 *dec_input_prop_av1; + unsigned int dec_input_prop_size_av1; + const u32 *dec_output_prop_avc; + unsigned int dec_output_prop_size_avc; + const u32 *dec_output_prop_hevc; + unsigned int dec_output_prop_size_hevc; + const u32 *dec_output_prop_vp9; + unsigned int dec_output_prop_size_vp9; + const u32 *dec_output_prop_av1; + unsigned int dec_output_prop_size_av1; }; struct msm_vidc_platform { diff --git a/driver/platform/pineapple/src/msm_vidc_pineapple.c b/driver/platform/pineapple/src/msm_vidc_pineapple.c index 3c5ddd5a47..e011d7535d 100644 --- a/driver/platform/pineapple/src/msm_vidc_pineapple.c +++ b/driver/platform/pineapple/src/msm_vidc_pineapple.c @@ -2820,7 +2820,25 @@ static const u32 pineapple_vdec_psc_av1[] = { HFI_PROP_SIGNAL_COLOR_INFO, }; -static const u32 pineapple_vdec_input_properties[] = { +static const u32 pineapple_vdec_input_properties_avc[] = { + HFI_PROP_NO_OUTPUT, + HFI_PROP_SUBFRAME_INPUT, + HFI_PROP_DPB_LIST, +}; + +static const u32 pineapple_vdec_input_properties_hevc[] = { + HFI_PROP_NO_OUTPUT, + HFI_PROP_SUBFRAME_INPUT, + HFI_PROP_DPB_LIST, +}; + +static const u32 pineapple_vdec_input_properties_vp9[] = { + HFI_PROP_NO_OUTPUT, + HFI_PROP_SUBFRAME_INPUT, + HFI_PROP_DPB_LIST, +}; + +static const u32 pineapple_vdec_input_properties_av1[] = { HFI_PROP_NO_OUTPUT, HFI_PROP_SUBFRAME_INPUT, HFI_PROP_DPB_LIST, @@ -2828,7 +2846,7 @@ static const u32 pineapple_vdec_input_properties[] = { HFI_PROP_AV1_UNIFORM_TILE_SPACING, }; -static const u32 pineapple_vdec_output_properties[] = { +static const u32 pineapple_vdec_output_properties_avc[] = { HFI_PROP_WORST_COMPRESSION_RATIO, HFI_PROP_WORST_COMPLEXITY_FACTOR, HFI_PROP_PICTURE_TYPE, @@ -2836,6 +2854,27 @@ static const u32 pineapple_vdec_output_properties[] = { HFI_PROP_FENCE, }; +static const u32 pineapple_vdec_output_properties_hevc[] = { + HFI_PROP_WORST_COMPRESSION_RATIO, + HFI_PROP_WORST_COMPLEXITY_FACTOR, + HFI_PROP_PICTURE_TYPE, + HFI_PROP_FENCE, +}; + +static const u32 pineapple_vdec_output_properties_vp9[] = { + HFI_PROP_WORST_COMPRESSION_RATIO, + HFI_PROP_WORST_COMPLEXITY_FACTOR, + HFI_PROP_PICTURE_TYPE, + HFI_PROP_FENCE, +}; + +static const u32 pineapple_vdec_output_properties_av1[] = { + HFI_PROP_WORST_COMPRESSION_RATIO, + HFI_PROP_WORST_COMPLEXITY_FACTOR, + HFI_PROP_PICTURE_TYPE, + HFI_PROP_FENCE, +}; + static const struct msm_vidc_platform_data pineapple_data = { /* resources dependent on other module */ .bw_tbl = pineapple_bw_table, @@ -2886,10 +2925,22 @@ static const struct msm_vidc_platform_data pineapple_data = { .psc_vp9_tbl_size = ARRAY_SIZE(pineapple_vdec_psc_vp9), .psc_av1_tbl = pineapple_vdec_psc_av1, .psc_av1_tbl_size = ARRAY_SIZE(pineapple_vdec_psc_av1), - .dec_input_prop = pineapple_vdec_input_properties, - .dec_input_prop_size = ARRAY_SIZE(pineapple_vdec_input_properties), - .dec_output_prop = pineapple_vdec_output_properties, - .dec_output_prop_size = ARRAY_SIZE(pineapple_vdec_output_properties), + .dec_input_prop_avc = pineapple_vdec_input_properties_avc, + .dec_input_prop_hevc = pineapple_vdec_input_properties_hevc, + .dec_input_prop_vp9 = pineapple_vdec_input_properties_vp9, + .dec_input_prop_av1 = pineapple_vdec_input_properties_av1, + .dec_input_prop_size_avc = ARRAY_SIZE(pineapple_vdec_input_properties_avc), + .dec_input_prop_size_hevc = ARRAY_SIZE(pineapple_vdec_input_properties_hevc), + .dec_input_prop_size_vp9 = ARRAY_SIZE(pineapple_vdec_input_properties_vp9), + .dec_input_prop_size_av1 = ARRAY_SIZE(pineapple_vdec_input_properties_av1), + .dec_output_prop_avc = pineapple_vdec_output_properties_avc, + .dec_output_prop_hevc = pineapple_vdec_output_properties_hevc, + .dec_output_prop_vp9 = pineapple_vdec_output_properties_vp9, + .dec_output_prop_av1 = pineapple_vdec_output_properties_av1, + .dec_output_prop_size_avc = ARRAY_SIZE(pineapple_vdec_output_properties_avc), + .dec_output_prop_size_hevc = ARRAY_SIZE(pineapple_vdec_output_properties_hevc), + .dec_output_prop_size_vp9 = ARRAY_SIZE(pineapple_vdec_output_properties_vp9), + .dec_output_prop_size_av1 = ARRAY_SIZE(pineapple_vdec_output_properties_av1), }; int msm_vidc_pineapple_check_ddr_type(void) diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 653b1136a7..b5bef7a02f 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -962,8 +962,24 @@ static int msm_vdec_subscribe_property(struct msm_vidc_inst *inst, payload[0] = HFI_MODE_PROPERTY; if (port == INPUT_PORT) { - subscribe_prop_size = core->platform->data.dec_input_prop_size; - subcribe_prop = core->platform->data.dec_input_prop; + if (inst->codec == MSM_VIDC_H264) { + subscribe_prop_size = core->platform->data.dec_input_prop_size_avc; + subcribe_prop = core->platform->data.dec_input_prop_avc; + } else if (inst->codec == MSM_VIDC_HEVC || inst->codec == MSM_VIDC_HEIC) { + subscribe_prop_size = core->platform->data.dec_input_prop_size_hevc; + subcribe_prop = core->platform->data.dec_input_prop_hevc; + } else if (inst->codec == MSM_VIDC_VP9) { + subscribe_prop_size = core->platform->data.dec_input_prop_size_vp9; + subcribe_prop = core->platform->data.dec_input_prop_vp9; + } else if (inst->codec == MSM_VIDC_AV1) { + subscribe_prop_size = core->platform->data.dec_input_prop_size_av1; + subcribe_prop = core->platform->data.dec_input_prop_av1; + } else { + i_vpr_e(inst, "%s: unsupported codec: %d\n", __func__, inst->codec); + subcribe_prop = NULL; + return -EINVAL; + } + for (i = 0; i < subscribe_prop_size; i++) { allow = msm_vidc_allow_property(inst, subcribe_prop[i]); @@ -978,8 +994,23 @@ static int msm_vdec_subscribe_property(struct msm_vidc_inst *inst, } } } else if (port == OUTPUT_PORT) { - subscribe_prop_size = core->platform->data.dec_output_prop_size; - subcribe_prop = core->platform->data.dec_output_prop; + if (inst->codec == MSM_VIDC_H264) { + subscribe_prop_size = core->platform->data.dec_output_prop_size_avc; + subcribe_prop = core->platform->data.dec_output_prop_avc; + } else if (inst->codec == MSM_VIDC_HEVC || inst->codec == MSM_VIDC_HEIC) { + subscribe_prop_size = core->platform->data.dec_output_prop_size_hevc; + subcribe_prop = core->platform->data.dec_output_prop_hevc; + } else if (inst->codec == MSM_VIDC_VP9) { + subscribe_prop_size = core->platform->data.dec_output_prop_size_vp9; + subcribe_prop = core->platform->data.dec_output_prop_vp9; + } else if (inst->codec == MSM_VIDC_AV1) { + subscribe_prop_size = core->platform->data.dec_output_prop_size_av1; + subcribe_prop = core->platform->data.dec_output_prop_av1; + } else { + i_vpr_e(inst, "%s: unsupported codec: %d\n", __func__, inst->codec); + subcribe_prop = NULL; + return -EINVAL; + } for (i = 0; i < subscribe_prop_size; i++) { allow = msm_vidc_allow_property(inst, subcribe_prop[i]);