cleanup and add AAC support. Also stop source threads

This commit is contained in:
Isaac Connor 2021-01-22 20:23:30 -05:00
parent afc7c86eac
commit 9d2598da13
1 changed files with 9 additions and 34 deletions

View File

@ -1,6 +1,7 @@
#include "zm_rtsp_server_thread.h" #include "zm_rtsp_server_thread.h"
#include "zm_rtsp_server_device_source.h" #include "zm_rtsp_server_device_source.h"
#include "zm_rtsp_server_h264_device_source.h" #include "zm_rtsp_server_h264_device_source.h"
#include "zm_rtsp_server_adts_source.h"
#include "zm_rtsp_server_unicast_server_media_subsession.h" #include "zm_rtsp_server_unicast_server_media_subsession.h"
#include <StreamReplicator.hh> #include <StreamReplicator.hh>
@ -58,6 +59,9 @@ int RTSPServerThread::run() {
void RTSPServerThread::stop() { void RTSPServerThread::stop() {
Debug(1, "RTSPServerThread::stop()"); Debug(1, "RTSPServerThread::stop()");
terminate = 1; terminate = 1;
for ( std::list<FramedSource *>::iterator it = sources.begin(); it != sources.end(); ++it ) {
(*it)->stopGettingFrames();
}
} // end RTSPServerThread::stop() } // end RTSPServerThread::stop()
bool RTSPServerThread::stopped() const { bool RTSPServerThread::stopped() const {
@ -90,7 +94,6 @@ void RTSPServerThread::addStream(AVStream *stream, AVStream *audio_stream) {
source = H265_ZoneMinderDeviceSource::createNew(*env, monitor, stream, queueSize, repeatConfig, muxTS); source = H265_ZoneMinderDeviceSource::createNew(*env, monitor, stream, queueSize, repeatConfig, muxTS);
} }
if ( source == nullptr ) { if ( source == nullptr ) {
//LOG(ERROR) << "Unable to create source for device " << camera_name.c_str() << std::endl;
Error("Unable to create source"); Error("Unable to create source");
} else { } else {
videoReplicator = StreamReplicator::createNew(*env, source, false); videoReplicator = StreamReplicator::createNew(*env, source, false);
@ -98,11 +101,9 @@ void RTSPServerThread::addStream(AVStream *stream, AVStream *audio_stream) {
sources.push_back(source); sources.push_back(source);
// Create Unicast Session // Create Unicast Session
//std::list<ServerMediaSubsession*> subSessions;
if ( videoReplicator ) { if ( videoReplicator ) {
if ( !sms ) if ( !sms )
sms = ServerMediaSession::createNew(*env, "streamname"); sms = ServerMediaSession::createNew(*env, "streamname");
//sms->addSubsession(ServerMediaSubsession::createNew(*env, videoReplicator, rtpFormat));
sms->addSubsession(UnicastServerMediaSubsession::createNew(*env, videoReplicator, rtpFormat)); sms->addSubsession(UnicastServerMediaSubsession::createNew(*env, videoReplicator, rtpFormat));
} }
} }
@ -111,10 +112,11 @@ void RTSPServerThread::addStream(AVStream *stream, AVStream *audio_stream) {
FramedSource *source = nullptr; FramedSource *source = nullptr;
rtpFormat = getRtpFormat(audio_stream->codecpar->codec_id, false); rtpFormat = getRtpFormat(audio_stream->codecpar->codec_id, false);
if ( rtpFormat == "audio/AAC" ) { if ( rtpFormat == "audio/AAC" ) {
//source = AAC_ZoneMinderDeviceSource::createNew(*env, monitor, stream->index, queueSize, repeatConfig, muxTS); source = ADTS_ZoneMinderDeviceSource::createNew(*env, monitor, audio_stream, queueSize);
Debug(1, "ADTS source %p", source);
} }
if ( source ) { if ( source ) {
replicator = StreamReplicator::createNew(*env, source, false); replicator = StreamReplicator::createNew(*env, source, false /* deleteWhenLastReplicaDies */);
sources.push_back(source); sources.push_back(source);
} }
if ( replicator ) { if ( replicator ) {
@ -122,42 +124,15 @@ void RTSPServerThread::addStream(AVStream *stream, AVStream *audio_stream) {
sms = ServerMediaSession::createNew(*env, "streamname"); sms = ServerMediaSession::createNew(*env, "streamname");
sms->addSubsession(UnicastServerMediaSubsession::createNew(*env, replicator, rtpFormat)); sms->addSubsession(UnicastServerMediaSubsession::createNew(*env, replicator, rtpFormat));
} }
} else {
Debug(1, "Not Adding auto stream");
} }
rtspServer->addServerMediaSession(sms); rtspServer->addServerMediaSession(sms);
char *url = rtspServer->rtspURL(sms); char *url = rtspServer->rtspURL(sms);
Debug(1, "url is %s", url); Debug(1, "url is %s", url);
*env << "ZoneMinder Media Server at " << url << "\n";
delete[] url; delete[] url;
} // end void addStream } // end void addStream
int RTSPServerThread::addSession(
const std::string & sessionName,
const std::list<ServerMediaSubsession*> & subSession
) {
int nbSubsession = 0;
if ( subSession.empty() == false ) {
UsageEnvironment& env(rtspServer->envir());
ServerMediaSession* sms = ServerMediaSession::createNew(env, sessionName.c_str());
if ( sms != nullptr ) {
std::list<ServerMediaSubsession*>::const_iterator subIt;
for ( subIt = subSession.begin(); subIt != subSession.end(); ++subIt ) {
sms->addSubsession(*subIt);
nbSubsession ++;
}
rtspServer->addServerMediaSession(sms);
char* url = rtspServer->rtspURL(sms);
if ( url != nullptr ) {
Info("Play this stream using the URL %s", url);
delete[] url;
url = nullptr;
}
} // end if sms
} // end if subSession
return nbSubsession;
}
// ----------------------------------------- // -----------------------------------------
// convert V4L2 pix format to RTP mime // convert V4L2 pix format to RTP mime
// ----------------------------------------- // -----------------------------------------