media: venus: helper: Decide work mode
authorDikshita Agarwal <dikshita@codeaurora.org>
Fri, 2 Apr 2021 10:06:47 +0000 (12:06 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 6 Apr 2021 14:00:54 +0000 (16:00 +0200)
Decide work mode for encoder and decoder based on different
use-cases.

Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/helpers.c
drivers/media/platform/qcom/venus/helpers.h
drivers/media/platform/qcom/venus/vdec.c
drivers/media/platform/qcom/venus/venc.c

index 77ffb8f..b813d6d 100644 (file)
@@ -18,6 +18,9 @@
 #include "hfi_platform.h"
 #include "hfi_parser.h"
 
+#define NUM_MBS_720P   (((1280 + 15) >> 4) * ((720 + 15) >> 4))
+#define NUM_MBS_4K     (((4096 + 15) >> 4) * ((2304 + 15) >> 4))
+
 struct intbuf {
        struct list_head list;
        u32 type;
@@ -1090,14 +1093,38 @@ int venus_helper_set_output_resolution(struct venus_inst *inst,
 }
 EXPORT_SYMBOL_GPL(venus_helper_set_output_resolution);
 
-int venus_helper_set_work_mode(struct venus_inst *inst, u32 mode)
+static u32 venus_helper_get_work_mode(struct venus_inst *inst)
+{
+       u32 mode;
+       u32 num_mbs;
+
+       mode = VIDC_WORK_MODE_2;
+       if (inst->session_type == VIDC_SESSION_TYPE_DEC) {
+               num_mbs = (ALIGN(inst->height, 16) * ALIGN(inst->width, 16)) / 256;
+               if (inst->hfi_codec == HFI_VIDEO_CODEC_MPEG2 ||
+                   inst->pic_struct != HFI_INTERLACE_FRAME_PROGRESSIVE ||
+                   num_mbs <= NUM_MBS_720P)
+                       mode = VIDC_WORK_MODE_1;
+       } else {
+               num_mbs = (ALIGN(inst->out_height, 16) * ALIGN(inst->out_width, 16)) / 256;
+               if (inst->hfi_codec == HFI_VIDEO_CODEC_VP8 &&
+                   num_mbs <= NUM_MBS_4K)
+                       mode = VIDC_WORK_MODE_1;
+       }
+
+       return mode;
+}
+
+int venus_helper_set_work_mode(struct venus_inst *inst)
 {
        const u32 ptype = HFI_PROPERTY_PARAM_WORK_MODE;
        struct hfi_video_work_mode wm;
+       u32 mode;
 
        if (!IS_V4(inst->core) && !IS_V6(inst->core))
                return 0;
 
+       mode = venus_helper_get_work_mode(inst);
        wm.video_work_mode = mode;
        return hfi_session_set_property(inst, ptype, &wm);
 }
index 98106e6..e6269b4 100644 (file)
@@ -32,7 +32,7 @@ int venus_helper_set_input_resolution(struct venus_inst *inst,
 int venus_helper_set_output_resolution(struct venus_inst *inst,
                                       unsigned int width, unsigned int height,
                                       u32 buftype);
-int venus_helper_set_work_mode(struct venus_inst *inst, u32 mode);
+int venus_helper_set_work_mode(struct venus_inst *inst);
 int venus_helper_set_format_constraints(struct venus_inst *inst);
 int venus_helper_set_num_bufs(struct venus_inst *inst, unsigned int input_bufs,
                              unsigned int output_bufs,
index 8d58a7e..61c9069 100644 (file)
@@ -664,7 +664,7 @@ static int vdec_output_conf(struct venus_inst *inst)
        u32 ptype;
        int ret;
 
-       ret = venus_helper_set_work_mode(inst, VIDC_WORK_MODE_2);
+       ret = venus_helper_set_work_mode(inst);
        if (ret)
                return ret;
 
index 4e7b987..4a7291f 100644 (file)
@@ -551,7 +551,7 @@ static int venc_set_properties(struct venus_inst *inst)
        u32 profile, level;
        int ret;
 
-       ret = venus_helper_set_work_mode(inst, VIDC_WORK_MODE_2);
+       ret = venus_helper_set_work_mode(inst);
        if (ret)
                return ret;