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/inc/AddH26xMarkerFilter.h

72 lines
2.3 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.
**
** AddH26xMarkerFilter.h
**
** -------------------------------------------------------------------------*/
#pragma once
class AddH26xMarkerFilter : public FramedFilter {
public:
AddH26xMarkerFilter (UsageEnvironment& env, FramedSource* inputSource): FramedFilter(env, inputSource) {
m_bufferSize = OutPacketBuffer::maxSize;
m_buffer = new unsigned char[m_bufferSize];
}
virtual ~AddH26xMarkerFilter () {
delete [] m_buffer;
}
private:
static void afterGettingFrame(void* clientData, unsigned frameSize,
unsigned numTruncatedBytes,
struct timeval presentationTime,
unsigned durationInMicroseconds) {
AddH26xMarkerFilter* sink = (AddH26xMarkerFilter*)clientData;
sink->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime);
}
void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime)
{
fPresentationTime = presentationTime;
fDurationInMicroseconds = 0;
if (numTruncatedBytes > 0)
{
envir() << "AddH26xMarkerFilter::afterGettingFrame(): The input frame data was too large for our buffer size truncated:" << numTruncatedBytes << " bufferSize:" << m_bufferSize << "\n";
m_bufferSize += numTruncatedBytes;
delete[] m_buffer;
m_buffer = new unsigned char[m_bufferSize];
fFrameSize = 0;
} else {
char marker[] = {0,0,0,1};
fFrameSize = frameSize + sizeof(marker);
if (fFrameSize > fMaxSize) {
fNumTruncatedBytes = fFrameSize - fMaxSize;
envir() << "AddH26xMarkerFilter::afterGettingFrame(): buffer too small truncated:" << fNumTruncatedBytes << " bufferSize:" << fFrameSize << "\n";
} else {
fNumTruncatedBytes = 0;
memcpy(fTo, marker, sizeof(marker));
memcpy(fTo+sizeof(marker), m_buffer, frameSize);
}
}
afterGetting(this);
}
virtual void doGetNextFrame() {
if (fInputSource != NULL)
{
fInputSource->getNextFrame(m_buffer, m_bufferSize,
afterGettingFrame, this,
handleClosure, this);
}
}
unsigned char* m_buffer;
unsigned int m_bufferSize;
};