fix NAL splitting

pull/33/head
Michel Promonet 9 years ago
parent 9eb6a1ac46
commit 8b6f0e1f5f

@ -29,7 +29,7 @@ class H264_V4L2DeviceSource : public V4L2DeviceSource
H264_V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, bool useThread); H264_V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, bool useThread);
virtual ~H264_V4L2DeviceSource(); virtual ~H264_V4L2DeviceSource();
unsigned char* extractFrame(unsigned char* frame, size_t size, size_t& outsize); unsigned char* extractFrame(unsigned char* frame, size_t& size, size_t& outsize);
// overide V4L2DeviceSource // overide V4L2DeviceSource
virtual std::list< std::pair<unsigned char*,size_t> > splitFrames(unsigned char* frame, unsigned frameSize); virtual std::list< std::pair<unsigned char*,size_t> > splitFrames(unsigned char* frame, unsigned frameSize);

@ -77,21 +77,21 @@ std::list< std::pair<unsigned char*,size_t> > H264_V4L2DeviceSource::splitFrames
LOG(NOTICE) << m_auxLine; LOG(NOTICE) << m_auxLine;
} }
frameSize -= size+sizeof(H264marker);
buffer = this->extractFrame(&buffer[size], frameSize, size); buffer = this->extractFrame(&buffer[size], frameSize, size);
} }
return frameList; return frameList;
} }
// extract a frame // extract a frame
unsigned char* H264_V4L2DeviceSource::extractFrame(unsigned char* frame, size_t size, size_t& outsize) unsigned char* H264_V4L2DeviceSource::extractFrame(unsigned char* frame, size_t& size, size_t& outsize)
{ {
unsigned char * outFrame = NULL; unsigned char * outFrame = NULL;
outsize = 0; outsize = 0;
if ( (size>= sizeof(H264marker)) && (memcmp(frame,H264marker,sizeof(H264marker)) == 0) ) if ( (size>= sizeof(H264marker)) && (memcmp(frame,H264marker,sizeof(H264marker)) == 0) )
{ {
size -= sizeof(H264marker);
outFrame = &frame[sizeof(H264marker)]; outFrame = &frame[sizeof(H264marker)];
outsize = size - sizeof(H264marker); outsize = size;
for (int i=0; i+sizeof(H264marker) < size; ++i) for (int i=0; i+sizeof(H264marker) < size; ++i)
{ {
if (memcmp(&outFrame[i],H264marker,sizeof(H264marker)) == 0) if (memcmp(&outFrame[i],H264marker,sizeof(H264marker)) == 0)
@ -100,6 +100,7 @@ unsigned char* H264_V4L2DeviceSource::extractFrame(unsigned char* frame, size_t
break; break;
} }
} }
size -= outsize;
} }
return outFrame; return outFrame;
} }

Loading…
Cancel
Save