From 5e0dd60adbbebcb3a9a8f42cad4c94acb8954c0e Mon Sep 17 00:00:00 2001 From: Bruno Date: Sat, 1 May 2021 15:35:36 +0200 Subject: [PATCH] re-open should not change gl texture rename 'ready' to 'opened' to avoid confusion --- MediaPlayer.cpp | 29 +++++++++++++---------------- MediaPlayer.h | 2 +- NetworkSource.cpp | 2 +- Stream.cpp | 41 +++++++++++++++++++++-------------------- Stream.h | 2 +- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/MediaPlayer.cpp b/MediaPlayer.cpp index 78bff04..0a54053 100644 --- a/MediaPlayer.cpp +++ b/MediaPlayer.cpp @@ -31,7 +31,7 @@ MediaPlayer::MediaPlayer() uri_ = "undefined"; pipeline_ = nullptr; - ready_ = false; + opened_ = false; enabled_ = true; desired_state_ = GST_STATE_PAUSED; @@ -65,6 +65,9 @@ MediaPlayer::~MediaPlayer() if (textureindex_) glDeleteTextures(1, &textureindex_); + // cleanup picture buffer + if (pbo_[0]) + glDeleteBuffers(2, pbo_); } void MediaPlayer::accept(Visitor& v) { @@ -401,7 +404,7 @@ void MediaPlayer::execute_open() Log::Info("MediaPlayer %s Timeline [%ld %ld] %ld frames, %d gaps", std::to_string(id_).c_str(), timeline_.begin(), timeline_.end(), timeline_.numFrames(), timeline_.numGaps()); - ready_ = true; + opened_ = true; // register media player MediaPlayer::registered_.push_back(this); @@ -409,7 +412,7 @@ void MediaPlayer::execute_open() bool MediaPlayer::isOpen() const { - return ready_; + return opened_; } bool MediaPlayer::failed() const @@ -427,7 +430,7 @@ void MediaPlayer::Frame::unmap() void MediaPlayer::close() { // not openned? - if (!ready_) { + if (!opened_) { // wait for loading to finish if (discoverer_.valid()) discoverer_.wait(); @@ -436,7 +439,7 @@ void MediaPlayer::close() } // un-ready the media player - ready_ = false; + opened_ = false; // clean up GST if (pipeline_ != nullptr) { @@ -464,12 +467,6 @@ void MediaPlayer::close() write_index_ = 0; last_index_ = 0; - // cleanup picture buffer - if (pbo_[0]) - glDeleteBuffers(2, pbo_); - pbo_size_ = 0; - pbo_index_ = 0; - pbo_next_index_ = 0; #ifdef MEDIA_PLAYER_DEBUG Log::Info("MediaPlayer %s closed", std::to_string(id_).c_str()); @@ -508,7 +505,7 @@ GstClockTime MediaPlayer::position() void MediaPlayer::enable(bool on) { - if ( !ready_ || pipeline_ == nullptr) + if ( !opened_ || pipeline_ == nullptr) return; if ( enabled_ != on ) { @@ -832,7 +829,7 @@ void MediaPlayer::update() return; // not ready yet - if (!ready_) { + if (!opened_) { if (discoverer_.valid()) { // try to get info from discoverer if (discoverer_.wait_for( std::chrono::milliseconds(4) ) == std::future_status::ready ) @@ -1156,7 +1153,7 @@ bool MediaPlayer::fill_frame(GstBuffer *buf, FrameStatus status) void MediaPlayer::callback_end_of_stream (GstAppSink *, gpointer p) { MediaPlayer *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { m->fill_frame(NULL, MediaPlayer::EOS); } } @@ -1173,7 +1170,7 @@ GstFlowReturn MediaPlayer::callback_new_preroll (GstAppSink *sink, gpointer p) // send frames to media player only if ready MediaPlayer *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { // get buffer from sample GstBuffer *buf = gst_sample_get_buffer (sample); @@ -1208,7 +1205,7 @@ GstFlowReturn MediaPlayer::callback_new_sample (GstAppSink *sink, gpointer p) // send frames to media player only if ready MediaPlayer *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { // get buffer from sample (valid until sample is released) GstBuffer *buf = gst_sample_get_buffer (sample) ; diff --git a/MediaPlayer.h b/MediaPlayer.h index 65f12db..7c9e70f 100644 --- a/MediaPlayer.h +++ b/MediaPlayer.h @@ -285,7 +285,7 @@ private: GstState desired_state_; GstElement *pipeline_; GstVideoInfo v_frame_video_info_; - std::atomic ready_; + std::atomic opened_; std::atomic failed_; bool seeking_; bool enabled_; diff --git a/NetworkSource.cpp b/NetworkSource.cpp index 91d2c65..f50c1f6 100644 --- a/NetworkSource.cpp +++ b/NetworkSource.cpp @@ -204,7 +204,7 @@ void NetworkStream::update() { Stream::update(); - if ( !ready_ && !failed_ && received_config_) + if ( !opened_ && !failed_ && received_config_) { // only once received_config_ = false; diff --git a/Stream.cpp b/Stream.cpp index a72defd..e05a611 100644 --- a/Stream.cpp +++ b/Stream.cpp @@ -28,7 +28,7 @@ Stream::Stream() description_ = "undefined"; pipeline_ = nullptr; - ready_ = false; + opened_ = false; enabled_ = true; desired_state_ = GST_STATE_PAUSED; @@ -55,6 +55,14 @@ Stream::Stream() Stream::~Stream() { close(); + + // cleanup opengl texture + if (textureindex_) + glDeleteTextures(1, &textureindex_); + + // cleanup picture buffer + if (pbo_[0]) + glDeleteBuffers(2, pbo_); } void Stream::accept(Visitor& v) { @@ -94,7 +102,7 @@ std::string Stream::description() const void Stream::execute_open() { // reset - ready_ = false; + opened_ = false; // Add custom app sink to the gstreamer pipeline string description = description_; @@ -183,12 +191,12 @@ void Stream::execute_open() // all good Log::Info("Stream %s Opened '%s' (%d x %d)", std::to_string(id_).c_str(), description.c_str(), width_, height_); - ready_ = true; + opened_ = true; } bool Stream::isOpen() const { - return ready_; + return opened_; } bool Stream::failed() const @@ -206,13 +214,15 @@ void Stream::Frame::unmap() void Stream::close() { // not openned? - if (!ready_) { + if (!opened_) { // nothing else to change return; } // un-ready - ready_ = false; + opened_ = false; + single_frame_ = false; + live_ = false; // clean up GST if (pipeline_ != nullptr) { @@ -239,15 +249,6 @@ void Stream::close() write_index_ = 0; last_index_ = 0; - // cleanup opengl texture - if (textureindex_) - glDeleteTextures(1, &textureindex_); - textureindex_ = 0; - - // cleanup picture buffer - if (pbo_[0]) - glDeleteBuffers(2, pbo_); - pbo_size_ = 0; } @@ -268,7 +269,7 @@ float Stream::aspectRatio() const void Stream::enable(bool on) { - if ( !ready_ || pipeline_ == nullptr) + if ( !opened_ || pipeline_ == nullptr) return; if ( enabled_ != on ) { @@ -483,7 +484,7 @@ void Stream::update() return; // not ready yet - if (!ready_){ + if (!opened_){ // wait next frame to display return; } @@ -636,7 +637,7 @@ bool Stream::fill_frame(GstBuffer *buf, FrameStatus status) void Stream::callback_end_of_stream (GstAppSink *, gpointer p) { Stream *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { m->fill_frame(NULL, Stream::EOS); } } @@ -652,7 +653,7 @@ GstFlowReturn Stream::callback_new_preroll (GstAppSink *sink, gpointer p) if (sample != NULL) { // send frames to media player only if ready Stream *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { // get buffer from sample GstBuffer *buf = gst_sample_get_buffer (sample); @@ -686,7 +687,7 @@ GstFlowReturn Stream::callback_new_sample (GstAppSink *sink, gpointer p) // send frames to media player only if ready Stream *m = static_cast(p); - if (m && m->ready_) { + if (m && m->opened_) { // get buffer from sample (valid until sample is released) GstBuffer *buf = gst_sample_get_buffer (sample) ; diff --git a/Stream.h b/Stream.h index aa8f78a..e879dc2 100644 --- a/Stream.h +++ b/Stream.h @@ -129,7 +129,7 @@ protected: GstState desired_state_; GstElement *pipeline_; GstVideoInfo v_frame_video_info_; - std::atomic ready_; + std::atomic opened_; std::atomic failed_; bool enabled_;