// // H264FramedSource.cpp // FFmpegRTSPServer // // Created by Mina Saad on 9/22/15. // Copyright (c) 2015 Mina Saad. All rights reserved. // #include #include "H264FramedSource.h" using namespace MESAI; H264FramedSource * H264FramedSource::createNew(UsageEnvironment& env, const FrameCallbacks& _cbs) { return new H264FramedSource(env, _cbs); } H264FramedSource::H264FramedSource(UsageEnvironment& env, const FrameCallbacks& _cbs) : FramedSource(env), spsBase64(), ppsBase64(), cbs(_cbs) { } H264FramedSource::~H264FramedSource() { } std::string H264FramedSource::getAuxLine() const { std::ostringstream oss; //a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AHpW4KA9oQAABwgAAV+QB,aO48gA== oss << "a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=" << spsBase64 << "," << ppsBase64 << "\r\n"; return oss.str(); } void H264FramedSource::doGetNextFrame() { if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet uint8_t* newFrameDataStart = nullptr; size_t newFrameSize = 0; if (cbs.deliverFrameCallback(cbs.args, newFrameDataStart, newFrameSize, fPresentationTime)) { if (newFrameDataStart != NULL && newFrameSize > 0) { if (newFrameSize > fMaxSize) { fFrameSize = fMaxSize; fNumTruncatedBytes = newFrameSize - fMaxSize; } else { fFrameSize = newFrameSize; } memcpy(fTo, newFrameDataStart, fFrameSize); } else { fFrameSize = 0; fTo = NULL; handleClosure(this); } cbs.releaseFrameCallback(cbs.args); } else { fFrameSize = 0; } if(fFrameSize > 0) FramedSource::afterGetting(this); }