video: driver: Add support for CQ bitrate mode
Add CQ bitrate mode support. Also add related constant quality control support. Change-Id: I415423e76dc855a7a72e1b68062b9d49433f3ed3 Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
#define MIN_QP_8BIT 0
|
#define MIN_QP_8BIT 0
|
||||||
#define MAX_QP 51
|
#define MAX_QP 51
|
||||||
#define DEFAULT_QP 20
|
#define DEFAULT_QP 20
|
||||||
|
#define MAX_CONSTANT_QUALITY 100
|
||||||
|
|
||||||
#define UBWC_CONFIG(mc, ml, hbb, bs1, bs2, bs3, bsp) \
|
#define UBWC_CONFIG(mc, ml, hbb, bs1, bs2, bs3, bsp) \
|
||||||
{ \
|
{ \
|
||||||
@@ -299,17 +300,32 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
{0}, {0},
|
{0}, {0},
|
||||||
NULL, msm_vidc_set_u32},
|
NULL, msm_vidc_set_u32},
|
||||||
|
|
||||||
{BITRATE_MODE, ENC, CODECS_ALL,
|
{BITRATE_MODE, ENC, H264,
|
||||||
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
||||||
V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
|
V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
|
||||||
/* TODO: CQ. For more info: go/videogki */
|
|
||||||
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
|
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
|
||||||
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
|
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
|
||||||
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
||||||
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
|
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
|
||||||
HFI_PROP_RATE_CONTROL,
|
HFI_PROP_RATE_CONTROL,
|
||||||
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
{0}, {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP},
|
{0},
|
||||||
|
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP},
|
||||||
|
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
|
{BITRATE_MODE, ENC, HEVC,
|
||||||
|
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
||||||
|
V4L2_MPEG_VIDEO_BITRATE_MODE_CQ,
|
||||||
|
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) |
|
||||||
|
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CQ),
|
||||||
|
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
|
||||||
|
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
|
||||||
|
HFI_PROP_RATE_CONTROL,
|
||||||
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
|
{0},
|
||||||
|
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC,
|
||||||
|
I_FRAME_QP, CONSTANT_QUALITY},
|
||||||
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
|
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
{LOSSLESS, ENC, HEVC,
|
{LOSSLESS, ENC, HEVC,
|
||||||
@@ -319,17 +335,22 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
|
|
||||||
{FRAME_SKIP_MODE, ENC, CODECS_ALL,
|
{FRAME_SKIP_MODE, ENC, CODECS_ALL,
|
||||||
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
|
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
|
||||||
1, V4L2_MPEG_MSM_VIDC_DISABLE},
|
1, V4L2_MPEG_MSM_VIDC_DISABLE,
|
||||||
/* TODO(AS): uncomment once below v4l2 id is
|
V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE},
|
||||||
* available (post 5.4 kernel)
|
|
||||||
*/
|
|
||||||
//V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE},
|
|
||||||
|
|
||||||
{FRAME_RC_ENABLE, ENC, CODECS_ALL,
|
{FRAME_RC_ENABLE, ENC, CODECS_ALL,
|
||||||
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
|
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
|
||||||
1, V4L2_MPEG_MSM_VIDC_ENABLE,
|
1, V4L2_MPEG_MSM_VIDC_ENABLE,
|
||||||
V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE},
|
V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE},
|
||||||
|
|
||||||
|
{CONSTANT_QUALITY, ENC, HEVC,
|
||||||
|
1, MAX_CONSTANT_QUALITY, 1, 90,
|
||||||
|
V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY,
|
||||||
|
HFI_PROP_CONSTANT_QUALITY,
|
||||||
|
CAP_FLAG_OUTPUT_PORT,
|
||||||
|
{BITRATE_MODE}, {0},
|
||||||
|
NULL, msm_vidc_set_constant_quality},
|
||||||
|
|
||||||
// TODO: GOP dependencies
|
// TODO: GOP dependencies
|
||||||
{GOP_SIZE, ENC, CODECS_ALL,
|
{GOP_SIZE, ENC, CODECS_ALL,
|
||||||
0, INT_MAX, 1, 2 * DEFAULT_FPS - 1,
|
0, INT_MAX, 1, 2 * DEFAULT_FPS - 1,
|
||||||
|
@@ -47,6 +47,8 @@ int msm_vidc_set_u32(void *instance,
|
|||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_u32_enum(void *instance,
|
int msm_vidc_set_u32_enum(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
|
int msm_vidc_set_constant_quality(void *instance,
|
||||||
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_use_and_mark_ltr(void *instance,
|
int msm_vidc_set_use_and_mark_ltr(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_s32(void *instance,
|
int msm_vidc_set_s32(void *instance,
|
||||||
|
@@ -276,6 +276,7 @@ enum msm_vidc_inst_capability_type {
|
|||||||
LOSSLESS,
|
LOSSLESS,
|
||||||
FRAME_SKIP_MODE,
|
FRAME_SKIP_MODE,
|
||||||
FRAME_RC_ENABLE,
|
FRAME_RC_ENABLE,
|
||||||
|
CONSTANT_QUALITY,
|
||||||
GOP_SIZE,
|
GOP_SIZE,
|
||||||
GOP_CLOSURE,
|
GOP_CLOSURE,
|
||||||
BLUR_TYPES,
|
BLUR_TYPES,
|
||||||
|
@@ -818,11 +818,9 @@ int msm_vidc_adjust_bitrate_mode(void *instance, struct v4l2_ctrl *ctrl)
|
|||||||
hfi_value = HFI_RC_CBR_VFR;
|
hfi_value = HFI_RC_CBR_VFR;
|
||||||
else
|
else
|
||||||
hfi_value = HFI_RC_CBR_CFR;
|
hfi_value = HFI_RC_CBR_CFR;
|
||||||
}/* TODO: CQ mode
|
} else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ) {
|
||||||
else if (bitrate_mode == CQ) {
|
|
||||||
hfi_value = HFI_RC_CQ;
|
hfi_value = HFI_RC_CQ;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
update:
|
update:
|
||||||
inst->hfi_rc_type = hfi_value;
|
inst->hfi_rc_type = hfi_value;
|
||||||
@@ -1241,6 +1239,34 @@ int msm_vidc_set_deblock_mode(void *instance,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int msm_vidc_set_constant_quality(void *instance,
|
||||||
|
enum msm_vidc_inst_capability_type cap_id)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
|
||||||
|
u32 hfi_value = 0;
|
||||||
|
s32 rc_type = -1;
|
||||||
|
|
||||||
|
if (!inst || !inst->capabilities) {
|
||||||
|
d_vpr_e("%s: invalid params\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msm_vidc_get_parent_value(inst, cap_id,
|
||||||
|
BITRATE_MODE, &rc_type, __func__))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (rc_type != HFI_RC_CQ)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
hfi_value = inst->capabilities->cap[cap_id].value;
|
||||||
|
|
||||||
|
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
|
||||||
|
&hfi_value, sizeof(u32), __func__);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int msm_vidc_set_use_and_mark_ltr(void *instance,
|
int msm_vidc_set_use_and_mark_ltr(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id)
|
enum msm_vidc_inst_capability_type cap_id)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user