20
20
#define INTRA_REFRESH_MBS_MAX 300
21
21
#define AT_SLICE_BOUNDARY \
22
22
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY
23
+ #define MAX_LTR_FRAME_COUNT 4
23
24
24
25
static int venc_calc_bpframes (u32 gop_size , u32 conseq_b , u32 * bf , u32 * pf )
25
26
{
@@ -72,6 +73,8 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
72
73
struct venc_controls * ctr = & inst -> controls .enc ;
73
74
struct hfi_enable en = { .enable = 1 };
74
75
struct hfi_bitrate brate ;
76
+ struct hfi_ltr_use ltr_use ;
77
+ struct hfi_ltr_mark ltr_mark ;
75
78
u32 bframes ;
76
79
u32 ptype ;
77
80
int ret ;
@@ -279,6 +282,37 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
279
282
case V4L2_CID_MPEG_VIDEO_AU_DELIMITER :
280
283
ctr -> aud_enable = ctrl -> val ;
281
284
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 ;
282
316
default :
283
317
return - EINVAL ;
284
318
}
@@ -294,7 +328,7 @@ int venc_ctrl_init(struct venus_inst *inst)
294
328
{
295
329
int ret ;
296
330
297
- ret = v4l2_ctrl_handler_init (& inst -> ctrl_handler , 52 );
331
+ ret = v4l2_ctrl_handler_init (& inst -> ctrl_handler , 55 );
298
332
if (ret )
299
333
return ret ;
300
334
@@ -504,6 +538,18 @@ int venc_ctrl_init(struct venus_inst *inst)
504
538
v4l2_ctrl_new_std (& inst -> ctrl_handler , & venc_ctrl_ops ,
505
539
V4L2_CID_MPEG_VIDEO_AU_DELIMITER , 0 , 1 , 1 , 0 );
506
540
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
+
507
553
ret = inst -> ctrl_handler .error ;
508
554
if (ret )
509
555
goto err ;
0 commit comments