Skip to content

Commit

Permalink
Messy commit, but working, need to cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
stefankiesz committed Feb 1, 2024
1 parent c7a09be commit 3e63221
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 50 deletions.
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,9 @@ if(BUILD_GSTREAMER_PLUGIN)
add_executable(kvs_gstreamer_file_uploader_sample samples/kvs_gstreamer_file_uploader_sample.cpp)
target_link_libraries(kvs_gstreamer_file_uploader_sample ${GST_APP_LIBRARIES})

add_executable(gstreamer_sandbox samples/gstreamer_sandbox.cpp)
target_link_libraries(gstreamer_sandbox ${GST_APP_LIBRARIES} KinesisVideoProducer)

install(
TARGETS gstkvssink
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
Expand Down
146 changes: 146 additions & 0 deletions samples/gstreamer_sandbox.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#include <gst/gst.h>
#include <string.h>
#include <chrono>
#include <Logger.h>
#include "KinesisVideoProducer.h"
#include <vector>
#include <stdlib.h>
#include <mutex>
#include <IotCertCredentialProvider.h>
#include "gstreamer/gstkvssink.h"
#include <thread>
#include "include.h"

using namespace log4cplus;

LOGGER_TAG("com.amazonaws.kinesis.video.gstreamer");



typedef struct _CustomData
{
gboolean is_live;
GstElement *pipeline;
GMainLoop *loop;
} CustomData;

static void cb_message(GstBus *bus, GstMessage *msg, CustomData *data)
{

switch (GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_ERROR:
{
GError *err;
gchar *debug;

gst_message_parse_error(msg, &err, &debug);
g_print("Error: %s\n", err->message);
g_error_free(err);
g_free(debug);

gst_element_set_state(data->pipeline, GST_STATE_READY);
g_main_loop_quit(data->loop);
break;
}
case GST_MESSAGE_EOS:
/* end-of-stream */
gst_element_set_state(data->pipeline, GST_STATE_READY);
g_main_loop_quit(data->loop);
break;
case GST_MESSAGE_BUFFERING:
{
gint percent = 0;

/* If the stream is live, we do not care about buffering. */
if (data->is_live)
break;

gst_message_parse_buffering(msg, &percent);
g_print("Buffering (%3d%%)\r", percent);
/* Wait until buffering is complete before start/resume playing */
if (percent < 100)
gst_element_set_state(data->pipeline, GST_STATE_PAUSED);
else
gst_element_set_state(data->pipeline, GST_STATE_PLAYING);
break;
}
case GST_MESSAGE_CLOCK_LOST:
/* Get a new clock */
gst_element_set_state(data->pipeline, GST_STATE_PAUSED);
gst_element_set_state(data->pipeline, GST_STATE_PLAYING);
break;
default:
/* Unhandled message */
break;
}
}

void sleeper(CustomData *data) {
sleep(10);
LOG_DEBUG("Pausing...");
gst_element_set_state(gst_bin_get_by_name(GST_BIN(data->pipeline), "source"), GST_STATE_PAUSED);
// gst_element_set_state(data->pipeline, GST_STATE_PAUSED);
sleep(10);
LOG_DEBUG("Playing...");
gst_element_set_state(gst_bin_get_by_name(GST_BIN(data->pipeline), "source"), GST_STATE_PLAYING);
// gst_element_set_state(data->pipeline, GST_STATE_PLAYING);


}

int main(int argc, char *argv[])
{
GstElement *pipeline;
GstBus *bus;
GstStateChangeReturn ret;
GMainLoop *main_loop;
CustomData data;


/* Initialize GStreamer */
gst_init(&argc, &argv);

/* Initialize our data structure */
memset(&data, 0, sizeof(data));

/* Build the pipeline */
pipeline = gst_parse_launch("autovideosrc name=source ! videoconvert ! video/x-raw,format=I420 ! x264enc bframes=0 bitrate=1000 tune=zerolatency ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! decodebin ! videoconvert ! clockoverlay ! autovideosink", NULL);
// pipeline = gst_parse_launch("autovideosrc name=source ! videoconvert ! video/x-raw,format=I420 ! x264enc bframes=0 bitrate=512 tune=zerolatency sync-lookahead=0 ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! \
kvssink stream-name=aTestStream storage-size=128", NULL);
bus = gst_element_get_bus(pipeline);

/* Start playing */
ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);

if (ret == GST_STATE_CHANGE_FAILURE)
{
g_printerr("Unable to set the pipeline to the playing state.\n");
gst_object_unref(pipeline);
return -1;
}
else if (ret == GST_STATE_CHANGE_NO_PREROLL)
{
data.is_live = TRUE;
}

main_loop = g_main_loop_new(NULL, FALSE);
data.loop = main_loop;
data.pipeline = pipeline;

gst_bus_add_signal_watch(bus);
g_signal_connect(bus, "message", G_CALLBACK(cb_message), &data);

std::thread sleepThread(sleeper, &data);

g_main_loop_run (main_loop);

sleepThread.join();

/* Free resources */
g_main_loop_unref(main_loop);
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
78 changes: 62 additions & 16 deletions samples/kvssink_gstreamer_sample.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ typedef struct _CustomData {
int max_runtime;

GstElement* source_element;
GstElement* encoder_element;

} CustomData;

// CustomData
Expand Down Expand Up @@ -263,7 +265,6 @@ int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElem
return 1;
}
kvssink = gst_element_factory_make("kvssink", "kvssink");
//kvssink = gst_element_factory_make("autovideosink", "kvssink");
if (!kvssink) {
LOG_ERROR("Failed to create kvssink");
return 1;
Expand Down Expand Up @@ -320,6 +321,18 @@ int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElem

encoder = gst_element_factory_make("x264enc", "encoder");

GstElement* decodebin = gst_element_factory_make("decodebin", "decodebin");
if (!decodebin ) {
g_printerr("Not all elements could be created. decodebin\n");
return 1;
}

GstElement* autovideosink = gst_element_factory_make("autovideosink", "autovideosink");
if (!autovideosink ) {
g_printerr("Not all elements could be created. autovideosink\n");
return 1;
}


if (!pipeline || !source || !clock_overlay || !source_filter || !encoder || !filter || !kvssink || !h264parse) {
g_printerr("Not all elements could be created.\n");
Expand Down Expand Up @@ -350,12 +363,13 @@ int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElem
gst_caps_unref(query_caps_raw);

/* configure encoder */
g_object_set(G_OBJECT(encoder), "bframes", 0, "bitrate", 512, NULL);
g_object_set(G_OBJECT(encoder), "bframes", 0, "bitrate", 512, "key-int-max", 40, NULL);

/* configure output filter */
GstCaps *h264_caps = gst_caps_new_simple("video/x-h264",
"stream-format", G_TYPE_STRING, "avc",
"alignment", G_TYPE_STRING, "au",
"framerate", GST_TYPE_FRACTION, 20, 1,
NULL);
//gst_caps_set_simple(h264_caps, "profile", G_TYPE_STRING, "baseline", NULL);
g_object_set(G_OBJECT(filter), "caps", h264_caps, NULL);
Expand All @@ -366,6 +380,17 @@ int gstreamer_live_source_init(int argc, char *argv[], CustomData *data, GstElem
determine_credentials(kvssink, data);

data->source_element = source;
data->encoder_element = encoder;

GstElement* queue = gst_element_factory_make("queue", "queue");

GstElement* matroskamux = gst_element_factory_make("matroskamux", "matroskamux");
GstElement* filesink = gst_element_factory_make("filesink", "filesink");
g_object_set(G_OBJECT(filesink), "location", "footage.mkv", NULL);





/* build the pipeline */
gst_bin_add_many(GST_BIN(pipeline), source, clock_overlay, video_convert, source_filter, encoder, filter,
Expand Down Expand Up @@ -484,34 +509,55 @@ int gstreamer_init(int argc, char *argv[], CustomData *data) {
// while(data_global.stream_status != STATUS_KVS_GSTREAMER_SAMPLE_INTERRUPTED) {
// count++;
// LOG_DEBUG("Play/Pause count: " << count);
for (int i = 0; i < 5; i++) {


sleep(10);

GstEvent* flush_start;
GstEvent* flush_stop;

// GstEvent* eos;
GstEvent* eos;


// ./kvssink_gstreamer_sample aTestStream video-only devicesrc
/*
export GST_PLUGIN_PATH=`pwd`/build
export LD_LIBRARY_PATH=`pwd`/open-source/local/lib
*/


LOG_DEBUG("Pausing...");


// sleep(2);
gst_element_set_state(data->source_element, GST_STATE_NULL);
flush_start = gst_event_new_flush_start();
gst_element_send_event(pipeline, flush_start);

// eos = gst_event_new_eos();
// gst_element_send_event(pipeline, eos);

sleep(10);
//sleep(2);
// gst_element_set_state(data->source_element, GST_STATE_PAUSED);
// gst_element_set_state(pipeline, GST_STATE_PAUSED);



eos = gst_event_new_eos();
gst_element_send_event(data->source_element, eos);


// 9864, 9902, 9912

sleep(10);
LOG_DEBUG("Playing...");
// sleep(2);
// // sleep(2);

// gst_element_set_state(data->encoder_element, GST_STATE_READY);
// gst_element_set_state(data->encoder_element, GST_STATE_PAUSED);

// gst_element_set_state(data->source_element, GST_STATE_PLAYING);
flush_start = gst_event_new_flush_start();
gst_element_send_event(pipeline, flush_start);
flush_stop = gst_event_new_flush_stop(true);
gst_element_send_event(pipeline, flush_stop);
gst_element_set_state(data->source_element, GST_STATE_PLAYING);



gst_element_set_state(pipeline, GST_STATE_PLAYING);
}

// LOG_DEBUG("Pausing...");
// flush_start = gst_event_new_flush_start();
Expand Down
Loading

0 comments on commit 3e63221

Please sign in to comment.