From 8b6f0e1f5f24aa02310bcafbbf1bb9ccaec9ebc1 Mon Sep 17 00:00:00 2001 From: Michel Promonet Date: Sun, 29 Mar 2015 09:09:57 +0000 Subject: [PATCH] fix NAL splitting --- inc/H264_V4l2DeviceSource.h | 2 +- src/H264_V4l2DeviceSource.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/inc/H264_V4l2DeviceSource.h b/inc/H264_V4l2DeviceSource.h index 0b88ffa..8340d60 100644 --- a/inc/H264_V4l2DeviceSource.h +++ b/inc/H264_V4l2DeviceSource.h @@ -29,7 +29,7 @@ class H264_V4L2DeviceSource : public V4L2DeviceSource H264_V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, bool useThread); 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 virtual std::list< std::pair > splitFrames(unsigned char* frame, unsigned frameSize); diff --git a/src/H264_V4l2DeviceSource.cpp b/src/H264_V4l2DeviceSource.cpp index 4794c7f..f56acbd 100644 --- a/src/H264_V4l2DeviceSource.cpp +++ b/src/H264_V4l2DeviceSource.cpp @@ -77,21 +77,21 @@ std::list< std::pair > H264_V4L2DeviceSource::splitFrames LOG(NOTICE) << m_auxLine; } - frameSize -= size+sizeof(H264marker); buffer = this->extractFrame(&buffer[size], frameSize, size); } return frameList; } // 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; outsize = 0; if ( (size>= sizeof(H264marker)) && (memcmp(frame,H264marker,sizeof(H264marker)) == 0) ) { + size -= sizeof(H264marker); outFrame = &frame[sizeof(H264marker)]; - outsize = size - sizeof(H264marker); + outsize = size; for (int i=0; i+sizeof(H264marker) < size; ++i) { if (memcmp(&outFrame[i],H264marker,sizeof(H264marker)) == 0) @@ -100,6 +100,7 @@ unsigned char* H264_V4L2DeviceSource::extractFrame(unsigned char* frame, size_t break; } } + size -= outsize; } return outFrame; }