media: venus: add handling of bit depth change from firmware
authorDikshita Agarwal <quic_dikshita@quicinc.com>
Mon, 22 May 2023 06:48:17 +0000 (07:48 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 13:04:13 +0000 (14:04 +0100)
Set opb format to TP10_UWC and dpb to client set format
when bit depth change to 10 bit is detecting by firmware.

Acked-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/qcom/venus/helpers.c
drivers/media/platform/qcom/venus/vdec.c

index d02060ffe558a1eeb68d95d6a085f5b11fab797e..1822e85ab6bf829990504c196555c26e482f02fd 100644 (file)
@@ -1765,6 +1765,22 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 v4l2_fmt,
        if (!caps)
                return -EINVAL;
 
+       if (inst->bit_depth == VIDC_BITDEPTH_10 && inst->session_type == VIDC_SESSION_TYPE_DEC) {
+               found_ubwc = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
+                                               HFI_COLOR_FORMAT_YUV420_TP10_UBWC);
+               found = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT2, fmt);
+               if (found_ubwc && found) {
+                       /*
+                        * Hard-code DPB buffers to be 10bit UBWC
+                        * until V4L2 is able to expose compressed/tiled
+                        * formats to applications.
+                        */
+                       *out_fmt = HFI_COLOR_FORMAT_YUV420_TP10_UBWC;
+                       *out2_fmt = fmt;
+                       return 0;
+               }
+       }
+
        if (ubwc) {
                ubwc_fmt = fmt | HFI_COLOR_FORMAT_UBWC_BASE;
                found_ubwc = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
index 7aeaf77ef84e927dd917e1796d313fb95901d15f..96ecedafe5463d0562238416b1277bc09711af9f 100644 (file)
@@ -736,6 +736,9 @@ static int vdec_set_work_route(struct venus_inst *inst)
 }
 
 #define is_ubwc_fmt(fmt) (!!((fmt) & HFI_COLOR_FORMAT_UBWC_BASE))
+#define is_10bit_ubwc_fmt(fmt) (!!((fmt) & HFI_COLOR_FORMAT_10_BIT_BASE & \
+                                HFI_COLOR_FORMAT_UBWC_BASE))
+
 
 static int vdec_output_conf(struct venus_inst *inst)
 {
@@ -783,7 +786,7 @@ static int vdec_output_conf(struct venus_inst *inst)
                inst->opb_fmt = out2_fmt;
                inst->dpb_buftype = HFI_BUFFER_OUTPUT;
                inst->dpb_fmt = out_fmt;
-       } else if (is_ubwc_fmt(out2_fmt)) {
+       } else if (is_ubwc_fmt(out2_fmt) || is_10bit_ubwc_fmt(out_fmt)) {
                inst->opb_buftype = HFI_BUFFER_OUTPUT;
                inst->opb_fmt = out_fmt;
                inst->dpb_buftype = HFI_BUFFER_OUTPUT2;