Skip to content

Commit c32c70e

Browse files
committed
images in kvssink via callback
1 parent 7cc63fd commit c32c70e

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

samples/kvssink_gstreamer_sample.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,18 @@ static void put_metadata(GstElement* element) {
333333
}
334334
}
335335

336+
std::tuple<std::string, std::string, bool> get_images_metadata() {
337+
std::ostringstream metadata_name_stream, metadata_value_stream;
338+
std::tuple<std::string, std::string, bool> images_metadata;
339+
340+
metadata_name_stream << "support_images_name_" << data_global.metadata_counter;
341+
metadata_value_stream << "support_images_value_" << data_global.metadata_counter;
342+
343+
data_global.metadata_counter++;
344+
345+
return std::make_tuple(metadata_name_stream.str(), metadata_value_stream.str(), false);
346+
}
347+
336348
int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElement *pipeline, GstElement *kvssink) {
337349

338350
bool vtenc = false, isOnRpi = false;
@@ -587,7 +599,7 @@ int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElem
587599
gst_caps_unref(h264_caps);
588600

589601
/* configure kvssink */
590-
g_object_set(G_OBJECT(kvssink), "stream-name", data->stream_name, "storage-size", 128, NULL);
602+
g_object_set(G_OBJECT(kvssink), "stream-name", data->stream_name, "storage-size", 128, "support-images-callback", (gpointer) get_images_metadata, NULL);
591603
determine_credentials(kvssink, data);
592604

593605
/* build the pipeline */

src/gstreamer/gstkvssink.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ enum {
181181
PROP_STREAM_TAGS,
182182
PROP_FILE_START_TIME,
183183
PROP_DISABLE_BUFFER_CLIPPING,
184+
PROP_SUPPORT_IMAGES_CALLBACK,
184185
PROP_USE_ORIGINAL_PTS,
185186
PROP_GET_METRICS,
186187
PROP_ALLOW_CREATE_STREAM,
@@ -665,6 +666,11 @@ gst_kvs_sink_class_init(GstKvsSinkClass *klass) {
665666
"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,
666667
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
667668

669+
g_object_class_install_property (gobject_class, PROP_SUPPORT_IMAGES_CALLBACK,
670+
g_param_spec_pointer ("support-images-callback", "Support images",
671+
"Set to true only if you want to enable KVS events in fragment metadata.",
672+
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
673+
668674
g_object_class_install_property (gobject_class, PROP_USE_ORIGINAL_PTS,
669675
g_param_spec_boolean ("use-original-pts", "Use Original PTS",
670676
"Set to true only if you want to use the original presentation time stamp on the buffer and that timestamp is expected to be a valid epoch value in nanoseconds. Most encoders will not have a valid PTS", DEFAULT_USE_ORIGINAL_PTS,
@@ -899,6 +905,9 @@ gst_kvs_sink_set_property(GObject *object, guint prop_id,
899905
case PROP_STORAGE_SIZE:
900906
kvssink->storage_size = g_value_get_uint (value);
901907
break;
908+
case PROP_SUPPORT_IMAGES_CALLBACK:
909+
kvssink->support_images_callback = (SupportImagesCallback) g_value_get_pointer(value);
910+
break;
902911
case PROP_STOP_STREAM_TIMEOUT:
903912
kvssink->stop_stream_timeout = g_value_get_uint (value);
904913
break;
@@ -1045,6 +1054,9 @@ gst_kvs_sink_get_property(GObject *object, guint prop_id, GValue *value,
10451054
case PROP_STORAGE_SIZE:
10461055
g_value_set_uint (value, kvssink->storage_size);
10471056
break;
1057+
case PROP_SUPPORT_IMAGES_CALLBACK:
1058+
g_value_set_pointer (value, (gpointer) kvssink->support_images_callback);
1059+
break;
10481060
case PROP_STOP_STREAM_TIMEOUT:
10491061
g_value_set_uint (value, kvssink->stop_stream_timeout);
10501062
break;
@@ -1372,6 +1384,12 @@ gst_kvs_sink_handle_buffer (GstCollectPads * pads,
13721384
std::chrono::nanoseconds(buf->pts),
13731385
std::chrono::nanoseconds(buf->dts), kinesis_video_flags, track_id, data->frame_count);
13741386
data->frame_count++;
1387+
1388+
if (CHECK_FRAME_FLAG_KEY_FRAME(kinesis_video_flags) && kvssink->support_images_callback != NULL) {
1389+
std::tuple<std::string, std::string, bool> metadata = kvssink->support_images_callback();
1390+
put_fragment_metadata(GST_ELEMENT_CAST (kvssink), std::get<0>(metadata), std::get<1>(metadata),
1391+
std::get<2>(metadata));
1392+
}
13751393
}
13761394
else {
13771395
LOG_WARN("GStreamer buffer is invalid for " << kvssink->stream_name);

src/gstreamer/gstkvssink.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <string.h>
3737
#include <mutex>
3838
#include <atomic>
39+
#include <tuple>
3940
#include <gst/base/gstcollectpads.h>
4041
#include <unordered_set>
4142

@@ -73,6 +74,8 @@ typedef struct _GstKvsSinkClass GstKvsSinkClass;
7374
typedef struct _KvsSinkCustomData KvsSinkCustomData;
7475
typedef struct _KvsSinkMetric KvsSinkMetric;
7576

77+
typedef std::tuple<std::string, std::string, bool> (*SupportImagesCallback)();
78+
7679
/* all information needed for one track */
7780
typedef struct _GstKvsSinkTrackData {
7881
GstCollectData collect; /* we extend the CollectData */
@@ -143,8 +146,9 @@ struct _GstKvsSink {
143146
guint num_streams;
144147
guint num_audio_streams;
145148
guint num_video_streams;
146-
147-
149+
150+
SupportImagesCallback support_images_callback;
151+
148152
std::unique_ptr<Credentials> credentials_;
149153
std::shared_ptr<KvsSinkCustomData> data;
150154
};

0 commit comments

Comments
 (0)