Why the deepstream is hanging when I pushing mpeg4 data?

I create decode task with cudaVideoCodec_MPEG4:

pDeviceWorker->addDecodeTask(cudaVideoCodec_MPEG4);

,then I using ffmpeg to read a AVPacket from a mpeg4 video(video encoding is mpeg4 )

AVPacket *packet = av_packet_alloc();
int r = av_read_frame(m_pFormatCtx, packet);
if(r >= 0)
{
if(packet->stream_index == m_videoIndex)
{

The program hangs when I push the packet->data to deepstream, stack as below:

Thread 4 (Thread 0x7fffb4af0700 (LWP 5291)):
#0 0x00007ffff2f4cc1d in nanosleep () at …/sysdeps/unix/syscall-template.S:84
#1 0x00007ffff05ed652 in FrameAnalysisModule::runInfer() () from /usr/lib/libdeepstream.so
#2 0x00007ffff2c72c80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff2f436ba in start_thread (arg=0x7fffb4af0700) at pthread_create.c:333
#4 0x00007ffff26e141d in clone () at …/sysdeps/unix/sysv/linux/x86_64/clone.S:109

but if I change decode task to H264, and send H264 video format data, all is ok.

what’s the problem?
deepstream not support MPEG4 video format?

Hi,

DeepStream doesn’t support video files of container formats (eg: mp4) but only raw video files (eg: h264 files).

Thanks.

Thanks for the reply.@AastaLLL

I am not reading MP4 files directly,
I get the video raw data through ffmpeg, then read the original packet data and push it to deepstream.

my code show as below:
bool getData(uint8_t **ppBuf, int *pnBuf)
{
while (true)
{
AVPacket *packet = av_packet_alloc();
int r = av_read_frame(m_pFormatCtx, packet);
if(r >= 0)
{
if(packet->stream_index == m_videoIndex)
{
memcpy(*ppBuf, packet->data, packet->size); //ppBuf already allocated memory
*pnBuf = packet->size;
av_packet_unref(packet);
av_packet_free(&packet);
return true;
}
}
else
{
return false;
}
}
}

Do you have an example of how deepstream handles MPEG4 encoding video? (I mean the video encoding , not the container file format)

Thanks very much.

I think deepstream decode by using NVIDIA Video Codec SDK, but the SDK only supports MPEG-2\VC1\VP8\VP9\H.264\H.265\LOSSLESS, not support MPEG-4, does this mean that deepstream does not support mpeg4?

Does anyone know this?

Hi,

Could you share your DeepStream and Video Codec SDK version with us?
Thanks.

Hi,

DeepStream version is 1.5 and Video Codec SDK version is 8.0.14

CUDA install file is cuda_9.0.176_384.81_linux.run.

Hi,

Thanks for providing your environment detail.
Let us confirm this with our internal team and update information with you.

Thanks.

Hi AastaLLL,

I found that when I tested the H.265/HEVC encoding format, the following error occurred.

[DEBUG][10:18:28] Device name: Tesla K40m
[DEBUG][10:18:29] Use FP32 data type.
[DEBUG][10:18:32] =========== Network Parameters Begin ===========
[DEBUG][10:18:32] Network Input:
[DEBUG][10:18:32]       >Batch   :1
[DEBUG][10:18:32]       >Channel :3
[DEBUG][10:18:32]       >Height  :224
[DEBUG][10:18:32]       >Width   :224
[DEBUG][10:18:32] Network Output [0]
[DEBUG][10:18:32]       >Channel :1000
[DEBUG][10:18:32]       >Height  :1
[DEBUG][10:18:32]       >Width   :1
[DEBUG][10:18:32] Mean values = [103.907, 116.572,122.602]
[DEBUG][10:18:32] =========== Network Parameters End   ===========
[DEBUG][10:18:32] =========== Video Parameters Begin =============
[DEBUG][10:18:32]       Video codec     : H.265/HEVC
[DEBUG][10:18:32]       Frame rate      : 25/1 = 25 fps
[DEBUG][10:18:32]       Sequence format : Progressive
[DEBUG][10:18:32]       Coded frame size: [1920, 960]
[DEBUG][10:18:32]       Display area    : [0, 0, 1920, 960]
[DEBUG][10:18:32]       Chroma format   : YUV 420
[DEBUG][10:18:32] =========== Video Parameters End   =============
[b][ERROR][10:18:32] CUDA error 100 at line 165 in file src/nvDecLite.cpp
[ERROR][10:18:32] Decoder not initialized.
[ERROR][10:18:32] Decoder not initialized.[/b]

But when I replaced the H.264 encoding video, everything worked fine.

Can deepstream support H.265 encoding video?

Thanks.

Hi,

We have confirmed this issue with our internal team.

The supported video format is dependent on specific GPU model.
You can find detail information in NVDEC_VideoDecoder_API_ProgGuide which located at ‘Video_Codec_SDK_8.1.24/doc’.

For GP104 family (i.e. Tesla P4), both MPEG-4 and H.265/HEVC are supported.
Could you share which GPU do you use?

Thanks

Hi, my GPU is Tesla K40m.

Fri Jun  1 14:06:05 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.81                 Driver Version: 384.81                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K40m          Off  | 00000000:04:00.0 Off |                    0 |
| N/A   37C    P0    70W / 235W |      0MiB / 11439MiB |     89%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

+-----------------------------------------------------------------------------+

Hi AastaLLL,

I tested MPEG-4 and VC-1 on Tesla P4, The deepstream still hangs as before.

Is there any suggestion?

Thanks.

Hi,

Could you share your complete source code with us?

MPEG-4 is in our test plan(for P4) and it works well when testing.
We want to check this issue in detail to find out the real cause.

Thanks.

Hi AastaLLL,

Can you share the code that you tested for reading and processing mpeg4 video?

I just modified nvDecInfer_classification/dataProvider.h to read data using ffmpeg,
and a very small part of nvDecInfer_classification/nvDecInfer.cpp.

All the modified code is as follows.

dataProvider.h

/*
* Copyright 1993-2016 NVIDIA Corporation.  All rights reserved.
*
* NOTICE TO USER:
*
* This source code is subject to NVIDIA ownership rights under U.S. and
* international Copyright laws.
*
* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
* CODE FOR ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
* IMPLIED WARRANTY OF ANY KIND.  NVIDIA DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
* OR PERFORMANCE OF THIS SOURCE CODE.
*
* U.S. Government End Users.  This source code is a "commercial item" as
* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting  of
* "commercial computer software" and "commercial computer software
* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
* and is provided to the U.S. Government only as a commercial end item.
* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
* source code with only those rights set forth herein.
*/
#ifndef DATA_PROVIDER_H
#define DATA_PROVIDER_H

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cassert>

#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#ifdef __cplusplus
}
#endif

using namespace std;

class DataProvider {
public:
    virtual ~DataProvider() {}
    virtual bool getData(uint8_t **ppBuf, int *pnBuf) = 0;
	virtual void reload() = 0;
};

void PrintBuffer(void* pBuff, unsigned int nLen)
{
    if (NULL == pBuff || 0 == nLen)
    {
        return;
    }

    const int nBytePerLine = 16;
    unsigned char* p = (unsigned char*)pBuff;
    char szHex[3*nBytePerLine+1] = {0};

    printf("-----------------begin-------------------\n");
    for (unsigned int i=0; i<nLen; ++i)
    {
        int idx = 3 * (i % nBytePerLine);
        if (0 == idx)
        {
            memset(szHex, 0, sizeof(szHex));
        }
#ifdef WIN32
        sprintf_s(&szHex[idx], 4, "%02x ", p[i]);// buff
        snprintf(&szHex[idx], 4, "%02x ", p[i]); // buff
#endif

        //
        if (0 == ((i+1) % nBytePerLine))
        {
            printf("%s\n", szHex);
        }
    }

    //
    if (0 != (nLen % nBytePerLine))
    {
        printf("%s\n", szHex);
    }

    printf("------------------end-------------------\n");
}

// Define the file data provider, parse each frame in raw video data
class FileDataProvider : public DataProvider {
public:
    FileDataProvider(const char *szFilePath) {
    /*
        fp_ = fopen(szFilePath, "rb");
    	if (nullptr == fp_) {
			LOG_ERROR(logger, "Failed to open file " << szFilePath);
			exit(1);
		}
		pLoadBuf_ = new uint8_t[nLoadBuf_];
    	pPktBuf_ = new uint8_t[nPktBuf_];
		assert(nullptr != pLoadBuf_);
    */

	
        av_register_all();
        avformat_network_init();
        int r = avformat_open_input(&m_pFormatCtx, szFilePath, NULL, NULL); //need close
        if (r != 0)
        {
        	cout <<"VideoStream::init Couldn't open input stream: "<< szFilePath<<endl;
            //return false;
        }

        r = avformat_find_stream_info(m_pFormatCtx, NULL);
        if (r < 0)
        {
        	cout <<"VideoStream::init Couldn't find stream information."<<endl;
            //return false;
        }

        m_videoIndex = av_find_best_stream(m_pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);;
        if (m_videoIndex < 0)
        {
        	cout <<"FileDataProvider::init Didn't find a video stream."<<endl;
            //return false;
        }

        AVCodecID codeid = m_pFormatCtx->streams[m_videoIndex]->codecpar->codec_id;
		cout <<"video codec = " <<avcodec_get_name(codeid) <<endl;
        /*if (codeid == AV_CODEC_ID_H264 || codeid == AV_CODEC_ID_HEVC)
        {
            if (codeid == AV_CODEC_ID_H264)
            {
            	m_pAVBSFCtx = av_bitstream_filter_init("h264_mp4toannexb");// need close
            }
            else
            {
            	m_pAVBSFCtx = av_bitstream_filter_init("hevc_mp4toannexb"); // need close
            }
        }*/
	}
    ~FileDataProvider() {
        if (fp_) {
            fclose(fp_);
        }
		if (pLoadBuf_) {
			delete [] pLoadBuf_;
		}
		if (pPktBuf_) {
			delete [] pPktBuf_;
		}
    }

	bool getData_old(uint8_t **ppBuf, int *pnBuf) {
        if (!fp_) {
            return 0;
        }
		// Warning: only support H264, HEVC
		int nBytesToDecode;
		do {
			nBytesToDecode = findEndOfFrame(vCache_);
			if (0 == nBytesToDecode) {
				// need to load more video data to find a frame
				int nBytesLoaded = loadDataFromFile(nLoadBuf_);
				if (0 == nBytesLoaded) {
					memcpy(pPktBuf_, vCache_.data(), vCache_.size());
					*ppBuf = pPktBuf_;
					*pnBuf = vCache_.size();
					
					vCache_.clear();
					return false;
				}
			} else {
			}
		} while (nBytesToDecode == 0);
		
		assert(0 != nBytesToDecode);
		memcpy(pPktBuf_, vCache_.data(), nBytesToDecode);
		vCache_.erase(vCache_.begin(), vCache_.begin() + nBytesToDecode);
		*ppBuf = pPktBuf_;
		*pnBuf = nBytesToDecode;
		
		return true;
	}
	
	void reload() {
		fseek(fp_, 0, SEEK_SET);
	}

	bool getData(uint8_t **ppBuf, int *pnBuf)
	{
		while (true)
		{
			AVPacket *packet = av_packet_alloc();
			int r = av_read_frame(m_pFormatCtx, packet);
			if(r >= 0)
			{
				if(packet->stream_index == m_videoIndex)
				{
					/*if (m_pAVBSFCtx)
					{
						//H.264 NALU{0,0,0,1}
						AVPacket *new_pkt = av_packet_alloc();
						int ret = av_bitstream_filter_filter(m_pAVBSFCtx,
								m_pFormatCtx->streams[m_videoIndex]->codec,
								NULL,
								&new_pkt->data,
								&new_pkt->size,
								packet->data,
								packet->size,
								0);
						if (ret > 0)
						{
							av_packet_unref(packet);
							av_packet_free(&packet);
							packet = new_pkt;
						}
					}*/

					
					memcpy(*ppBuf, packet->data, packet->size);
					*pnBuf = packet->size;
					//PrintBuffer(*ppBuf, 20);
					av_packet_unref(packet);
					av_packet_free(&packet);
					return true;
				}
			}
			else
			{
				return false;
			}
		}
		return false;
	}

private:
	int loadDataFromFile(const int count) {
		if (NULL == fp_) {
			return 0;
		}
		int nRead = fread(pLoadBuf_, 1, count, fp_);
		if (0 == nRead) {
			return 0;
		} else {
			vCache_.insert(vCache_.end(), &pLoadBuf_[0], &pLoadBuf_[nRead]);
		}
		return vCache_.size();
	}
	
	int findEndOfFrame(std::vector<uint8_t > &vCache) {
        const int nBytesOfPrefix = 3;
		if (vCache.size() < nBytesOfPrefix) {
			return 0;
		}
		unsigned r = 0, sum = 0;
		for (r = 0; r < (vCache.size() - nBytesOfPrefix + 1); ++r) {
			if (0 == r) {
				for (int i = 0; i < nBytesOfPrefix; ++i) {
					sum += vCache[i];
				}
			} else {
				sum = sum - vCache[r-1] + vCache[r+nBytesOfPrefix-1];
			}
			if (1 == sum && 1 == vCache[r+nBytesOfPrefix-1]) {
				// h264 aud nail units
				if (r+nBytesOfPrefix != 6) {
					return r + nBytesOfPrefix;
				}
			}
		}
		return 0;
	}
    
	FILE *fp_ = nullptr;
	uint8_t *pLoadBuf_ = nullptr;
	int nLoadBuf_ = 1 << 20;
	
	uint8_t *pPktBuf_ = nullptr;
	int nPktBuf_ = 1 << 20;
	
	std::vector<uint8_t > vCache_;

    AVFormatContext *m_pFormatCtx = NULL;
    int m_videoIndex = -1;
    AVBitStreamFilterContext* m_pAVBSFCtx = NULL;
};

/*
// Note: this implementation don't have H.264 parser
class FileDataProvider : public DataProvider {
public:
    FileDataProvider(const char *szFilePath, simplelogger::Logger *logger)
	: logger_(logger)
	{
        fp_ = fopen(szFilePath, "rb");
    	if (nullptr == fp_) {
			LOG_DEBUG(logger, "Fail to open file " << szFilePath);
			exit(1);
		}
		pLoadBuf_ = new uint8_t[nLoadBuf_];
		assert(NULL != pLoadBuf_);
	}
    ~FileDataProvider() {
        if (fp_) {
            fclose(fp_);
        }
		if (pLoadBuf_) {
			delete [] pLoadBuf_;
		}
    }
	bool getData(uint8_t **ppBuf, int *pnBuf) {
        if (!fp_) {
            return 0;
        }
		int nRead = fread(pLoadBuf_, 1, nLoadBuf_, fp_);
    	if (0 == nRead) {
			return false;
		}
		*ppBuf = pLoadBuf_;
		*pnBuf = nRead;
		return true;
	}
	
	void reload() {
		fseek(fp_, 0, SEEK_SET);
	}

private:
    FILE *fp_ = NULL;
	uint8_t *pLoadBuf_{ nullptr };
	int nLoadBuf_{ 1 << 20 };
	simplelogger::Logger *logger_{ nullptr };
};
*/

#endif // DATA_PROVIDER_H

nvDecInfer_classification\nvDecInfer.cpp

/*
* Copyright 1993-2016 NVIDIA Corporation.  All rights reserved.
*
* NOTICE TO USER:
*
* This source code is subject to NVIDIA ownership rights under U.S. and
* international Copyright laws.
*
* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
* CODE FOR ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
* IMPLIED WARRANTY OF ANY KIND.  NVIDIA DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
* OR PERFORMANCE OF THIS SOURCE CODE.
*
* U.S. Government End Users.  This source code is a "commercial item" as
* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting  of
* "commercial computer software" and "commercial computer software
* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
* and is provided to the U.S. Government only as a commercial end item.
* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
* source code with only those rights set forth herein.
*/

#include <cstring>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <fstream>
#include <sstream>
#include <thread>
#include <iomanip>
#include <sys/time.h>
#include <helper_cuda.h>

#include "ds_nvUtils.h"
#include "dataProvider.h"
#include "deepStream.h"

simplelogger::Logger *logger = simplelogger::LoggerFactory::CreateConsoleLogger();

int  g_nChannels 		= 0;
char *g_fileList 		= nullptr;
char *g_deployFile 		= nullptr;
char *g_modelFile 		= nullptr;
char *g_meanFile 		= nullptr;
char *g_synsetFile 		= nullptr;
char *g_validationFile 	= nullptr; 
bool g_endlessLoop		= false;
const char *g_appName	= "nvDecInfer";
cudaVideoCodec g_codec;

class DecodeProfiler;
class AnalysisProfiler;
class UserDefinedModule;

template <typename T>
inline std::string convert(const T a);
bool parseArg(int argc, char **argv);
inline bool PairCompare(const std::pair<float, int>& lhs, const std::pair<float, int>& rhs);
void getFileNames(const int nFiles, char *fileList, std::vector<std::string> &files);
void userPushPacket(DataProvider *pDataProvider, IDeviceWorker *pDeviceWorker, const int channel);

std::vector<FileDataProvider *> vpDataProviders;
std::vector<DecodeProfiler *> g_vpDecProfilers;
AnalysisProfiler *g_analysisProfiler;

class DecodeProfiler : public IDecodeProfiler {
public:	
	void reportDecodeTime(const int frameIdx, const int videoIdx, const int devID, double ms) {
		nCount++;
		timeElasped += ms;
		if ((frameIdx+1) % interval == 0) {
			LOG_DEBUG(logger, "Video[" << videoIdx << "] " 
								<< std::fixed << std::setprecision(2) 
								<< "Decoding" << " Performance: " << float(interval * 1000.0 / timeElasped) << " frames/second"
								<< " || Total Frames: " << nCount);
			timeElasped = 0.;
		}
	}
	
	int nCount{ 0 };
	int interval{ 100 };
	double timeElasped{ 0 }; // ms
};

class AnalysisProfiler : public IAnalysisProfiler {
public:
	explicit
	AnalysisProfiler(simplelogger::Logger *logger) {
		logger_ = logger;
	}
	void reportTime(double ms, int batchSize) override {
		nCount += batchSize;
		nTotalFrames += batchSize;
		timeElasped += ms;
		if (nCount >= interval) {
			LOG_DEBUG(logger_, "Analysis Pipeline" << std::fixed << std::setprecision(2) 
								<< " Performance: " << nCount * 1000.f / timeElasped << " frames/second"
								<< " || Total Frames: " << nTotalFrames);
			nCount = 0;
			timeElasped = 0;
		}
	}

private:
	simplelogger::Logger *logger_{ nullptr };
	
	int nCount{ 0 };
	int interval{ 200 };
	int nTotalFrames{ 0 };
	double timeElasped{ 0 }; // ms
};

class UserDefinedModule : public IModule {
public:
	explicit
	UserDefinedModule(PRE_MODULE_LIST &preModules,
					char* valFile,
					char* synsetFile,
					const int nChannels,
					simplelogger::Logger *logger) 
	: preModules_(preModules), valFile_(valFile), synsetFile_(synsetFile),
	nChannels_(nChannels), logger_(logger) {}

	~UserDefinedModule() {}

	// override
	void initialize() override {
		vFrameCount_.resize(nChannels_);
		vHitCount_.resize(nChannels_);

		// validation initialize
		std::ifstream iVal(valFile_);
		if (iVal.is_open()) {
			std::string line;
			int count = 0;
			while (std::getline(iVal, line)) {
				int num = std::stoi(line, nullptr, 10);
				vVals_.push_back(num);
				count++;
			}
			iVal.close();
		} else {
			LOG_ERROR(logger_, "Failed to open validation file " << valFile_);
			exit(0);
		}
		// synset initialize
		std::ifstream iLabel(synsetFile_);
		if (iLabel.is_open()) {
			std::string line;
			while (std::getline(iLabel, line)) {
				vSynsets_.push_back(line);
				line.clear();
			}
			iLabel.close();
		} else {
			LOG_ERROR(logger_, "Failed to open synset file " << synsetFile_);
			exit(0);
		}
	}

	void execute(const ModuleContext& context, const std::vector<IStreamTensor *>& vpInputTensors,  const std::vector<IStreamTensor *>& vpOutputTensors) {
		assert(preModules_.size() == vpInputTensors.size());

		// batch size changes in runtime	
		std::vector<int> shape = vpInputTensors[0]->getShape();
		int batch_rt = shape[0];
		assert(batch_rt <= nChannels_);
		
		const float *data = reinterpret_cast<const float*>(vpInputTensors[0]->getConstCpuData());
		std::vector<TRACE_INFO> vTraceInfos = vpInputTensors[0]->getTraceInfos();
		assert(batch_rt == vTraceInfos.size());
		
		for (int iBatch = 0; iBatch < batch_rt; ++iBatch) {
			TRACE_INFO &traceInfo = vTraceInfos[iBatch];

			int frameIndex = traceInfo.frameIndex;
			int videoIndex = traceInfo.videoIndex;
			int nDataLen = shape[1] * shape[2] * shape[3];
			//std::cout<<"shape[1,2,3]="<<shape[1]<<","<<shape[2]<<","<<shape[3]<<" nDataLen="<<nDataLen<<endl;
			const float *pData = data + iBatch * nDataLen;
			
			// user defined post processing of inference
			int TOP_N = 5;
			std::string sFileName = "./log/log_";
			sFileName += convert<int>(videoIndex) + ".txt";
			std::ofstream logFile;
				
			if (frameIndex == 0) {
				// clear the content of file
				logFile.open(sFileName, std::ios::trunc);
			} else {
				logFile.open(sFileName, std::ios::app | std::ios::binary);
			}

			if (!logFile.is_open()) {
				LOG_ERROR(logger, "Failed to Open file " << sFileName);
				exit(0);
			}
			// check the inference result
			// Find the top N classes
			std::vector<std::pair<float, int> > inferResultWithIndex;
			for (int j = 0; j < nDataLen; ++j) {
				inferResultWithIndex.push_back(std::make_pair(pData[j], j));
			}
			
			std::partial_sort(inferResultWithIndex.begin(),
								inferResultWithIndex.begin() + TOP_N,
								inferResultWithIndex.end(), PairCompare);// Top N
			
			bool check = false;
			
			logFile << ">>[Inference][video " << videoIndex << "][frame "
					  <<  frameIndex << "]" << " belongs to: \n";
				
			for (int j = 0; j < TOP_N; ++j) {
				std::stringstream ss;
				ss << "  " << std::fixed << std::setprecision(4) 
							<< inferResultWithIndex[j].first << " - \"" 
							<< vSynsets_[inferResultWithIndex[j].second] << "\"";
				
				if (vVals_[frameIndex % (vVals_.size())] == inferResultWithIndex[j].second) {
					check = true;
					ss << ", [Hit]";
					vHitCount_[videoIndex]++;
				}
				ss << '\n';
				logFile << ss.str();
			}
				
			vFrameCount_[videoIndex]++;
			logFile << "  Video[" << videoIndex << "] total frames = " << vFrameCount_[videoIndex] << "\n";
			logFile << "  Video[" << videoIndex << "] hit frames = " << vHitCount_[videoIndex] << "\n";
			logFile << "  Video[" << videoIndex << "] accuracy = "
					<< (float)vHitCount_[videoIndex]/vFrameCount_[videoIndex] 
					<< "\n\n";
	
			logFile.close();
		}
	
		// No module is connected to this module, so the output tensor is empty
	}
	
	void destroy() override {}

	int getNbInputs() const override {
		return preModules_.size();
	}
	
	PRE_MODULE getPreModule(const int tensorIndex) const override {
		return preModules_[tensorIndex];
	}
	
	int getNbOutputs() const override {
		return 0;
	}
	
	IStreamTensor* getOutputTensor(const int tensorIndex) const override {
		return nullptr;
	}
	
	void setProfiler(IModuleProfiler *pProfiler) override {
		pProfiler_ = pProfiler;
	}
	
	IModuleProfiler* getProfiler() const override {
		return pProfiler_;
	}
	
	void setCallback(void *pUserData, MODULE_CALLBACK callback) override {
		pUserData_ = pUserData;
		callback_ = callback;
	}

	std::pair<void *, MODULE_CALLBACK> getCallback() const override {
		return std::pair<void*, MODULE_CALLBACK>(pUserData_, callback_);
	}

private:
	int nChannels_{ 0 };
	char *valFile_{ nullptr };
	char *synsetFile_{ nullptr };
	simplelogger::Logger *logger_{ nullptr };

	std::vector<std::string > 			vSynsets_;
	std::vector<int > 					vVals_;
	std::vector<int > 					vFrameCount_;
	std::vector<int > 					vHitCount_;
	
	void *pUserData_{ nullptr };
	MODULE_CALLBACK callback_{ nullptr };
	IModuleProfiler* pProfiler_{ nullptr };	
	PRE_MODULE_LIST preModules_;
	std::vector<IStreamTensor*> vpOutputTensors_;
};

int main(int argc, char **argv) {
        deepStreamInit();
	
	bool ret = parseArg(argc, argv);
	if (!ret) {
		LOG_ERROR(logger, "Error in parseArg!");
		return 0;
	}
	
	// set a GPU device ID
	int devID = 0; 

	// Create a worker on a GPU device
	IDeviceWorker *pDeviceWorker = createDeviceWorker(g_nChannels, devID);
	
	// Add decode task
	pDeviceWorker->addDecodeTask(g_codec);
		
	// Add frame paser
	IModule *pConvertor = pDeviceWorker->addColorSpaceConvertorTask(BGR_PLANAR);

	// Add inference task
	std::string inputLayerName("data");
	std::vector<std::string > outputLayerNames{"prob"};
	IModule *pInferModule = pDeviceWorker->addInferenceTask( std::make_pair(pConvertor, 0),
																g_deployFile,
																g_modelFile,
																g_meanFile,
																inputLayerName,
																outputLayerNames,
																g_nChannels);
	
	PRE_MODULE_LIST preModules{std::make_pair(pInferModule,0)};
	UserDefinedModule *pAccurancyModule = new UserDefinedModule(preModules, g_validationFile, g_synsetFile, g_nChannels, logger);
	assert(nullptr != pAccurancyModule);
	pDeviceWorker->addCustomerTask(pAccurancyModule);
	
	for (int i = 0; i < g_nChannels; ++i) {
		g_vpDecProfilers.push_back(new DecodeProfiler);
		pDeviceWorker->setDecodeProfiler(g_vpDecProfilers[i], i);
	}

	g_analysisProfiler = new AnalysisProfiler(logger);
	pDeviceWorker->setAnalysisProfiler(g_analysisProfiler);
	
	// start the device worker.
	pDeviceWorker->start();
	
	// User push video packets into a packet cache
	std::vector<std::thread > vUserThreads;
	for (int i = 0; i < g_nChannels; ++i) {
		vUserThreads.push_back( std::thread(userPushPacket,
											vpDataProviders[i],
											pDeviceWorker,
											i
											) );
	}
	
	// wait for user push threads
	for (auto& th : vUserThreads) {
		th.join();
	}
	
	// stop device worker
	pDeviceWorker->stop();
	
	LOG_DEBUG(logger, "Note:");
	LOG_DEBUG(logger, "[1] The speed of video input is set to 30 FPS.");
	LOG_DEBUG(logger, "[2] The inference results are recorded in the files under the './log' directory.");

	// free
	pDeviceWorker->destroy();
	
	while (!vpDataProviders.empty()) {
		FileDataProvider *temp = vpDataProviders.back();
		vpDataProviders.pop_back();
		delete temp;
	}
	
	for (int i = 0; i < g_nChannels; ++i) {
		delete g_vpDecProfilers[i];
	}
	if (nullptr != g_analysisProfiler) {
		delete g_analysisProfiler;
	}
	if (nullptr != pAccurancyModule) {
		delete pAccurancyModule;
	}
	if (nullptr != logger) {
		delete logger;
	}

	return 0;
}
	
void getFileNames(const int nFiles, char *fileList, std::vector<std::string> &files) {
	int count = 0;
	char *str;
	str = strtok(fileList, ",");
	while (NULL != str) {
		files.push_back(std::string(str));
		str = strtok(NULL, ",");
		count++;
		if (count >= nFiles) {
			break;
		}
	}
}

void userPushPacket(DataProvider *pDataProvider, IDeviceWorker *pDeviceWorker, const int channel) {
	assert(NULL != pDeviceWorker);
	assert(NULL != pDataProvider);
	int nBuf = 0;
	uint8_t *pBuf = new uint8_t[1 << 20];;
	int nPkts = 0;
	struct timeval timerOfLastPkt;
	struct timeval timerOfCurrPkt;
	
	gettimeofday(&timerOfLastPkt, NULL);
	while (true) {
		// get a frame packet from a video file
		int bStatus = pDataProvider->getData(&pBuf, &nBuf);
		if (bStatus == 0) {
			//if (g_endlessLoop) {
				//LOG_DEBUG(logger, "User: Reloading...");
			  	//pDeviceWorker->pushPacket(pBuf, nBuf, channel);
				//pDataProvider->reload();
			//} else {
				LOG_DEBUG(logger, "User: Ending...");
				// push the last NAL unit packet into deviceWorker
				//pDeviceWorker->pushPacket(pBuf, nBuf, channel);
				pDeviceWorker->stopPushPacket(channel);
				break;
			//}
		} else {
			gettimeofday(&timerOfCurrPkt, NULL);
			double t = (timerOfCurrPkt.tv_sec - timerOfLastPkt.tv_sec) * 1000.0
						+ (timerOfCurrPkt.tv_usec - timerOfLastPkt.tv_usec) / 1000.0;
			// 30 FPS
			//if (t < 33.0) {
			//	std::this_thread::sleep_for(std::chrono::milliseconds((int)(33.0-t))); // ms
			//}
			gettimeofday(&timerOfLastPkt, NULL);
			// Push packet into deviceWorker.
			pDeviceWorker->pushPacket(pBuf, nBuf, channel);
			
		}
	}
	delete []pBuf;
}
	
bool parseArg(int argc, char **argv) {
	bool ret = false;
	
	g_nChannels = getCmdLineArgumentInt(argc, (const char **)argv, "nChannels");
	if (g_nChannels <= 0) { return false; }
	LOG_DEBUG(logger, "Video channels: " << g_nChannels);
	
	ret = getCmdLineArgumentString(argc, (const char **)argv, "fileList", &g_fileList);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No h264 files.");
		return false;
	}

	ret = getCmdLineArgumentString(argc, (const char **)argv, "deployFile", &g_deployFile);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No deploy files.");
		return false;
	}
	
	ret = getCmdLineArgumentString(argc, (const char **)argv, "modelFile", &g_modelFile);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No model files.");
		return false;
	}
	
	ret = getCmdLineArgumentString(argc, (const char **)argv, "meanFile", &g_meanFile);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No mean files.");
		return false;
	}
	
	ret = getCmdLineArgumentString(argc, (const char **)argv, "synsetFile", &g_synsetFile);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No synset files.");
		return false;
	}
	
	ret = getCmdLineArgumentString(argc, (const char **)argv, "validationFile", &g_validationFile);
	if (!ret) {
		LOG_ERROR(logger, "Warning: No validation files.");
	}
	
	g_endlessLoop = getCmdLineArgumentInt(argc, (const char **)argv, "endlessLoop");
	assert(0 == g_endlessLoop || 1 == g_endlessLoop);
	LOG_DEBUG(logger, "Endless Loop: " << g_endlessLoop);
	
	std::vector<std::string > vFiles;
	getFileNames(g_nChannels, g_fileList, vFiles);
	g_codec = getVideoFormat(vFiles[0].c_str()).codec;

	for (int i = 0; i < g_nChannels; ++i) {
		vpDataProviders.push_back(new FileDataProvider(vFiles[i].c_str()));
	}

	return true;
}

