// // FFmpegH264Source.cpp // FFmpegRTSPServer // // Created by Mina Saad on 9/22/15. // Copyright (c) 2015 Mina Saad. All rights reserved. // #include "FFmpegH264Source.h" namespace MESAI { FFmpegH264Source * FFmpegH264Source::createNew(UsageEnvironment& env, IEncoder * E_Source) { return new FFmpegH264Source(env, E_Source); } FFmpegH264Source::FFmpegH264Source(UsageEnvironment& env, IEncoder * E_Source) : FramedSource(env), Encoding_Source(E_Source) { m_eventTriggerId = envir().taskScheduler().createEventTrigger(FFmpegH264Source::deliverFrameStub); std::function callback1 = std::bind(&FFmpegH264Source::onFrame,this); Encoding_Source -> setCallbackFunctionFrameIsReady(callback1); } FFmpegH264Source::~FFmpegH264Source() { } void FFmpegH264Source::doStopGettingFrames() { FramedSource::doStopGettingFrames(); } void FFmpegH264Source::onFrame() { envir().taskScheduler().triggerEvent(m_eventTriggerId, this); } void FFmpegH264Source::doGetNextFrame() { deliverFrame(); } void FFmpegH264Source::deliverFrame() { if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet static uint8_t* newFrameDataStart; static unsigned newFrameSize = 0; /* get the data frame from the Encoding thread.. */ if (Encoding_Source->GetFrame(&newFrameDataStart, &newFrameSize) != 0) { if (newFrameDataStart != NULL && newFrameSize > 0) { /* This should never happen, but check anyway.. */ if (newFrameSize > fMaxSize) { fFrameSize = fMaxSize; fNumTruncatedBytes = newFrameSize - fMaxSize; } else { fFrameSize = newFrameSize; } gettimeofday(&fPresentationTime, NULL); memcpy(fTo, newFrameDataStart, fFrameSize); //delete newFrameDataStart; //newFrameSize = 0; Encoding_Source->ReleaseFrame(); } else { fFrameSize=0; fTo=NULL; handleClosure(this); } } else { fFrameSize = 0; } if(fFrameSize>0) FramedSource::afterGetting(this); } }