mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
obs-ffmpeg: Add ROI support for VAAPI
This commit is contained in:
parent
a3a8f6dbfb
commit
9a8ff0847d
@ -677,6 +677,42 @@ static inline void copy_data(AVFrame *pic, const struct encoder_frame *frame,
|
||||
}
|
||||
}
|
||||
|
||||
static void roi_cb(void *param, struct obs_encoder_roi *roi)
|
||||
{
|
||||
struct darray *da = param;
|
||||
darray_push_back(sizeof(struct obs_encoder_roi), da, roi);
|
||||
}
|
||||
|
||||
static void add_roi(struct vaapi_encoder *enc, AVFrame *frame)
|
||||
{
|
||||
DARRAY(struct obs_encoder_roi) rois;
|
||||
da_init(rois);
|
||||
obs_encoder_enum_roi(enc->encoder, roi_cb, &rois);
|
||||
|
||||
AVRegionOfInterest *roi;
|
||||
AVBufferRef *roi_ref = av_buffer_alloc(sizeof(*roi) * rois.num);
|
||||
if (!roi_ref)
|
||||
goto out;
|
||||
|
||||
roi = (AVRegionOfInterest *)roi_ref->data;
|
||||
for (size_t i = 0; i < rois.num; ++i) {
|
||||
roi[i] = (AVRegionOfInterest){
|
||||
.self_size = sizeof(*roi),
|
||||
.top = rois.array[i].top,
|
||||
.bottom = rois.array[i].bottom,
|
||||
.left = rois.array[i].left,
|
||||
.right = rois.array[i].right,
|
||||
.qoffset = av_d2q(-1.0 * rois.array[i].priority, 1000),
|
||||
};
|
||||
}
|
||||
if (!av_frame_new_side_data_from_buf(
|
||||
frame, AV_FRAME_DATA_REGIONS_OF_INTEREST, roi_ref))
|
||||
av_buffer_unref(&roi_ref);
|
||||
|
||||
out:
|
||||
da_free(rois);
|
||||
}
|
||||
|
||||
static bool vaapi_encode_internal(struct vaapi_encoder *enc, AVFrame *frame,
|
||||
struct encoder_packet *packet,
|
||||
bool *received_packet)
|
||||
@ -684,6 +720,9 @@ static bool vaapi_encode_internal(struct vaapi_encoder *enc, AVFrame *frame,
|
||||
int got_packet;
|
||||
int ret;
|
||||
|
||||
if (obs_encoder_has_roi(enc->encoder))
|
||||
add_roi(enc, frame);
|
||||
|
||||
ret = avcodec_send_frame(enc->context, frame);
|
||||
if (ret == 0 || ret == AVERROR(EAGAIN))
|
||||
ret = avcodec_receive_packet(enc->context, enc->packet);
|
||||
@ -1300,7 +1339,7 @@ struct obs_encoder_info h264_vaapi_encoder_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
|
||||
struct obs_encoder_info h264_vaapi_encoder_tex_info = {
|
||||
@ -1316,7 +1355,7 @@ struct obs_encoder_info h264_vaapi_encoder_tex_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
|
||||
struct obs_encoder_info av1_vaapi_encoder_info = {
|
||||
@ -1332,7 +1371,7 @@ struct obs_encoder_info av1_vaapi_encoder_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
|
||||
struct obs_encoder_info av1_vaapi_encoder_tex_info = {
|
||||
@ -1348,7 +1387,7 @@ struct obs_encoder_info av1_vaapi_encoder_tex_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
|
||||
#ifdef ENABLE_HEVC
|
||||
@ -1365,7 +1404,7 @@ struct obs_encoder_info hevc_vaapi_encoder_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL,
|
||||
.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
|
||||
struct obs_encoder_info hevc_vaapi_encoder_tex_info = {
|
||||
@ -1381,6 +1420,6 @@ struct obs_encoder_info hevc_vaapi_encoder_tex_info = {
|
||||
.get_extra_data = vaapi_extra_data,
|
||||
.get_sei_data = vaapi_sei_data,
|
||||
.get_video_info = vaapi_video_info,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE,
|
||||
.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_ROI,
|
||||
};
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user