// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#include "mp2_server_media_subsession.hh"
|
#include "MPEG1or2AudioRTPSink.hh"
|
|
#include "utils.h"
|
namespace easymedia
|
{
|
MP2ServerMediaSubsession* MP2ServerMediaSubsession::createNew(UsageEnvironment& env, Live555MediaInput& wisInput)
|
{
|
return new MP2ServerMediaSubsession(env, wisInput);
|
}
|
|
MP2ServerMediaSubsession::MP2ServerMediaSubsession(UsageEnvironment& env, Live555MediaInput& mediaInput)
|
: OnDemandServerMediaSubsession(env, True /*reuse the first source*/), fMediaInput(mediaInput)
|
{
|
}
|
|
MP2ServerMediaSubsession::~MP2ServerMediaSubsession()
|
{
|
LOG_FILE_FUNC_LINE();
|
}
|
|
FramedSource* MP2ServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate)
|
{
|
LOG_FILE_FUNC_LINE();
|
estBitrate = 128; // kbps, estimate
|
return fMediaInput.audioSource();
|
}
|
|
RTPSink* MP2ServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock,
|
unsigned char /*rtpPayloadTypeIfDynamic*/,
|
FramedSource* inputSource)
|
{
|
if (!inputSource) {
|
LOG("inputSource is not ready, can not create new rtp sink\n");
|
return NULL;
|
}
|
setAudioRTPSinkBufferSize();
|
RTPSink* rtpsink = MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock);
|
setVideoRTPSinkBufferSize();
|
return rtpsink;
|
}
|
|
// std::mutex MP2ServerMediaSubsession::kMutex;
|
void MP2ServerMediaSubsession::startStream(unsigned clientSessionId, void* streamToken, TaskFunc* rtcpRRHandler,
|
void* rtcpRRHandlerClientData, unsigned short& rtpSeqNum,
|
unsigned& rtpTimestamp,
|
ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
|
void* serverRequestAlternativeByteHandlerClientData)
|
{
|
OnDemandServerMediaSubsession::startStream(clientSessionId, streamToken, rtcpRRHandler, rtcpRRHandlerClientData,
|
rtpSeqNum, rtpTimestamp, serverRequestAlternativeByteHandler,
|
serverRequestAlternativeByteHandlerClientData);
|
// kMutex.lock();
|
if (kSessionIdList.empty()) {
|
fMediaInput.Start(envir());
|
}
|
if (fMediaInput.GetStartAudioStreamCallback() != NULL) {
|
fMediaInput.GetStartAudioStreamCallback()();
|
}
|
LOG("%s - clientSessionId: 0x%08x\n", __func__, clientSessionId);
|
kSessionIdList.push_back(clientSessionId);
|
// kMutex.unlock();
|
}
|
void MP2ServerMediaSubsession::deleteStream(unsigned clientSessionId, void*& streamToken)
|
{
|
// kMutex.lock();
|
LOG("%s - clientSessionId: 0x%08x\n", __func__, clientSessionId);
|
kSessionIdList.remove(clientSessionId);
|
if (kSessionIdList.empty()) {
|
fMediaInput.Stop(envir());
|
}
|
// kMutex.unlock();
|
OnDemandServerMediaSubsession::deleteStream(clientSessionId, streamToken);
|
}
|
|
} // namespace easymedia
|