diff --git a/src/cpacketstream.h b/src/cpacketstream.h index bc06a73..3ad3ee6 100644 --- a/src/cpacketstream.h +++ b/src/cpacketstream.h @@ -66,11 +66,11 @@ protected: bool m_bOpen; uint16 m_uiStreamId; uint32 m_uiPacketCntr; - std::shared_ptr m_OwnerClient; CTimePoint m_LastPacketTime; CDvHeaderPacket m_DvHeader; + std::shared_ptr m_OwnerClient; #ifdef TRANSCODER_IP - CCodecStream *m_CodecStream; + std::shared_ptr m_CodecStream; #endif }; diff --git a/src/ctranscoder.cpp b/src/ctranscoder.cpp index 2b66916..7bedfb3 100644 --- a/src/ctranscoder.cpp +++ b/src/ctranscoder.cpp @@ -121,14 +121,7 @@ void CTranscoder::Close(void) // close all streams m_Mutex.lock(); - { - for ( auto it=m_Streams.begin(); it!=m_Streams.end(); it++ ) - { - delete *it; - } - m_Streams.clear(); - - } + m_Streams.clear(); m_Mutex.unlock(); // kill threads @@ -202,12 +195,10 @@ void CTranscoder::Task(void) //////////////////////////////////////////////////////////////////////////////////////// // manage streams -CCodecStream *CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecIn) +std::shared_ptr CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecIn) { CBuffer Buffer; - CCodecStream *stream = nullptr; - // do we need transcoding if ( uiCodecIn != CODEC_NONE ) { @@ -226,29 +217,31 @@ CCodecStream *CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecI std::cout << "ambed openstream ok" << std::endl; // create stream object - stream = new CCodecStream(PacketStream, m_StreamidOpenStream, uiCodecIn, (uiCodecIn == CODEC_AMBEPLUS) ? CODEC_AMBE2PLUS : CODEC_AMBEPLUS); - - // init it - if ( stream->Init(m_PortOpenStream) ) - { - // and append to list - Lock(); - m_Streams.push_back(stream); - Unlock(); + auto stream = std::make_shared(PacketStream, m_StreamidOpenStream, uiCodecIn, (uiCodecIn == CODEC_AMBEPLUS) ? CODEC_AMBE2PLUS : CODEC_AMBEPLUS); + + if ( stream ) { + if ( stream->Init(m_PortOpenStream) ) + { + // and append to list + Lock(); + m_Streams.push_back(stream); + Unlock(); + return stream; + } + else + { + // send close packet + EncodeClosestreamPacket(&Buffer, stream->GetStreamId()); + m_Socket.Send(Buffer, m_Ip, TRANSCODER_PORT); + stream.reset(); + } } else - { - // send close packet - EncodeClosestreamPacket(&Buffer, stream->GetStreamId()); - m_Socket.Send(Buffer, m_Ip, TRANSCODER_PORT); - // and delete - delete stream; - stream = nullptr; - } + std::cerr << "ERROR: Unable to make a new CCodecStream" << std::endl; } else { - std::cout << "ambed openstream failed (no suitable channel available)" << std::endl; + std::cerr << "ERROR: Ambed openstream failed (no suitable channel available)" << std::endl; } } else @@ -258,14 +251,14 @@ CCodecStream *CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecI } } - return stream; + return nullptr; } -void CTranscoder::ReleaseStream(CCodecStream *stream) +void CTranscoder::ReleaseStream(std::shared_ptr stream) { CBuffer Buffer; - if ( stream != nullptr ) + if ( stream ) { // look for the stream bool found = false; @@ -301,7 +294,6 @@ void CTranscoder::ReleaseStream(CCodecStream *stream) // and close it (*it)->Close(); - delete (*it); m_Streams.erase(it); break; } diff --git a/src/ctranscoder.h b/src/ctranscoder.h index bb67fef..9e40260 100644 --- a/src/ctranscoder.h +++ b/src/ctranscoder.h @@ -60,8 +60,8 @@ public: bool IsConnected(void) const { return m_bConnected; } // manage streams - CCodecStream *GetStream(CPacketStream *, uint8); - void ReleaseStream(CCodecStream *); + std::shared_ptr GetStream(CPacketStream *, uint8); + void ReleaseStream(std::shared_ptr); // task void Thread(void); @@ -83,8 +83,8 @@ protected: protected: // streams - std::mutex m_Mutex; - std::list m_Streams; + std::mutex m_Mutex; + std::list> m_Streams; // sync objects for Openstream CSemaphore m_SemaphoreOpenStream;