Commit 90655e2e authored by Viswanath Boma's avatar Viswanath Boma Committed by Hans Verkuil

venus: Add support for min/max qp range.

Currently QP range set from client is not communicated to video firmware.
Add support for the QP range HFI to set the same to firmware.
Signed-off-by: default avatarViswanath Boma <quic_vboma@quicinc.com>
Signed-off-by: default avatarVikash Garodia <quic_vgarodia@quicinc.com>
Signed-off-by: default avatarStanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent a9d45ec7
...@@ -1257,7 +1257,30 @@ pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt, ...@@ -1257,7 +1257,30 @@ pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
pkt->shdr.hdr.size += sizeof(u32) + sizeof(*tm); pkt->shdr.hdr.size += sizeof(u32) + sizeof(*tm);
break; break;
} }
case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2: {
struct hfi_quantization_range_v2 *in = pdata, *range = prop_data;
u32 min_qp, max_qp;
min_qp = in->min_qp.qp_packed;
max_qp = in->max_qp.qp_packed;
/* We'll be packing in the qp, so make sure we
* won't be losing data when masking
*/
if (min_qp > 0xff || max_qp > 0xff)
return -ERANGE;
range->min_qp.layer_id = 0xFF;
range->max_qp.layer_id = 0xFF;
range->min_qp.qp_packed = (min_qp & 0xFF) | ((min_qp & 0xFF) << 8) |
((min_qp & 0xFF) << 16);
range->max_qp.qp_packed = (max_qp & 0xFF) | ((max_qp & 0xFF) << 8) |
((max_qp & 0xFF) << 16);
range->min_qp.enable = 7;
range->max_qp.enable = 7;
pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
break;
}
case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE: case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE: case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE:
......
...@@ -487,6 +487,11 @@ ...@@ -487,6 +487,11 @@
#define HFI_PROPERTY_PARAM_VENC_SESSION_QP 0x2005006 #define HFI_PROPERTY_PARAM_VENC_SESSION_QP 0x2005006
#define HFI_PROPERTY_PARAM_VENC_MPEG4_AC_PREDICTION 0x2005007 #define HFI_PROPERTY_PARAM_VENC_MPEG4_AC_PREDICTION 0x2005007
#define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE 0x2005008 #define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE 0x2005008
/*
* Note: HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2 is
* specific to HFI_VERSION_6XX and HFI_VERSION_4XX only
*/
#define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2 0x2005009
#define HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION 0x2005009 #define HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION 0x2005009
#define HFI_PROPERTY_PARAM_VENC_MPEG4_SHORT_HEADER 0x200500a #define HFI_PROPERTY_PARAM_VENC_MPEG4_SHORT_HEADER 0x200500a
#define HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION 0x200500b #define HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION 0x200500b
...@@ -827,6 +832,19 @@ struct hfi_quantization_range { ...@@ -827,6 +832,19 @@ struct hfi_quantization_range {
u32 layer_id; u32 layer_id;
}; };
struct hfi_quantization_v2 {
u32 qp_packed;
u32 layer_id;
u32 enable;
u32 reserved[3];
};
struct hfi_quantization_range_v2 {
struct hfi_quantization_v2 min_qp;
struct hfi_quantization_v2 max_qp;
u32 reserved[4];
};
#define HFI_LTR_MODE_DISABLE 0x0 #define HFI_LTR_MODE_DISABLE 0x0
#define HFI_LTR_MODE_MANUAL 0x1 #define HFI_LTR_MODE_MANUAL 0x1
#define HFI_LTR_MODE_PERIODIC 0x2 #define HFI_LTR_MODE_PERIODIC 0x2
......
...@@ -617,6 +617,7 @@ static int venc_set_properties(struct venus_inst *inst) ...@@ -617,6 +617,7 @@ static int venc_set_properties(struct venus_inst *inst)
struct hfi_idr_period idrp; struct hfi_idr_period idrp;
struct hfi_quantization quant; struct hfi_quantization quant;
struct hfi_quantization_range quant_range; struct hfi_quantization_range quant_range;
struct hfi_quantization_range_v2 quant_range_v2;
struct hfi_enable en; struct hfi_enable en;
struct hfi_ltr_mode ltr_mode; struct hfi_ltr_mode ltr_mode;
struct hfi_intra_refresh intra_refresh = {}; struct hfi_intra_refresh intra_refresh = {};
...@@ -825,16 +826,40 @@ static int venc_set_properties(struct venus_inst *inst) ...@@ -825,16 +826,40 @@ static int venc_set_properties(struct venus_inst *inst)
if (ret) if (ret)
return ret; return ret;
ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE; if (inst->core->res->hfi_version == HFI_VERSION_4XX ||
if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) { inst->core->res->hfi_version == HFI_VERSION_6XX) {
quant_range.min_qp = ctr->hevc_min_qp; ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2;
quant_range.max_qp = ctr->hevc_max_qp;
if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
quant_range_v2.min_qp.qp_packed = ctr->hevc_min_qp;
quant_range_v2.max_qp.qp_packed = ctr->hevc_max_qp;
} else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_VP8) {
quant_range_v2.min_qp.qp_packed = ctr->vp8_min_qp;
quant_range_v2.max_qp.qp_packed = ctr->vp8_max_qp;
} else {
quant_range_v2.min_qp.qp_packed = ctr->h264_min_qp;
quant_range_v2.max_qp.qp_packed = ctr->h264_max_qp;
}
ret = hfi_session_set_property(inst, ptype, &quant_range_v2);
} else { } else {
quant_range.min_qp = ctr->h264_min_qp; ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
quant_range.max_qp = ctr->h264_max_qp;
if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
quant_range.min_qp = ctr->hevc_min_qp;
quant_range.max_qp = ctr->hevc_max_qp;
} else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_VP8) {
quant_range.min_qp = ctr->vp8_min_qp;
quant_range.max_qp = ctr->vp8_max_qp;
} else {
quant_range.min_qp = ctr->h264_min_qp;
quant_range.max_qp = ctr->h264_max_qp;
}
quant_range.layer_id = 0;
ret = hfi_session_set_property(inst, ptype, &quant_range);
} }
quant_range.layer_id = 0;
ret = hfi_session_set_property(inst, ptype, &quant_range);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment