Jelajahi Sumber

obs-outputs: Don't set DTS offset for enhanced FLV SEQ start/end packets

Sequence start and end packets never have a valid DTS, but with a
non-zero offset the timestamp in the packet would end up also being
non-zero, which leads to librtmp attempting to calculate a timestamp
delta and underflowing.

As a fix, simply remove the ability to even set a DTS offset for
start/end packets and always keep it at zero.
derrod 2 tahun lalu
induk
melakukan
72759ae69d

+ 4 - 6
plugins/obs-outputs/flv-mux.c

@@ -361,10 +361,9 @@ void flv_packet_ex(struct encoder_packet *packet, enum video_id_t codec_id,
 }
 
 void flv_packet_start(struct encoder_packet *packet, enum video_id_t codec,
-		      int32_t dts_offset, uint8_t **output, size_t *size)
+		      uint8_t **output, size_t *size)
 {
-	flv_packet_ex(packet, codec, dts_offset, output, size,
-		      PACKETTYPE_SEQ_START);
+	flv_packet_ex(packet, codec, 0, output, size, PACKETTYPE_SEQ_START);
 }
 
 void flv_packet_frames(struct encoder_packet *packet, enum video_id_t codec,
@@ -381,10 +380,9 @@ void flv_packet_frames(struct encoder_packet *packet, enum video_id_t codec,
 }
 
 void flv_packet_end(struct encoder_packet *packet, enum video_id_t codec,
-		    int32_t dts_offset, uint8_t **output, size_t *size)
+		    uint8_t **output, size_t *size)
 {
-	flv_packet_ex(packet, codec, dts_offset, output, size,
-		      PACKETTYPE_SEQ_END);
+	flv_packet_ex(packet, codec, 0, output, size, PACKETTYPE_SEQ_END);
 }
 
 void flv_packet_metadata(enum video_id_t codec_id, uint8_t **output,

+ 3 - 3
plugins/obs-outputs/flv-mux.h

@@ -61,13 +61,13 @@ extern void flv_additional_packet_mux(struct encoder_packet *packet,
 				      size_t index);
 // Y2023 spec
 extern void flv_packet_start(struct encoder_packet *packet,
-			     enum video_id_t codec, int32_t dts_offset,
-			     uint8_t **output, size_t *size);
+			     enum video_id_t codec, uint8_t **output,
+			     size_t *size);
 extern void flv_packet_frames(struct encoder_packet *packet,
 			      enum video_id_t codec, int32_t dts_offset,
 			      uint8_t **output, size_t *size);
 extern void flv_packet_end(struct encoder_packet *packet, enum video_id_t codec,
-			   int32_t dts_offset, uint8_t **output, size_t *size);
+			   uint8_t **output, size_t *size);
 extern void flv_packet_metadata(enum video_id_t codec, uint8_t **output,
 				size_t *size, int bits_per_raw_sample,
 				uint8_t color_primaries, int color_trc,

+ 2 - 4
plugins/obs-outputs/rtmp-stream.c

@@ -490,11 +490,9 @@ static int send_packet_ex(struct rtmp_stream *stream,
 		return -1;
 
 	if (is_header) {
-		flv_packet_start(packet, stream->video_codec,
-				 stream->start_dts_offset, &data, &size);
+		flv_packet_start(packet, stream->video_codec, &data, &size);
 	} else if (is_footer) {
-		flv_packet_end(packet, stream->video_codec,
-			       stream->start_dts_offset, &data, &size);
+		flv_packet_end(packet, stream->video_codec, &data, &size);
 	} else {
 		flv_packet_frames(packet, stream->video_codec,
 				  stream->start_dts_offset, &data, &size);