Skip to content

Commit 106228f

Browse files
authored
provide option for non-standard GStreamer src/mux plugins which have GST_CLOCK_TIME_NONE segment start (#658)
1 parent d3ba97b commit 106228f

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/gstreamer/gstkvssink.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_kvs_sink_debug);
8989
#define DEFAULT_FRAGMENT_ACKS TRUE
9090
#define DEFAULT_RESTART_ON_ERROR TRUE
9191
#define DEFAULT_RECALCULATE_METRICS TRUE
92+
#define DEFAULT_DISABLE_BUFFER_CLIPPING FALSE
9293
#define DEFAULT_STREAM_FRAMERATE 25
9394
#define DEFAULT_STREAM_FRAMERATE_HIGH_DENSITY 100
9495
#define DEFAULT_AVG_BANDWIDTH_BPS (4 * 1024 * 1024)
@@ -158,7 +159,8 @@ enum {
158159
PROP_CREDENTIAL_FILE_PATH,
159160
PROP_IOT_CERTIFICATE,
160161
PROP_STREAM_TAGS,
161-
PROP_FILE_START_TIME
162+
PROP_FILE_START_TIME,
163+
PROP_DISABLE_BUFFER_CLIPPING
162164
};
163165

164166
#define GST_TYPE_KVS_SINK_STREAMING_TYPE (gst_kvs_sink_streaming_type_get_type())
@@ -380,7 +382,7 @@ void create_kinesis_video_stream(GstKvsSink *kvssink) {
380382
if (data->media_type == AUDIO_VIDEO) {
381383
stream_definition->addTrack(KVS_SINK_DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, kvssink->audio_codec_id, MKV_TRACK_INFO_TYPE_AUDIO);
382384
// Need to reorder frames to avoid fragment overlap error.
383-
stream_definition->setFrameOrderMode(FRAME_ORDERING_MODE_MULTI_TRACK_AV_COMPARE_PTS_ONE_MS_COMPENSATE);
385+
stream_definition->setFrameOrderMode(FRAME_ORDERING_MODE_MULTI_TRACK_AV_COMPARE_PTS_ONE_MS_COMPENSATE_EOFR);
384386
}
385387

386388
data->kinesis_video_stream = data->kinesis_video_producer->createStreamSync(move(stream_definition));
@@ -558,6 +560,11 @@ gst_kvs_sink_class_init(GstKvsSinkClass *klass) {
558560
"Epoch time that the file starts in kinesis video stream. By default, current time is used. Unit: Seconds",
559561
0, G_MAXULONG, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
560562

563+
g_object_class_install_property (gobject_class, PROP_DISABLE_BUFFER_CLIPPING,
564+
g_param_spec_boolean ("disable-buffer-clipping", "Disable Buffer Clipping",
565+
"Set to true only if your src/mux elements produce GST_CLOCK_TIME_NONE for segment start times. It is non-standard behavior to set this to true, only use if there are known issues with your src/mux segment start/stop times.", DEFAULT_DISABLE_BUFFER_CLIPPING,
566+
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
567+
561568
gst_element_class_set_static_metadata(gstelement_class,
562569
"KVS Sink",
563570
"Sink/Video/Network",
@@ -575,9 +582,6 @@ gst_kvs_sink_class_init(GstKvsSinkClass *klass) {
575582
static void
576583
gst_kvs_sink_init(GstKvsSink *kvssink) {
577584
kvssink->collect = gst_collect_pads_new();
578-
579-
gst_collect_pads_set_clip_function (kvssink->collect,
580-
GST_DEBUG_FUNCPTR (gst_collect_pads_clip_running_time), kvssink);
581585
gst_collect_pads_set_buffer_function (kvssink->collect,
582586
GST_DEBUG_FUNCPTR (gst_kvs_sink_handle_buffer), kvssink);
583587
gst_collect_pads_set_event_function (kvssink->collect,
@@ -606,6 +610,7 @@ gst_kvs_sink_init(GstKvsSink *kvssink) {
606610
kvssink->buffer_duration_seconds = DEFAULT_BUFFER_DURATION_SECONDS;
607611
kvssink->replay_duration_seconds = DEFAULT_REPLAY_DURATION_SECONDS;
608612
kvssink->connection_staleness_seconds = DEFAULT_CONNECTION_STALENESS_SECONDS;
613+
kvssink->disable_buffer_clipping = DEFAULT_DISABLE_BUFFER_CLIPPING;
609614
kvssink->codec_id = g_strdup (DEFAULT_CODEC_ID_H264);
610615
kvssink->track_name = g_strdup (DEFAULT_TRACKNAME);
611616
kvssink->access_key = g_strdup (DEFAULT_ACCESS_KEY);
@@ -772,6 +777,14 @@ gst_kvs_sink_set_property(GObject *object, guint prop_id,
772777
case PROP_FILE_START_TIME:
773778
kvssink->file_start_time = g_value_get_uint64 (value);
774779
break;
780+
case PROP_DISABLE_BUFFER_CLIPPING: {
781+
kvssink->disable_buffer_clipping = g_value_get_boolean(value);
782+
if (kvssink->disable_buffer_clipping == FALSE) {
783+
gst_collect_pads_set_clip_function(kvssink->collect,
784+
GST_DEBUG_FUNCPTR(gst_collect_pads_clip_running_time), kvssink);
785+
}
786+
break;
787+
}
775788
default:
776789
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
777790
break;
@@ -876,6 +889,9 @@ gst_kvs_sink_get_property(GObject *object, guint prop_id, GValue *value,
876889
case PROP_FILE_START_TIME:
877890
g_value_set_uint64 (value, kvssink->file_start_time);
878891
break;
892+
case PROP_DISABLE_BUFFER_CLIPPING:
893+
g_value_set_boolean (value, kvssink->disable_buffer_clipping);
894+
break;
879895
default:
880896
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
881897
break;
@@ -1071,7 +1087,7 @@ gst_kvs_sink_handle_buffer (GstCollectPads * pads,
10711087
(GST_BUFFER_FLAG_IS_SET(buf, GST_BUFFER_FLAG_HEADER) && (!GST_BUFFER_PTS_IS_VALID(buf) || !GST_BUFFER_DTS_IS_VALID(buf)));
10721088

10731089
if (isDroppable) {
1074-
LOG_DEBUG("Dropping frame with flag %u" << GST_BUFFER_FLAGS(buf));
1090+
LOG_DEBUG("Dropping frame with flag: " << GST_BUFFER_FLAGS(buf));
10751091
goto CleanUp;
10761092
}
10771093

src/gstreamer/gstkvssink.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ struct _GstKvsSink {
101101
gboolean fragment_acks;
102102
gboolean restart_on_error;
103103
gboolean recalculate_metrics;
104+
gboolean disable_buffer_clipping;
104105
guint framerate;
105106
guint avg_bandwidth_bps;
106107
guint buffer_duration_seconds;

0 commit comments

Comments
 (0)