Skip to content

Commit 24e5312

Browse files
committed
obs-ffmpeg: Add ROI support for VAAPI
1 parent 260b5ae commit 24e5312

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
503539
static 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

10501090
struct 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

Comments
 (0)