浏览代码

obs-ffmpeg: Add frame drop controls to the ffmpeg source UI

John Bradley 10 年之前
父节点
当前提交
17f8e3c58b
共有 2 个文件被更改,包括 41 次插入0 次删除
  1. 8 0
      plugins/obs-ffmpeg/data/locale/en-US.ini
  2. 33 0
      plugins/obs-ffmpeg/obs-ffmpeg-source.c

+ 8 - 0
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!)"

+ 33 - 0
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,