Beispiel #1
0
void MyJPEGVideoSource::doGetNextFrame() {
	if (fFragmentLeftSize == 0) {
		int parse_error_num = 0;
		while (parse_error_num <=3)
		{
			//unsigned acquiredFrameSize;
			u_int64_t frameDuration_usec;

			bsreader_frame_info_t frame_info;
#ifdef CONFIG_APP_IPCAM_USE_BSBUFFER
			while (gmi_bs_shm_read_one_packet(hBsBuffer, (char*)&(frame_info.bs_info), (char**)&(frame_info.frame_addr), &(frame_info.frame_size), &uPacketReadSN) != 0) {
				usleep(20000);
				continue;
			}
#else
			if (bsreader_get_one_frame(fStreamID, &frame_info) < 0) {
				printf("bs reader gets frame error\n");
				continue;
			}
#endif
			Boolean bIsNewSession = (frame_info.bs_info.session_id != fSessionID);
			fSessionID = frame_info.bs_info.session_id;
			//acquiredFrameSize = frame_info.frame_size;

			if (!bIsNewSession)  {
				if (frame_info.bs_info.PTS < fPTS) {
					frameDuration_usec = ((1<<30) +frame_info.bs_info.PTS - fPTS) * 100 / 9;		//yzhu
				} else {
					frameDuration_usec = (frame_info.bs_info.PTS - fPTS) * 100 / 9;	//pts is creatmented @ 90000Hz
				}
			} else
				frameDuration_usec = 0;

			fPresentationTime.tv_usec += (long) frameDuration_usec;

			while(fPresentationTime.tv_usec >= 1000000)
			{
				fPresentationTime.tv_usec -= 1000000;
				++fPresentationTime.tv_sec;
			}
			if (Parse(frame_info.frame_addr, frame_info.frame_size) ) {
				fPTS = frame_info.bs_info.PTS;
				break;
			} else {
				printf("Parse error, skip this one and read next\n");
				parse_error_num++;
			}
		}
		fFragmentOffset = 0;
	}else {
		fFragmentOffset += fFrameSize;
	}

	fFrameSize = fFragmentLeftSize > fMaxOutputPacketSize ? fMaxOutputPacketSize : fFragmentLeftSize;
	memcpy(fTo,fFragmentBeginAddr, fFrameSize );
	fFragmentLeftSize -= fFrameSize;
	fFragmentBeginAddr += fFrameSize;
	afterGetting(this);
}
/*1 for get h264 2 for get jpeg format*/
int GetH264Buffer(void* handle,void **ppBuffer,u32 *pBufSize)
{
	void *pGetBuffer=*ppBuffer;
	u32 bufsize = *pBufSize;
	u32 charsize=100*1024;
	std::auto_ptr<char> pChar2(new char[charsize]);
	int ret;
	bs_info_t header;
	char  *packaddr,*lastpackaddr=NULL;
	unsigned int packsize,packread=0,lastpacksize=0;
	int hasread=0;
	int tries = 0;

	do
	{
		memset(&header,0,sizeof(header));
		ret = gmi_bs_shm_read_one_packet(handle,(char*)&header,&packaddr,&packsize,&packread);
		APP_ERROR("ret = %d\n",ret);
		if (ret >= 0)
		{
			APP_ERROR("type = %d\n",header.pic_type);
			if (header.pic_type == JPEG_STREAM)
			{
				hasread = 2;
				lastpackaddr = packaddr;
				lastpacksize = packsize;
				break;
			}
			else if (header.pic_type == I_FRAME || header.pic_type == IDR_FRAME)
			{
				if (hasread < 2)
				{
					hasread = 1;
					lastpackaddr = packaddr;
					lastpacksize = packsize;
					break;
				}
			}

		}
		else
		{
			usleep(100000);
		}
		tries ++;
	}while(tries <= 100);

	if (hasread == 0)
	{
		/*nothing to read */
		ret = -ENODEV;
		APP_ERROR("\n");
		goto fail;
	}

	if (bufsize < lastpacksize || pGetBuffer == NULL)
	{
		if (bufsize < lastpacksize)
		{
			bufsize = lastpacksize;
		}
		pGetBuffer = malloc(bufsize);
	}

	if (pGetBuffer == NULL)
	{
		ret = -ENOMEM;
		APP_ERROR("\n");
		goto fail;
	}

	memcpy(pGetBuffer,lastpackaddr,lastpacksize);
	*ppBuffer = pGetBuffer;
	*pBufSize = lastpacksize;

	return hasread;

fail:
	if (pGetBuffer && pGetBuffer != *ppBuffer)
	{
		free(pGetBuffer);
	}
	pGetBuffer = NULL;
	return ret;
}