From d6872af0a263aaa294692ea7534a6d3b58656845 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 12 May 2017 22:01:16 -0700 Subject: [PATCH] obs-ffmpeg: Implement get_total_bytes in recording outputs Allows seeing statistics such as bitrate and total bytes saved for recording outputs. --- plugins/obs-ffmpeg/obs-ffmpeg-mux.c | 12 ++++++++++++ plugins/obs-ffmpeg/obs-ffmpeg-output.c | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index 5d5d5338e..286ae1326 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -39,6 +39,7 @@ struct ffmpeg_muxer { obs_output_t *output; os_process_pipe_t *pipe; int64_t stop_ts; + uint64_t total_bytes; struct dstr path; bool sent_headers; volatile bool active; @@ -292,6 +293,7 @@ static bool ffmpeg_mux_start(void *data) /* write headers and start capture */ os_atomic_set_bool(&stream->active, true); os_atomic_set_bool(&stream->capturing, true); + stream->total_bytes = 0; obs_output_begin_data_capture(stream->output, 0); info("Writing file '%s'...", stream->path.array); @@ -374,6 +376,7 @@ static bool write_packet(struct ffmpeg_muxer *stream, return false; } + stream->total_bytes += packet->size; return true; } @@ -460,6 +463,12 @@ static obs_properties_t *ffmpeg_mux_properties(void *unused) return props; } +static uint64_t ffmpeg_mux_total_bytes(void *data) +{ + struct ffmpeg_muxer *stream = data; + return stream->total_bytes; +} + struct obs_output_info ffmpeg_muxer = { .id = "ffmpeg_muxer", .flags = OBS_OUTPUT_AV | @@ -471,6 +480,7 @@ struct obs_output_info ffmpeg_muxer = { .start = ffmpeg_mux_start, .stop = ffmpeg_mux_stop, .encoded_packet = ffmpeg_mux_data, + .get_total_bytes= ffmpeg_mux_total_bytes, .get_properties = ffmpeg_mux_properties }; @@ -542,6 +552,7 @@ static bool replay_buffer_start(void *data) os_atomic_set_bool(&stream->active, true); os_atomic_set_bool(&stream->capturing, true); + stream->total_bytes = 0; obs_output_begin_data_capture(stream->output, 0); return true; @@ -811,5 +822,6 @@ struct obs_output_info replay_buffer = { .start = replay_buffer_start, .stop = ffmpeg_mux_stop, .encoded_packet = replay_buffer_data, + .get_total_bytes= ffmpeg_mux_total_bytes, .get_defaults = replay_buffer_defaults }; diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c index fd200d3a9..6cee35702 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c @@ -91,6 +91,8 @@ struct ffmpeg_output { bool connecting; pthread_t start_thread; + uint64_t total_bytes; + uint64_t audio_start_ts; uint64_t video_start_ts; uint64_t stop_ts; @@ -893,6 +895,8 @@ static int process_packet(struct ffmpeg_output *output) } } + output->total_bytes += packet.size; + ret = av_interleaved_write_frame(output->ff_data.output, &packet); if (ret < 0) { av_free_packet(&packet); @@ -1051,6 +1055,7 @@ static bool ffmpeg_output_start(void *data) os_atomic_set_bool(&output->stopping, false); output->audio_start_ts = 0; output->video_start_ts = 0; + output->total_bytes = 0; ret = pthread_create(&output->start_thread, NULL, start_thread, output); return (output->connecting = (ret == 0)); @@ -1100,6 +1105,12 @@ static void ffmpeg_deactivate(struct ffmpeg_output *output) ffmpeg_data_free(&output->ff_data); } +static uint64_t ffmpeg_output_total_bytes(void *data) +{ + struct ffmpeg_output *output = data; + return output->total_bytes; +} + struct obs_output_info ffmpeg_output = { .id = "ffmpeg_output", .flags = OBS_OUTPUT_AUDIO | OBS_OUTPUT_VIDEO, @@ -1110,4 +1121,5 @@ struct obs_output_info ffmpeg_output = { .stop = ffmpeg_output_stop, .raw_video = receive_video, .raw_audio = receive_audio, + .get_total_bytes = ffmpeg_output_total_bytes, };