mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
ensure execute open immediately
and various code cleanup
This commit is contained in:
27
Stream.cpp
27
Stream.cpp
@@ -28,15 +28,15 @@ Stream::Stream()
|
|||||||
|
|
||||||
description_ = "undefined";
|
description_ = "undefined";
|
||||||
pipeline_ = nullptr;
|
pipeline_ = nullptr;
|
||||||
|
ready_ = false;
|
||||||
|
enabled_ = true;
|
||||||
|
desired_state_ = GST_STATE_PAUSED;
|
||||||
|
|
||||||
width_ = -1;
|
width_ = -1;
|
||||||
height_ = -1;
|
height_ = -1;
|
||||||
single_frame_ = false;
|
single_frame_ = false;
|
||||||
live_ = false;
|
live_ = false;
|
||||||
ready_ = false;
|
|
||||||
failed_ = false;
|
failed_ = false;
|
||||||
enabled_ = true;
|
|
||||||
desired_state_ = GST_STATE_PAUSED;
|
|
||||||
|
|
||||||
// start index in frame_ stack
|
// start index in frame_ stack
|
||||||
write_index_ = 0;
|
write_index_ = 0;
|
||||||
@@ -81,6 +81,8 @@ void Stream::open(const std::string &gstreamer_description, int w, int h)
|
|||||||
if (isOpen())
|
if (isOpen())
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
// open the stream
|
||||||
|
execute_open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -108,6 +110,7 @@ void Stream::execute_open()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g_object_set(G_OBJECT(pipeline_), "name", std::to_string(id_).c_str(), NULL);
|
g_object_set(G_OBJECT(pipeline_), "name", std::to_string(id_).c_str(), NULL);
|
||||||
|
gst_pipeline_set_auto_flush_bus( GST_PIPELINE(pipeline_), true);
|
||||||
|
|
||||||
// GstCaps *caps = gst_static_caps_get (&frame_render_caps);
|
// GstCaps *caps = gst_static_caps_get (&frame_render_caps);
|
||||||
string capstring = "video/x-raw,format=RGBA,width="+ std::to_string(width_) +
|
string capstring = "video/x-raw,format=RGBA,width="+ std::to_string(width_) +
|
||||||
@@ -137,14 +140,13 @@ void Stream::execute_open()
|
|||||||
#ifdef USE_GST_APPSINK_CALLBACKS
|
#ifdef USE_GST_APPSINK_CALLBACKS
|
||||||
// set the callbacks
|
// set the callbacks
|
||||||
GstAppSinkCallbacks callbacks;
|
GstAppSinkCallbacks callbacks;
|
||||||
|
callbacks.new_preroll = callback_new_preroll;
|
||||||
if (single_frame_) {
|
if (single_frame_) {
|
||||||
callbacks.new_preroll = callback_new_preroll;
|
|
||||||
callbacks.eos = NULL;
|
callbacks.eos = NULL;
|
||||||
callbacks.new_sample = NULL;
|
callbacks.new_sample = NULL;
|
||||||
Log::Info("Stream %s contains a single frame", std::to_string(id_).c_str());
|
Log::Info("Stream %s contains a single frame", std::to_string(id_).c_str());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
callbacks.new_preroll = callback_new_preroll;
|
|
||||||
callbacks.eos = callback_end_of_stream;
|
callbacks.eos = callback_end_of_stream;
|
||||||
callbacks.new_sample = callback_new_sample;
|
callbacks.new_sample = callback_new_sample;
|
||||||
}
|
}
|
||||||
@@ -175,13 +177,13 @@ void Stream::execute_open()
|
|||||||
// instruct the sink to send samples synched in time if not live source
|
// instruct the sink to send samples synched in time if not live source
|
||||||
gst_base_sink_set_sync (GST_BASE_SINK(sink), !live_);
|
gst_base_sink_set_sync (GST_BASE_SINK(sink), !live_);
|
||||||
|
|
||||||
// all good
|
|
||||||
Log::Info("Stream %s Opened '%s' (%d x %d)", std::to_string(id_).c_str(), description.c_str(), width_, height_);
|
|
||||||
ready_ = true;
|
|
||||||
|
|
||||||
// done with refs
|
// done with refs
|
||||||
gst_object_unref (sink);
|
gst_object_unref (sink);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
// all good
|
||||||
|
Log::Info("Stream %s Opened '%s' (%d x %d)", std::to_string(id_).c_str(), description.c_str(), width_, height_);
|
||||||
|
ready_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Stream::isOpen() const
|
bool Stream::isOpen() const
|
||||||
@@ -196,10 +198,9 @@ bool Stream::failed() const
|
|||||||
|
|
||||||
void Stream::Frame::unmap()
|
void Stream::Frame::unmap()
|
||||||
{
|
{
|
||||||
if ( full ) {
|
if ( full )
|
||||||
gst_video_frame_unmap(&vframe);
|
gst_video_frame_unmap(&vframe);
|
||||||
full = false;
|
full = false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stream::close()
|
void Stream::close()
|
||||||
@@ -483,8 +484,6 @@ void Stream::update()
|
|||||||
|
|
||||||
// not ready yet
|
// not ready yet
|
||||||
if (!ready_){
|
if (!ready_){
|
||||||
// open the stream
|
|
||||||
execute_open();
|
|
||||||
// wait next frame to display
|
// wait next frame to display
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user