@@ -500,6 +500,42 @@ static inline void copy_data(AVFrame *pic, const struct encoder_frame *frame,
500500 }
501501}
502502
503+ static void roi_cb (void * param , struct obs_encoder_roi * roi )
504+ {
505+ struct darray * da = param ;
506+ darray_push_back (sizeof (struct obs_encoder_roi ), da , roi );
507+ }
508+
509+ static void add_roi (struct vaapi_encoder * enc , AVFrame * frame )
510+ {
511+ DARRAY (struct obs_encoder_roi ) rois ;
512+ da_init (rois );
513+ obs_encoder_enum_roi (enc -> encoder , roi_cb , & rois );
514+
515+ AVRegionOfInterest * roi ;
516+ AVBufferRef * roi_ref = av_buffer_alloc (sizeof (* roi ) * rois .num );
517+ if (!roi_ref )
518+ goto out ;
519+
520+ roi = (AVRegionOfInterest * )roi_ref -> data ;
521+ for (size_t i = 0 ; i < rois .num ; ++ i ) {
522+ roi [i ] = (AVRegionOfInterest ){
523+ .self_size = sizeof (* roi ),
524+ .top = rois .array [i ].top ,
525+ .bottom = rois .array [i ].bottom ,
526+ .left = rois .array [i ].left ,
527+ .right = rois .array [i ].right ,
528+ .qoffset = av_d2q (-1.0 * rois .array [i ].priority , 1000 ),
529+ };
530+ }
531+ if (!av_frame_new_side_data_from_buf (
532+ frame , AV_FRAME_DATA_REGIONS_OF_INTEREST , roi_ref ))
533+ av_buffer_unref (& roi_ref );
534+
535+ out :
536+ da_free (rois );
537+ }
538+
503539static bool vaapi_encode (void * data , struct encoder_frame * frame ,
504540 struct encoder_packet * packet , bool * received_packet )
505541{
@@ -542,6 +578,9 @@ static bool vaapi_encode(void *data, struct encoder_frame *frame,
542578 goto fail ;
543579 }
544580
581+ if (obs_encoder_has_roi (enc -> encoder ))
582+ add_roi (enc , hwframe );
583+
545584 ret = avcodec_send_frame (enc -> context , hwframe );
546585 if (ret == 0 )
547586 ret = avcodec_receive_packet (enc -> context , enc -> packet );
@@ -1045,6 +1084,7 @@ struct obs_encoder_info h264_vaapi_encoder_info = {
10451084 .get_extra_data = vaapi_extra_data ,
10461085 .get_sei_data = vaapi_sei_data ,
10471086 .get_video_info = vaapi_video_info ,
1087+ .caps = OBS_ENCODER_CAP_ROI ,
10481088};
10491089
10501090struct obs_encoder_info av1_vaapi_encoder_info = {
@@ -1060,6 +1100,7 @@ struct obs_encoder_info av1_vaapi_encoder_info = {
10601100 .get_extra_data = vaapi_extra_data ,
10611101 .get_sei_data = vaapi_sei_data ,
10621102 .get_video_info = vaapi_video_info ,
1103+ .caps = OBS_ENCODER_CAP_ROI ,
10631104};
10641105
10651106#ifdef ENABLE_HEVC
@@ -1076,5 +1117,6 @@ struct obs_encoder_info hevc_vaapi_encoder_info = {
10761117 .get_extra_data = vaapi_extra_data ,
10771118 .get_sei_data = vaapi_sei_data ,
10781119 .get_video_info = vaapi_video_info ,
1120+ .caps = OBS_ENCODER_CAP_ROI ,
10791121};
10801122#endif
0 commit comments