Compare commits

...

3 commits

Author SHA1 Message Date
David Rosca bef2d51537
Merge 9a8ff0847d into 9d67bf2662 2024-06-27 13:48:28 -03:00
Ryan Foster 9d67bf2662 Revert "plugins/win-dshow: Add CUDA decoder"
This reverts commit ce4c99be4e.

This was causing infinitely looping log errors in systems with no
CUDA-capable hardware when hardware decoding was enabled on video
capture devices with custom config enabled.
2024-06-26 18:43:09 -04:00
David Rosca 9a8ff0847d
obs-ffmpeg: Add ROI support for VAAPI 2024-04-21 09:15:44 +02:00
2 changed files with 49 additions and 8 deletions

View file

@ -669,6 +669,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)
@ -676,6 +712,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);
@ -1311,7 +1350,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 = {
@ -1327,7 +1366,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 = {
@ -1343,7 +1382,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 = {
@ -1359,7 +1398,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
@ -1376,7 +1415,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 = {
@ -1392,6 +1431,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

View file

@ -23,8 +23,10 @@
#endif
enum AVHWDeviceType hw_priority[] = {
AV_HWDEVICE_TYPE_CUDA, AV_HWDEVICE_TYPE_D3D11VA, AV_HWDEVICE_TYPE_DXVA2,
AV_HWDEVICE_TYPE_QSV, AV_HWDEVICE_TYPE_NONE,
AV_HWDEVICE_TYPE_D3D11VA,
AV_HWDEVICE_TYPE_DXVA2,
AV_HWDEVICE_TYPE_QSV,
AV_HWDEVICE_TYPE_NONE,
};
static bool has_hw_type(const AVCodec *c, enum AVHWDeviceType type)