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; }