// 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 "mjpeg_server_media_subsession.hh" #include #include "media_type.h" #include "utils.h" namespace easymedia { MJPEGServerMediaSubsession* MJPEGServerMediaSubsession::createNew(UsageEnvironment& env, Live555MediaInput& wisInput) { return new MJPEGServerMediaSubsession(env, wisInput); } MJPEGServerMediaSubsession::MJPEGServerMediaSubsession(UsageEnvironment& env, Live555MediaInput& mediaInput) : OnDemandServerMediaSubsession(env, True /*reuse the first source*/), fMediaInput(mediaInput), fEstimatedKbps(1000) { } MJPEGServerMediaSubsession::~MJPEGServerMediaSubsession() { LOG_FILE_FUNC_LINE(); } void MJPEGServerMediaSubsession::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); if (kSessionIdList.empty()) { fMediaInput.Start(envir()); } if (fMediaInput.GetStartVideoStreamCallback() != NULL) { fMediaInput.GetStartVideoStreamCallback()(); } LOG("%s - clientSessionId: 0x%08x\n", __func__, clientSessionId); kSessionIdList.push_back(clientSessionId); } void MJPEGServerMediaSubsession::deleteStream(unsigned clientSessionId, void*& streamToken) { LOG("%s - clientSessionId: 0x%08x\n", __func__, clientSessionId); kSessionIdList.remove(clientSessionId); if (kSessionIdList.empty()) { fMediaInput.Stop(envir()); } OnDemandServerMediaSubsession::deleteStream(clientSessionId, streamToken); } FramedSource* MJPEGServerMediaSubsession::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { estBitrate = fEstimatedKbps; LOG_FILE_FUNC_LINE(); if (!fSDPLines && clientSessionId != 0) { LOG("%s:%s:%d --- you must get sdp first.\n", __FILE__, __func__, __LINE__); return NULL; } // Create a framer for the Video Elementary Stream: FramedSource* source = MJPEGVideoSource::createNew(envir(), fMediaInput.videoSource(CODEC_TYPE_JPEG)); LOG("MJPEG framedsource : %p\n", source); return source; } RTPSink* MJPEGServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char, FramedSource* inputSource) { if (!inputSource) { LOG("inputSource is not ready, can not create new rtp sink\n"); return NULL; } setVideoRTPSinkBufferSize(); LOG_FILE_FUNC_LINE(); RTPSink* rtp_sink = JPEGVideoRTPSink::createNew(envir(), rtpGroupsock); LOG("MJPEG rtp sink : %p\n", rtp_sink); return rtp_sink; } } // namespace easymedia