CTranscoder::m_Stream is a std::list<std::shared_ptr<CCodecStream>>

pull/1/head
Tom Early 5 years ago
parent 78b3489904
commit 62e0b18c82

@ -66,11 +66,11 @@ protected:
bool m_bOpen; bool m_bOpen;
uint16 m_uiStreamId; uint16 m_uiStreamId;
uint32 m_uiPacketCntr; uint32 m_uiPacketCntr;
std::shared_ptr<CClient> m_OwnerClient;
CTimePoint m_LastPacketTime; CTimePoint m_LastPacketTime;
CDvHeaderPacket m_DvHeader; CDvHeaderPacket m_DvHeader;
std::shared_ptr<CClient> m_OwnerClient;
#ifdef TRANSCODER_IP #ifdef TRANSCODER_IP
CCodecStream *m_CodecStream; std::shared_ptr<CCodecStream> m_CodecStream;
#endif #endif
}; };

@ -121,14 +121,7 @@ void CTranscoder::Close(void)
// close all streams // close all streams
m_Mutex.lock(); 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(); m_Mutex.unlock();
// kill threads // kill threads
@ -202,12 +195,10 @@ void CTranscoder::Task(void)
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
// manage streams // manage streams
CCodecStream *CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecIn) std::shared_ptr<CCodecStream> CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecIn)
{ {
CBuffer Buffer; CBuffer Buffer;
CCodecStream *stream = nullptr;
// do we need transcoding // do we need transcoding
if ( uiCodecIn != CODEC_NONE ) if ( uiCodecIn != CODEC_NONE )
{ {
@ -226,29 +217,31 @@ CCodecStream *CTranscoder::GetStream(CPacketStream *PacketStream, uint8 uiCodecI
std::cout << "ambed openstream ok" << std::endl; std::cout << "ambed openstream ok" << std::endl;
// create stream object // create stream object
stream = new CCodecStream(PacketStream, m_StreamidOpenStream, uiCodecIn, (uiCodecIn == CODEC_AMBEPLUS) ? CODEC_AMBE2PLUS : CODEC_AMBEPLUS); auto stream = std::make_shared<CCodecStream>(PacketStream, m_StreamidOpenStream, uiCodecIn, (uiCodecIn == CODEC_AMBEPLUS) ? CODEC_AMBE2PLUS : CODEC_AMBEPLUS);
// init it if ( stream ) {
if ( stream->Init(m_PortOpenStream) ) if ( stream->Init(m_PortOpenStream) )
{ {
// and append to list // and append to list
Lock(); Lock();
m_Streams.push_back(stream); m_Streams.push_back(stream);
Unlock(); Unlock();
return stream;
} }
else else
{ {
// send close packet // send close packet
EncodeClosestreamPacket(&Buffer, stream->GetStreamId()); EncodeClosestreamPacket(&Buffer, stream->GetStreamId());
m_Socket.Send(Buffer, m_Ip, TRANSCODER_PORT); m_Socket.Send(Buffer, m_Ip, TRANSCODER_PORT);
// and delete stream.reset();
delete stream;
stream = nullptr;
} }
} }
else
std::cerr << "ERROR: Unable to make a new CCodecStream" << std::endl;
}
else 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 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<CCodecStream> stream)
{ {
CBuffer Buffer; CBuffer Buffer;
if ( stream != nullptr ) if ( stream )
{ {
// look for the stream // look for the stream
bool found = false; bool found = false;
@ -301,7 +294,6 @@ void CTranscoder::ReleaseStream(CCodecStream *stream)
// and close it // and close it
(*it)->Close(); (*it)->Close();
delete (*it);
m_Streams.erase(it); m_Streams.erase(it);
break; break;
} }

@ -60,8 +60,8 @@ public:
bool IsConnected(void) const { return m_bConnected; } bool IsConnected(void) const { return m_bConnected; }
// manage streams // manage streams
CCodecStream *GetStream(CPacketStream *, uint8); std::shared_ptr<CCodecStream> GetStream(CPacketStream *, uint8);
void ReleaseStream(CCodecStream *); void ReleaseStream(std::shared_ptr<CCodecStream>);
// task // task
void Thread(void); void Thread(void);
@ -84,7 +84,7 @@ protected:
protected: protected:
// streams // streams
std::mutex m_Mutex; std::mutex m_Mutex;
std::list<CCodecStream *> m_Streams; std::list<std::shared_ptr<CCodecStream>> m_Streams;
// sync objects for Openstream // sync objects for Openstream
CSemaphore m_SemaphoreOpenStream; CSemaphore m_SemaphoreOpenStream;

Loading…
Cancel
Save

Powered by TurnKey Linux.