Sfoglia il codice sorgente

obs-ffmpeg: Add support for pausing

jp9000 6 anni fa
parent
commit
942ca6f709

+ 14 - 3
plugins/obs-ffmpeg/obs-ffmpeg-mux.c

@@ -515,7 +515,8 @@ static uint64_t ffmpeg_mux_total_bytes(void *data)
 
 struct obs_output_info ffmpeg_muxer = {
 	.id = "ffmpeg_muxer",
-	.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_MULTI_TRACK,
+	.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_MULTI_TRACK |
+		 OBS_OUTPUT_CAN_PAUSE,
 	.get_name = ffmpeg_mux_getname,
 	.create = ffmpeg_mux_create,
 	.destroy = ffmpeg_mux_destroy,
@@ -545,8 +546,17 @@ static void replay_buffer_hotkey(void *data, obs_hotkey_id id,
 		return;
 
 	struct ffmpeg_muxer *stream = data;
-	if (os_atomic_load_bool(&stream->active))
+
+	if (os_atomic_load_bool(&stream->active)) {
+		obs_encoder_t *vencoder =
+			obs_output_get_video_encoder(stream->output);
+		if (obs_encoder_paused(vencoder)) {
+			info("Could not save buffer because encoders paused");
+			return;
+		}
+
 		stream->save_ts = os_gettime_ns() / 1000LL;
+	}
 }
 
 static void save_replay_proc(void *data, calldata_t *cd)
@@ -876,7 +886,8 @@ static void replay_buffer_defaults(obs_data_t *s)
 
 struct obs_output_info replay_buffer = {
 	.id = "replay_buffer",
-	.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_MULTI_TRACK,
+	.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_MULTI_TRACK |
+		 OBS_OUTPUT_CAN_PAUSE,
 	.get_name = replay_buffer_getname,
 	.create = replay_buffer_create,
 	.destroy = replay_buffer_destroy,

+ 6 - 3
plugins/obs-ffmpeg/obs-ffmpeg-output.c

@@ -960,6 +960,7 @@ static uint64_t get_packet_sys_dts(struct ffmpeg_output *output,
 				   AVPacket *packet)
 {
 	struct ffmpeg_data *data = &output->ff_data;
+	uint64_t pause_offset = obs_output_get_pause_offset(output->output);
 	uint64_t start_ts;
 
 	AVRational time_base;
@@ -972,8 +973,9 @@ static uint64_t get_packet_sys_dts(struct ffmpeg_output *output,
 		start_ts = output->audio_start_ts;
 	}
 
-	return start_ts + (uint64_t)av_rescale_q(packet->dts, time_base,
-						 (AVRational){1, 1000000000});
+	return start_ts + pause_offset +
+	       (uint64_t)av_rescale_q(packet->dts, time_base,
+				      (AVRational){1, 1000000000});
 }
 
 static int process_packet(struct ffmpeg_output *output)
@@ -1247,7 +1249,8 @@ static uint64_t ffmpeg_output_total_bytes(void *data)
 
 struct obs_output_info ffmpeg_output = {
 	.id = "ffmpeg_output",
-	.flags = OBS_OUTPUT_AUDIO | OBS_OUTPUT_VIDEO | OBS_OUTPUT_MULTI_TRACK,
+	.flags = OBS_OUTPUT_AUDIO | OBS_OUTPUT_VIDEO | OBS_OUTPUT_MULTI_TRACK |
+		 OBS_OUTPUT_CAN_PAUSE,
 	.get_name = ffmpeg_output_getname,
 	.create = ffmpeg_output_create,
 	.destroy = ffmpeg_output_destroy,