Skip to content

Commit f2fb3f0

Browse files
Dikshita Agarwalmchehab
authored andcommitted
media: venus: venc: Add support for Long Term Reference (LTR) controls
Add support for below LTR controls in encoder: - V4L2_CID_MPEG_VIDEO_LTR_COUNT - V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX - V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES Signed-off-by: Dikshita Agarwal <[email protected]> Signed-off-by: Stanimir Varbanov <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent f15c54c commit f2fb3f0

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

drivers/media/platform/qcom/venus/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ struct venc_controls {
241241
} level;
242242

243243
u32 base_priority_id;
244+
u32 ltr_count;
244245
};
245246

246247
struct venus_buffer {

drivers/media/platform/qcom/venus/venc.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ static int venc_set_properties(struct venus_inst *inst)
546546
struct hfi_quantization quant;
547547
struct hfi_quantization_range quant_range;
548548
struct hfi_enable en;
549+
struct hfi_ltr_mode ltr_mode;
549550
u32 ptype, rate_control, bitrate;
550551
u32 profile, level;
551552
int ret;
@@ -722,6 +723,14 @@ static int venc_set_properties(struct venus_inst *inst)
722723
if (ret)
723724
return ret;
724725

726+
ptype = HFI_PROPERTY_PARAM_VENC_LTRMODE;
727+
ltr_mode.ltr_count = ctr->ltr_count;
728+
ltr_mode.ltr_mode = HFI_LTR_MODE_MANUAL;
729+
ltr_mode.trust_mode = 1;
730+
ret = hfi_session_set_property(inst, ptype, &ltr_mode);
731+
if (ret)
732+
return ret;
733+
725734
switch (inst->hfi_codec) {
726735
case HFI_VIDEO_CODEC_H264:
727736
profile = ctr->profile.h264;

drivers/media/platform/qcom/venus/venc_ctrls.c

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define INTRA_REFRESH_MBS_MAX 300
2121
#define AT_SLICE_BOUNDARY \
2222
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY
23+
#define MAX_LTR_FRAME_COUNT 4
2324

2425
static int venc_calc_bpframes(u32 gop_size, u32 conseq_b, u32 *bf, u32 *pf)
2526
{
@@ -72,6 +73,8 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
7273
struct venc_controls *ctr = &inst->controls.enc;
7374
struct hfi_enable en = { .enable = 1 };
7475
struct hfi_bitrate brate;
76+
struct hfi_ltr_use ltr_use;
77+
struct hfi_ltr_mark ltr_mark;
7578
u32 bframes;
7679
u32 ptype;
7780
int ret;
@@ -279,6 +282,37 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
279282
case V4L2_CID_MPEG_VIDEO_AU_DELIMITER:
280283
ctr->aud_enable = ctrl->val;
281284
break;
285+
case V4L2_CID_MPEG_VIDEO_LTR_COUNT:
286+
ctr->ltr_count = ctrl->val;
287+
break;
288+
case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX:
289+
mutex_lock(&inst->lock);
290+
if (inst->streamon_out && inst->streamon_cap) {
291+
ptype = HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME;
292+
ltr_mark.mark_frame = ctrl->val;
293+
ret = hfi_session_set_property(inst, ptype, &ltr_mark);
294+
if (ret) {
295+
mutex_unlock(&inst->lock);
296+
return ret;
297+
}
298+
}
299+
mutex_unlock(&inst->lock);
300+
break;
301+
case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES:
302+
mutex_lock(&inst->lock);
303+
if (inst->streamon_out && inst->streamon_cap) {
304+
ptype = HFI_PROPERTY_CONFIG_VENC_USELTRFRAME;
305+
ltr_use.ref_ltr = ctrl->val;
306+
ltr_use.use_constrnt = true;
307+
ltr_use.frames = 0;
308+
ret = hfi_session_set_property(inst, ptype, &ltr_use);
309+
if (ret) {
310+
mutex_unlock(&inst->lock);
311+
return ret;
312+
}
313+
}
314+
mutex_unlock(&inst->lock);
315+
break;
282316
default:
283317
return -EINVAL;
284318
}
@@ -294,7 +328,7 @@ int venc_ctrl_init(struct venus_inst *inst)
294328
{
295329
int ret;
296330

297-
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 52);
331+
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 55);
298332
if (ret)
299333
return ret;
300334

@@ -504,6 +538,18 @@ int venc_ctrl_init(struct venus_inst *inst)
504538
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
505539
V4L2_CID_MPEG_VIDEO_AU_DELIMITER, 0, 1, 1, 0);
506540

541+
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
542+
V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES, 0,
543+
((1 << MAX_LTR_FRAME_COUNT) - 1), 0, 0);
544+
545+
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
546+
V4L2_CID_MPEG_VIDEO_LTR_COUNT, 0,
547+
MAX_LTR_FRAME_COUNT, 1, 0);
548+
549+
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
550+
V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX, 0,
551+
(MAX_LTR_FRAME_COUNT - 1), 1, 0);
552+
507553
ret = inst->ctrl_handler.error;
508554
if (ret)
509555
goto err;

0 commit comments

Comments
 (0)