obs-ffmpeg: Add frame drop controls to the ffmpeg source UI
This commit is contained in:
@@ -12,3 +12,11 @@ HardwareDecode="Use hardware decoding when available"
|
||||
Advanced="Advanced"
|
||||
AudioBufferSize="Audio Buffer Size (frames)"
|
||||
VideoBufferSize="Video Buffer Size (frames)"
|
||||
FrameDropping="Frame Dropping Level"
|
||||
DiscardNone="None"
|
||||
DiscardDefault="Default (Invalid Packets)"
|
||||
DiscardNonRef="Non-Reference Frames"
|
||||
DiscardBiDir="Bi-Directional Frames"
|
||||
DiscardNonIntra="Non-Intra Frames"
|
||||
DiscardNonKey="Non-Key Frames"
|
||||
DiscardAll="All Frames (Careful!)"
|
||||
|
@@ -266,8 +266,10 @@ static bool is_advanced_modified(obs_properties_t *props,
|
||||
bool enabled = obs_data_get_bool(settings, "advanced");
|
||||
obs_property_t *abuf = obs_properties_get(props, "audio_buffer_size");
|
||||
obs_property_t *vbuf = obs_properties_get(props, "video_buffer_size");
|
||||
obs_property_t *frame_drop = obs_properties_get(props, "frame_drop");
|
||||
obs_property_set_visible(abuf, enabled);
|
||||
obs_property_set_visible(vbuf, enabled);
|
||||
obs_property_set_visible(frame_drop, enabled);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -317,6 +319,27 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
|
||||
|
||||
obs_property_set_visible(prop, false);
|
||||
|
||||
prop = obs_properties_add_list(props, "frame_drop",
|
||||
obs_module_text("FrameDropping"), OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardNone"),
|
||||
AVDISCARD_NONE);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardDefault"),
|
||||
AVDISCARD_DEFAULT);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardNonRef"),
|
||||
AVDISCARD_NONREF);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardBiDir"),
|
||||
AVDISCARD_BIDIR);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardNonIntra"),
|
||||
AVDISCARD_NONINTRA);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardNonKey"),
|
||||
AVDISCARD_NONKEY);
|
||||
obs_property_list_add_int(prop, obs_module_text("DiscardAll"),
|
||||
AVDISCARD_ALL);
|
||||
|
||||
obs_property_set_visible(prop, false);
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
@@ -357,6 +380,10 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
|
||||
"audio_buffer_size");
|
||||
int video_buffer_size = (int)obs_data_get_int(settings,
|
||||
"video_buffer_size");
|
||||
enum AVDiscard frame_drop =
|
||||
(enum AVDiscard)obs_data_get_int(settings,
|
||||
"frame_drop");
|
||||
|
||||
if (audio_buffer_size < 1) {
|
||||
audio_buffer_size = 1;
|
||||
blog(LOG_WARNING, "invalid audio_buffer_size %d",
|
||||
@@ -369,6 +396,12 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
|
||||
}
|
||||
s->demuxer->options.audio_frame_queue_size = audio_buffer_size;
|
||||
s->demuxer->options.video_frame_queue_size = video_buffer_size;
|
||||
|
||||
if (frame_drop < AVDISCARD_NONE || frame_drop > AVDISCARD_ALL) {
|
||||
frame_drop = AVDISCARD_NONE;
|
||||
blog(LOG_WARNING, "invalid frame_drop %d", frame_drop);
|
||||
}
|
||||
s->demuxer->options.frame_drop = frame_drop;
|
||||
}
|
||||
|
||||
ff_demuxer_set_callbacks(&s->demuxer->video_callbacks,
|
||||
|
Reference in New Issue
Block a user