template <typename T>
inline std::string convert(const T a) {
	std::stringstream ss;
	ss << a;
	return ss.str();
}

inline bool PairCompare(const std::pair<float, int>& lhs, const std::pair<float, int>& rhs) {
	return lhs.first > rhs.first;
}

Thanks.

Hi,

Thanks.

We have feedback to our internal team.
Please wait for our update.

Hi,

You don’t change the source code since DeepStream can auto detects the codec.
Could you share your video with us to reproduce?

Thanks.

Hi,

We have double checked the MPEG-4 decoding on P4 and it works correctly.

Here is our test steps for your reference:

1. Generate MPEG-4 video

$ ffmpeg -i sample_224x224.h264 -vcodec mpeg4 -an -f m4v -b 4096k sample_224x224.mpeg4

2. Update the video name and run run.sh of classification sample.

Please let us know your result.
Thanks.

Hi,

DeepStream can auto detects the codec, you can see at line nvDecInfer.cpp 504,I have not modified.

g_codec = getVideoFormat(vFiles[0].c_str()).codec;

I tested a lot of MPEG4 videos and none of them passed.You can also download some videos yourself for testing.

How do I send a video to you?

Thanks.

Hi AastaLLL,

I use your command to generate mpeg4 video that is ok, I printed the first 16 bytes of each packet, the output of the console is as follows:

