diff --git a/plugins/obs-ffmpeg/data/locale/en-US.ini b/plugins/obs-ffmpeg/data/locale/en-US.ini index df3d306e1..e8c7a0d69 100644 --- a/plugins/obs-ffmpeg/data/locale/en-US.ini +++ b/plugins/obs-ffmpeg/data/locale/en-US.ini @@ -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!)" diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-source.c b/plugins/obs-ffmpeg/obs-ffmpeg-source.c index 11faa8b72..da22f3f28 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-source.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-source.c @@ -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,