|
@@ -91,6 +91,7 @@ struct rtmp_stream {
|
|
|
int64_t pframe_drop_threshold_usec;
|
|
|
int64_t pframe_min_drop_dts_usec;
|
|
|
int min_priority;
|
|
|
+ float congestion;
|
|
|
|
|
|
int64_t last_dts_usec;
|
|
|
|
|
@@ -883,8 +884,11 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
|
|
stream->pframe_drop_threshold_usec :
|
|
|
stream->drop_threshold_usec;
|
|
|
|
|
|
- if (num_packets < 5)
|
|
|
+ if (num_packets < 5) {
|
|
|
+ if (!pframes)
|
|
|
+ stream->congestion = 0.0f;
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
circlebuf_peek_front(&stream->packets, &first, sizeof(first));
|
|
|
|
|
@@ -896,6 +900,11 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
|
|
* sent is higher than threshold, drop frames */
|
|
|
buffer_duration_usec = stream->last_dts_usec - first.dts_usec;
|
|
|
|
|
|
+ if (!pframes) {
|
|
|
+ stream->congestion = (float)buffer_duration_usec /
|
|
|
+ (float)drop_threshold;
|
|
|
+ }
|
|
|
+
|
|
|
if (buffer_duration_usec > drop_threshold) {
|
|
|
debug("buffer_duration_usec: %" PRId64, buffer_duration_usec);
|
|
|
drop_frames(stream, name, priority, p_min_dts_usec);
|
|
@@ -998,6 +1007,12 @@ static int rtmp_stream_dropped_frames(void *data)
|
|
|
return stream->dropped_frames;
|
|
|
}
|
|
|
|
|
|
+static float rtmp_stream_congestion(void *data)
|
|
|
+{
|
|
|
+ struct rtmp_stream *stream = data;
|
|
|
+ return stream->min_priority > 0 ? 1.0f : stream->congestion;
|
|
|
+}
|
|
|
+
|
|
|
struct obs_output_info rtmp_output_info = {
|
|
|
.id = "rtmp_output",
|
|
|
.flags = OBS_OUTPUT_AV |
|
|
@@ -1013,5 +1028,6 @@ struct obs_output_info rtmp_output_info = {
|
|
|
.get_defaults = rtmp_stream_defaults,
|
|
|
.get_properties = rtmp_stream_properties,
|
|
|
.get_total_bytes = rtmp_stream_total_bytes_sent,
|
|
|
+ .get_congestion = rtmp_stream_congestion,
|
|
|
.get_dropped_frames = rtmp_stream_dropped_frames
|
|
|
};
|