dl@DL:/opt/deepstream/samples/nvDecInfer_classification$ ./run.sh
[DEBUG][14:40:10] Video channels: 1
[DEBUG][14:40:10] Endless Loop: 0
video codec = mpeg4
[DEBUG][14:40:10] Device name: Tesla K40m
g_codec === 2
[DEBUG][14:40:11] Use FP32 data type.
[DEBUG][14:40:14] =========== Network Parameters Begin ===========
[DEBUG][14:40:14] Network Input:
[DEBUG][14:40:14]       >Batch   :1
[DEBUG][14:40:14]       >Channel :3
[DEBUG][14:40:14]       >Height  :224
[DEBUG][14:40:14]       >Width   :224
[DEBUG][14:40:14] Network Output [0]
[DEBUG][14:40:14]       >Channel :1000
[DEBUG][14:40:14]       >Height  :1
[DEBUG][14:40:14]       >Width   :1
[DEBUG][14:40:14] Mean values = [103.907, 116.572,122.602]
[DEBUG][14:40:14] =========== Network Parameters End   ===========
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 50 f0 24 1b 1c 01 b0 60 14 c1 ba 0c
[DEBUG][14:40:14] =========== Video Parameters Begin =============
[DEBUG][14:40:14]       Video codec     : MPEG-4 (ASP)
[DEBUG][14:40:14]       Frame rate      : 25/10 = 00 00 01 b6 51 60 26 06 c5 00 a7 fa 40 32 58 0c
2.5 fps
[DEBUG][14:40:14]       Sequence format : Progressive
[DEBUG][14:40:14]       Coded frame size: [224, 224]
[DEBUG][14:40:14]       Display area    : [0, 0, 224, 224]
[DEBUG][14:40:14]       Chroma format   : YUV 420
[DEBUG][14:40:14] =========== Video Parameters End   =============
00 00 01 b6 51 f0 28 1b 0f 6a 02 d9 f2 40 b6 6e
00 00 01 b6 52 60 24 03 7c 19 48 f5 58 f0 1e 0b
00 00 01 b6 52 f0 22 06 c1 90 95 af b6 d8 31 50
00 00 01 b6 53 60 26 18 c1 b9 5f 32 06 36 df b0
00 00 01 b6 53 f0 28 03 50 32 d0 a3 07 19 6f 20
00 00 01 b6 54 60 24 1b 13 a5 12 d2 03 02 d4 e9
00 00 01 b6 54 f0 28 33 6c 60 03 c1 94 8e db 70
00 00 01 b6 55 60 2a 1b 08 9f 16 ae d8 b5 7f 85
00 00 01 b6 55 f0 28 06 d8 31 61 79 7b 60 c8 41
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 56 f0 2a 18 c1 d4 db f0 d2 dc 63 0d
00 00 01 b6 57 60 22 06 c5 23 e0 61 e8 07 84 25
00 00 01 b6 57 f0 28 03 62 8d 22 54 cd d3 3d e3
00 00 01 b6 58 60 24 06 c2 73 40 a6 2f 2e 06 1c
00 00 01 b6 58 f0 22 1b 13 03 15 87 60 6f fe f7
00 00 01 b6 59 60 2a 14 da 92 2a 04 1a 24 fc 7d
00 00 01 b6 59 f0 26 14 d0 30 1e 03 fc 90 68 0f
00 00 01 b6 5a 60 28 14 c9 07 00 f0 10 22 fb e0
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 5b 60 28 06 c5 20 7d 2c ef d7 40 f1
00 00 01 b6 5b f0 2a 1b 17 ef c6 f8 65 45 1b fa
00 00 01 b6 5c 60 28 04 40 a3 e0 c6 16 f8 f1 e5
00 00 01 b6 68 38 14 0c 60 90 6d f8 63 6d bf 0c
00 00 01 b6 50 e0 28 06 c1 76 20 b2 0c 09 43 80
00 00 01 b6 51 70 26 18 c1 d6 db f0 c6 db 7e 18
00 00 01 b6 51 e0 28 06 c2 50 3c 07 ee 7e 2d 49
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 52 e0 28 06 ca 75 85 40 ac 67 80 30
00 00 01 b6 53 70 28 1a 01 a9 b3 03 8c 04 67 52
00 00 01 b6 53 e0 24 03 63 d0 6e fc 12 d8 29 e1
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 55 70 28 18 c1 d0 db 62 83 17 3f 9d
00 00 01 b6 55 e0 28 04 68 63 4a 83 c0 62 a5 43
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 56 e0 24 06 c2 b0 29 da 72 c2 1a 7a
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 57 e0 28 06 50 f2 ce ea 9d d0 5b db
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 58 e0 22 06 cb 34 24 0e 1a 05 58 18
00 00 01 b6 59 70 22 06 c2 00 86 23 17 03 0f c4
00 00 01 b6 59 e0 26 18 82 2c dc c5 88 0c 37 53
00 00 01 b6 5a 70 26 06 c1 58 20 80 68 3c 2f fd
00 00 01 b6 5a e0 24 06 cd 80 68 36 82 85 30 8e
00 00 01 b6 5b 70 2a 06 c1 41 9f 10 70 b7 01 2d
00 00 01 b6 5b e0 28 03 38 29 e9 ed bc 93 e7 06
00 00 01 b6 5c 70 28 1a 8e 9f 6a 05 ac 2d 06 a0
00 00 01 b6 68 30 14 03 7c 7a 21 8f 07 a3 c0 60
00 00 01 b6 50 f0 2a 06 c3 a0 86 0f 01 04 ca a5
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 51 f0 26 06 82 98 98 b8 1e 16 00 f5
00 00 01 b6 52 60 24 06 c1 96 07 01 04 0f 97 36
00 00 01 b6 52 f0 28 19 86 45 e6 4e 0b 56 4f f3
00 00 01 b6 53 60 28 1b 05 f8 3c 0f f5 69 41 84
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 54 60 24 06 c9 25 4a 10 da 48 94 70
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 55 60 26 14 dc 20 18 20 89 00 d9 55
00 00 01 b6 55 f0 26 03 60 94 4e 74 f2 54 c0 2e
00 00 01 b6 56 60 28 98 7a 98 3c 04 0a a0 c3 e0
00 00 01 b6 56 f0 24 06 c2 80 30 1e a2 40 3c 07
00 00 01 b6 57 60 24 03 18 3a 7f f0 8b 03 3b 04
00 00 01 b6 57 f0 2a 18 c1 d6 db f0 c6 db 7e 18
00 00 01 b6 58 60 26 04 62 31 2d 38 e7 e5 ad b6
00 00 01 b6 58 f0 26 1b 05 12 b1 61 86 fc a0 b3
00 00 01 b6 59 60 26 1b 09 4c 8b 4c 36 65 6f 99
00 00 01 b6 59 f0 2a 03 60 a7 f3 02 19 7f c7 ea
00 00 01 b6 5a 60 26 06 d4 07 81 81 1c 20 83 96
00 00 01 b0 01 00 00 01 b5 89 13 00 00 01 00 00
00 00 01 b6 5b 70 24 06 c5 20 7c 18 7a 10 c1 aa
00 00 01 b6 5b e0 24 06 65 8f b3 f4 7d 95 1e 40
00 00 01 b6 5c 70 28 06 c3 f8 8c cc 60 7e c5 d4
[DEBUG][14:40:14] User: Ending...
[DEBUG][14:40:14] Note:
[DEBUG][14:40:14] [1] The speed of video input is set to 30 FPS.
[DEBUG][14:40:14] [2] The inference results are recorded in the files under the './log' directory.

