|
|
@@ -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,
|