You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
v4l2rtspserver/src/TSServerMediaSubsession.cpp

80 lines
2.6 KiB
C++

/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** TSServerMediaSubsession.cpp
**
** -------------------------------------------------------------------------*/
#include "TSServerMediaSubsession.h"
#include "AddH26xMarkerFilter.h"
TSServerMediaSubsession::TSServerMediaSubsession(UsageEnvironment& env, StreamReplicator* videoreplicator, StreamReplicator* audioreplicator, unsigned int sliceDuration)
: UnicastServerMediaSubsession(env, videoreplicator), m_slice(0)
{
// Create a source
FramedSource* source = videoreplicator->createStreamReplica();
MPEG2TransportStreamFromESSource* muxer = MPEG2TransportStreamFromESSource::createNew(env);
if (m_format == "video/H264") {
// add marker
FramedSource* filter = new AddH26xMarkerFilter(env, source);
// mux to TS
muxer->addNewVideoSource(filter, 5);
} else if (m_format == "video/H265") {
// add marker
FramedSource* filter = new AddH26xMarkerFilter(env, source);
// mux to TS
muxer->addNewVideoSource(filter, 6);
}
if (m_format == "audio/MPEG") {
// mux to TS
muxer->addNewAudioSource(source, 1);
}
FramedSource* tsSource = createSource(env, muxer, "video/MP2T");
// Start Playing the HLS Sink
m_hlsSink = MemoryBufferSink::createNew(env, OutPacketBuffer::maxSize, sliceDuration);
m_hlsSink->startPlaying(*tsSource, NULL, NULL);
}
TSServerMediaSubsession::~TSServerMediaSubsession()
{
Medium::close(m_hlsSink);
}
float TSServerMediaSubsession::getCurrentNPT(void* streamToken)
{
return (m_hlsSink->firstTime());
}
float TSServerMediaSubsession::duration() const
{
return (m_hlsSink->duration());
}
void TSServerMediaSubsession::seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes)
{
m_slice = seekNPT / m_hlsSink->getSliceDuration();
seekNPT = m_slice * m_hlsSink->getSliceDuration();
numBytes = m_hlsSink->getBufferSize(m_slice);
std::cout << "seek seekNPT:" << seekNPT << " slice:" << m_slice << " numBytes:" << numBytes << std::endl;
}
FramedSource* TSServerMediaSubsession::getStreamSource(void* streamToken)
{
FramedSource* source = NULL;
std::string buffer = m_hlsSink->getBuffer(m_slice);
unsigned int size = buffer.size();
if ( size != 0 ) {
u_int8_t* content = new u_int8_t[size];
memcpy(content, buffer.c_str(), size);
source = ByteStreamMemoryBufferSource::createNew(envir(), content, size);
}
return source;
}