But I test ll_2.MP4 will always hang, it can’t end, the output of the console is as follows:

dl@DL:/opt/deepstream/samples/nvDecInfer_classification$ ./run.sh
[DEBUG][15:02:18] Video channels: 1
[DEBUG][15:02:18] Endless Loop: 0
video codec = mpeg4
[DEBUG][15:02:18] Device name: Tesla K40m
g_codec === 2
[DEBUG][15:02:18] Use FP32 data type.
[DEBUG][15:02:22] =========== Network Parameters Begin ===========
[DEBUG][15:02:22] Network Input:
[DEBUG][15:02:22]       >Batch   :1
[DEBUG][15:02:22]       >Channel :3
[DEBUG][15:02:22]       >Height  :224
[DEBUG][15:02:22]       >Width   :224
[DEBUG][15:02:22] Network Output [0]
[DEBUG][15:02:22]       >Channel :1000
[DEBUG][15:02:22]       >Height  :1
[DEBUG][15:02:22]       >Width   :1
[DEBUG][15:02:22] Mean values = [103.907, 116.572,122.602]
[DEBUG][15:02:22] =========== Network Parameters End   ===========
00 00 01 b6 10 00 18 44 61 1d b7 f1 b6 df c6 db
00 00 01 b6 50 7d 38 1c ff ff ff ff ff ff ff ff
00 00 01 b6 50 fa 5c 18 ff ff ff ff ff ff ff ff
00 00 01 b6 51 77 78 14 ff ff ff ff ff ff ff ff
00 00 01 b6 51 f4 9c 10 ba 6f be fb ef be fb ef
00 00 01 b6 52 71 b8 0c ff ff ff ff ff ff ff ff
00 00 01 b6 52 ee dc 0c ba 6f be fb ef be fb ef
00 00 01 b6 53 6b f8 10 ff ff ff ff ff ff ff ff
00 00 01 b6 53 e9 1c 0c ba 6f be fb ef be fb ef
00 00 01 b6 54 66 38 0c ff ff ff ff ff ff ff ff
00 00 01 b6 54 e3 5c 0c ba 4f be fb ef be fb ef
00 00 01 b6 55 60 78 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 dd 9c 0c ba 4f be fb ef be fb ef
00 00 01 b6 56 5a b8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 56 d7 dc 08 ba 4f be fb ef be fb ef
00 00 01 b6 57 54 f8 0c ff ff ff ff ff ff ff ff
00 00 01 b6 57 d2 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 4f 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 cc 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 49 78 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 c6 9c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 43 b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a c0 dc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 68 12 cc 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 a2 bc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 1f d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 9c fc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 52 1a 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 97 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 53 14 58 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 91 7c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 54 0e 98 0a 7f ff ff ff ff ff ff ff
00 00 01 b6 54 8b bc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 55 08 d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 85 fc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 56 03 18 08 ff ff ff ff ff ff ff ff
00 00 01 b6 56 80 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 fd 58 09 7f ff ff ff ff ff ff ff
00 00 01 b6 57 7a 7c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 57 f7 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 74 bc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 f1 d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 6e fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 ec 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 69 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a e6 58 09 ff ff ff ff ff ff ff ff
00 00 01 b6 68 25 8e 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 c8 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 45 5c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 c2 78 09 ff ff ff ff ff ff ff ff
00 00 01 b6 12 3f 98 14 60 8f 6d c9 1b 6d fc 6d
00 00 01 b6 52 bc b8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 39 dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 b6 f8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 34 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 54 b1 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 2e 5c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 ab 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 28 9c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 a5 b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 57 22 dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 57 9f f8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 1d 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 9a 38 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 17 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 94 78 08 ff ff ff ff ff ff ff ff
00 00 01 b6 5a 11 9c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 8e b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5b 0b dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 68 38 4c 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 ed bc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 6a d8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 e7 fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 65 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 e2 3c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 5f 58 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 dc 7c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 54 59 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 d6 bc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 53 d8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 d0 fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 4e 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 cb 3c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 57 48 58 09 7f ff ff ff ff ff ff ff
00 00 01 b6 57 c5 7c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 42 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 bf bc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 3c d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 b9 fc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 5a 37 18 09 ff ff ff ff ff ff ff ff
00 00 01 b6 5a b4 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 68 0c 7c 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 96 1c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 13 38 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 90 5c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 0d 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 8a 9c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 07 b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 53 84 dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 54 01 f8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 14 7f 18 14 60 8f 6d c9 1b 6d fc 6d
00 00 01 b6 54 fc 38 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 79 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 f6 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 73 9c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 56 f0 b8 09 ff ff ff ff ff ff ff ff
00 00 01 b6 57 6d dc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 57 ea f8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 68 1c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 58 e5 38 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 62 5c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 df 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 5c 9c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 5a d9 b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 68 1f 3e 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 bb 98 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 38 bc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 b5 d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 32 fc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 52 b0 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 53 2d 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 53 aa 58 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 27 7c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 a4 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 21 bc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 55 9e d8 09 ff ff ff ff ff ff ff ff
00 00 01 b6 56 1b fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 99 18 09 ff ff ff ff ff ff ff ff
00 00 01 b6 57 16 3c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 57 93 58 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 10 7c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 8d 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 0a bc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 87 d8 09 ff ff ff ff ff ff ff ff
00 00 01 b6 5a 04 fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 82 18 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a ff 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 68 31 fc 04 7f ff ff ff ff ff ff ff
00 00 01 b6 50 e1 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 5e 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 db 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 52 58 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 d5 9c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 53 52 b8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 cf dc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 4c f8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 54 ca 1c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 55 47 38 09 ff ff ff ff ff ff ff ff
00 00 01 b6 55 c4 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 56 41 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 16 be 98 14 60 8f 6d c9 1b 6d fc 6d
00 00 01 b6 57 3b b8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 57 b8 dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 58 35 f8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 58 b3 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 59 30 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 ad 5c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 5a 2a 78 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a a7 9c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 68 06 2c 04 7f ff ff ff ff ff ff ff
00 00 01 b6 50 89 7c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 06 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 83 bc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 52 00 d8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 52 7d fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 fb 18 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 78 3c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 53 f5 58 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 72 7c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 54 ef 98 09 ff ff ff ff ff ff ff ff
00 00 01 b6 55 6c bc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 e9 d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 66 fc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 56 e4 18 08 ff ff ff ff ff ff ff ff
00 00 01 b6 57 61 3c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 57 de 58 09 ff ff ff ff ff ff ff ff
00 00 01 b6 58 5b 7c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 58 d8 98 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 55 bc 09 7f ff ff ff ff ff ff ff
00 00 01 b6 59 d2 d8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 5a 4f fc 09 ff ff ff ff ff ff ff ff
00 00 01 b6 5a cd 18 08 ff ff ff ff ff ff ff ff
00 00 01 b6 68 18 ee 04 bf ff ff ff ff ff ff ff
00 00 01 b6 50 ae f8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 51 2c 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 51 a9 38 09 7f ff ff ff ff ff ff ff
00 00 01 b6 52 26 5c 09 ff ff ff ff ff ff ff ff
00 00 01 b6 52 a3 78 08 ff ff ff ff ff ff ff ff
00 00 01 b6 53 20 9c 09 7f ff ff ff ff ff ff ff
00 00 01 b6 53 9d b8 09 7f ff ff ff ff ff ff ff
00 00 01 b6 54 1a dc 08 ff ff ff ff ff ff ff ff
00 00 01 b6 54 97 f8 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 15 1c 08 ff ff ff ff ff ff ff ff
00 00 01 b6 55 92 38 09 7f ff ff ff ff ff ff ff
[DEBUG][15:02:22] User: Ending...

What is the difference between these two?

Hi,

Could you share your video with us?
We want to check this internally.

Please click the attach button at the top-right of your comment.

Thanks.

OK, I have uploaded data in this comment, can you download it?

Thanks.
mpeg4.zip (2.46 MB)