📄 encode.c~
字号:
} pthread_mutex_unlock(&store_lock); if (idx_store_case !=3) memcpy((void*)(Idx_Store_buf+idx_store_wr_ptr), (void*)(UserIdxData.addr), UserIdxData.validsize); pthread_mutex_lock(&store_lock); if (idx_store_case ==1) //"write" wrap around { idx_store_wr_ptr +=UserIdxData.validsize; } else if (idx_store_case ==2) { idx_store_wr_ptr +=UserIdxData.validsize; if (idx_store_wr_ptr > idx_store_end_ptr) idx_store_end_ptr =idx_store_wr_ptr; } pthread_mutex_unlock(&store_lock);#else fwrite(outbuff, 1, UserIdxData.validsize, fdIdx); indexsize+= UserIdxData.validsize; fflush(fdIdx); #if QT_MP4_IDX_ON_THE_FLY if(capturingmp4) { qt_process_index_data(0, outbuff, UserIdxData.validsize); } #endif //if not do it at EOF #endif } Err= 0; //Remove any error condition } } //rick debug performance if((vbi_format.Enable==1) && fdVbi && vbioutbuff) { //Read and Save VBI Data if( (lastvbireadtime!=tElapsedTime) || (bStopped)) { lastvbireadtime= tElapsedTime; Err= ioctl(hEncDev, QL201_ENC_G_VBI_DATA, &UserVbiData); //DPrintf("\nVBI Currsize=%x, Err=%d errnot=%d %s \n", UserVbiData.validsize, Err, errno, strerror(errno)); if(errno==-EAGAIN) { lastvbireadtime+= 1; } else { lastvbireadtime= 0; //If data is read, let's try reading again } if(!Err && UserVbiData.validsize) { fwrite(vbioutbuff, 1, UserVbiData.validsize, fdVbi); vbisize+= UserVbiData.validsize; fflush(fdVbi); } Err= 0; //Remove any error condition } } usleep(10); // to reduce cpu usage } } else { DPrintf("STREAMON ioctl failed %d %s\n", errno, strerror(errno)); }ravi1:#ifdef JPEG_ENC if (doJpeg) { DPrintf("Wait for jpeg encode thread exit\n"); if (pthread_join(pidEncodeThreadID, NULL)) { DPrintf("error joining thread."); } DPrintf("Jpeg encode thread exited\n"); //pthread_detach(pidEncodeThreadID); }#endif //JPEG_ENC if(hEncDev) { close(hEncDev); hEncDev= 0; } //Add by Willam 2007-11-5 14:44:19 //ql201_osd_exit(); //ql201_osd_init(RGB24BIT_352X240,VID_BYPASS); DPrintf("-----------------------------End Encode --------------------\n"); iStateNext = STATE_STANDBY;#ifdef JPEG_ENC if (doJpeg) pthread_exit(NULL);#endif //JPEG_ENC#ifdef TEST_MD pthread_exit(NULL);#endif //TEST_MD if (stop_mode) Err = 16; return Err;}#endifvoid ql201_endianswap(unsigned long *psrc, unsigned long size) { size/=4; while(size--) { *psrc= ql201_Swap4Bytes(*psrc); psrc++; } return;}int alarm_signal = 0;void alarm_handler(int sig) { signal(SIGALRM, SIG_IGN); alarm_signal = 1; DPrintf("\nIn alarm signal handler \n"); return;}#if 1long DecodeAndStreamv4(char* FName, unsigned int playbacktimeout){ long Err= 0; FILE *fdr= 0, *fdw= 0; FILE *fdrIdx= 0; char FNameIdx[256]="Disabled"; int key; int bStopped= FALSE; int type; int retrycnt= 0; u_char ttl; char *pethernet_intf_name= 0; time_t tStartTime, tElapsedTime; unsigned char Time[15]; unsigned long ulActuTotalXfer= 0, ulActuCurrXfer= 0, pktcnt= 0; unsigned long nCount= 0; unsigned long maxrecdpktsize= 1316; unsigned long leftoveraddr= 0, leftoversize= 0; unsigned long ulCurrChunkSize= 0; unsigned long stop_immediate= 1; unsigned long sleep_time= 1000; int print_cnt= 0; // Andy 2007.10.05: reduce loading struct sigaction action; struct v4l2_buffer v4lbuf;#ifdef DEC_TRICK_MODE // Andy 2007.07.04: for decoder trick mode QLDEV_TRICK_MODE trickmode; // get decoder trick mode QP_INDEX_HEADER_FORMAT idxhdrbuf, idxhdrbufnext; // index header buffer QP_INDEX_FORMAT idxbuf, idxbufnext; // index file buffer unsigned long ulGOPXferByte = 0; // # of bytes of this GOP to transfer unsigned long ulGOPXferByteRemain = 0; // # of remaining bytes of this GOP to transfer unsigned long ulGOPByteSkip = 0; // # of bytes to skip int bIndexExist = 0; // 1 means index file exists unsigned long ulIndexStart = 0; // starting byte address of current GOP in index file unsigned long ulIndexStartNext = 0; // starting byte address of next GOP in index file static unsigned long gopsize[60000]; // store GOP size (frame # and bitstream length) unsigned long gopsizecnt = 0; // counter of gopsize[] int bGOPChecked = 0; // GOP is checked int bGOPStart = 0; // GOP starts int bGOPJumpDir = 0; // direction of jump int bGOPJumpSpeed = 0; // # of GOPs skipped int bGOPJumpCount = 0; // 0: playback; 1 ~ bGOPJumpSpeed: skip GOP unsigned long mode = 0; // IP1 of DecFlush (0x86), and DecGetPlayInfo (0x87) unsigned long ultest; // Andy test int blkcount = 0; // Andy test#endif signal(SIGINT, (void*)SigIntHanlder); //========== Open the Input MPEG4 file =============== fdr = fopen( FName, "rb" ); if( fdr == NULL ) { DPrintf("Unable to open file %s \n", FName); return 2; } DPrintf("Opened file %s for reading (handle=%x) \n", FName, fdr);#ifdef DEC_TRICK_MODE // Andy 2007.07.27: open index file strcpy(FNameIdx, FName); strcat(FNameIdx, ".idx"); fdrIdx = fopen( FNameIdx, "rb" ); if( fdrIdx == NULL ) { bIndexExist = 0; DPrintf("Unable to open index file %s \n", FNameIdx); } else { bIndexExist = 1; DPrintf("Opened file %s for index reading (handle=%x) \n", FNameIdx, fdrIdx); }#endif //======Open the Decode Device ================= hDecDev = open(QlDevDecName[qldevoffset], O_RDWR); if(hDecDev < 0) { DPrintf("Unable to Open (%s) hDecDev = (0x%08x)\r\n", QlDevDecName[qldevoffset], hDecDev); return 2; } else { //DPrintf("Opened device %s \n", QlDevDecName[qldevoffset]); } //ql201_osd_exit(); type = V4L2_BUF_TYPE_VIDEO_OUTPUT; Err = ioctl(hDecDev, VIDIOC_STREAMON, &type); if(!Err) { // ql201_osd_init(RGB24BIT_352X240,VID_BYPASS); SET_VO_MODE(VID_DECODE); //osd_text_show(TIMESTMP_X - 1*FONT_WIDTH,TIMESTMP_Y_0, FName+0x0c,OSD_BLACK); #ifdef DEC_TRICK_MODE // Andy 2007.08.10: initialize trick mode gopsizecnt = 0; trickmode.trickmode = 0; trickmode.dir = 0; trickmode.gopskip = 0; trickmode.framerepeat = 0; Err= ioctl(hDecDev, QL201_DEC_S_TRICK_MODE, &trickmode);#endif while(!Err) { v4lbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; v4lbuf.memory = V4L2_MEMORY_MMAP; Err= ioctl(hDecDev, VIDIOC_DQBUF, &v4lbuf); if(!Err) { retrycnt = 0; ulActuCurrXfer = 0; {#ifndef DEC_TRICK_MODE fdr_clip= fdr; ulActuCurrXfer= read_more_data( (char*)v4lbuf.m.userptr, v4lbuf.length);#else // Andy 2007.08.20: support trick mode #if 1check_index: if (!bIndexExist) //不存在Index文件的MPEG4不能trick mode?? { // normal playback ulGOPXferByte = 0; ulActuCurrXfer= fread( (char*)v4lbuf.m.userptr, 1, v4lbuf.length, fdr);//获取数据流 } else { Err= ioctl(hDecDev, QL201_DEC_G_TRICK_MODE, &trickmode); if (bGOPChecked == 0) { // Andy 2007.07.04: check decode status, don't feed data when no need. if ((bGOPJumpDir != trickmode.dir) || (bGOPJumpSpeed != trickmode.gopskip)) { bGOPJumpDir = trickmode.dir; bGOPJumpSpeed = trickmode.gopskip; bGOPJumpCount = 0; DPrintf("\n[Michael ] JUMP %xx, DIR %x\n", bGOPJumpSpeed, bGOPJumpDir); } if (!bGOPJumpDir) { ulGOPXferByte = 0; bGOPStart = 0; idxhdrbuf.GOPSize = 0xFFFF; // read current index header ulActuCurrXfer = fread( &idxhdrbuf, 1, 20, fdrIdx ); if (!ulActuCurrXfer) { DPrintf("\n No more 1st index data, back to normal playback!\n"); bIndexExist = 0; trickmode.trickmode = 0; trickmode.dir = 0; trickmode.gopskip = 0; trickmode.framerepeat = 0; bGOPJumpDir = trickmode.dir; // back to forward bGOPJumpSpeed = trickmode.gopskip; bGOPJumpCount = 0; Err= ioctl(hDecDev, QL201_DEC_S_TRICK_MODE, &trickmode); //break; goto check_index; } ulIndexStart = ftell( fdrIdx ) - 20; //DPrintf("\nIndex header: %x\n", ftell(fdrIdx)); //DPrintf("InfoPattern= %x\n", idxhdrbuf.InfoPattern); //DPrintf("UpdateField= %x\n", idxhdrbuf.UpdateField); //DPrintf("BFrameCount= %x\n", idxhdrbuf.BFrameCount); //DPrintf("GOPSize = %x\n", idxhdrbuf.GOPSize ); //DPrintf("HSize = %x\n", idxhdrbuf.HSize ); //DPrintf("VSize = %x\n", idxhdrbuf.VSize ); //DPrintf("Reserved1 = %x\n", idxhdrbuf.Reserved1 ); //DPrintf("FrameRate = %x\n", idxhdrbuf.FrameRate ); //DPrintf("Reserved2 = %x\n", idxhdrbuf.Reserved2 ); // read current index ulActuCurrXfer = fread( &idxbuf, 1, 20, fdrIdx ); //DPrintf("\nIndex : %x\n", ftell(fdrIdx)); //DPrintf("bSlice = %x\n", idxbuf.bSlice ); //DPrintf("bReserved = %x\n", idxbuf.bReserved ); //DPrintf("bFrameType = %x\n", idxbuf.bFrameType ); //DPrintf("bBlockSize = %x\n", idxbuf.bBlockSize ); //DPrintf("pts = %x\n", idxbuf.pts ); //DPrintf("dts = %x\n", idxbuf.dts ); //DPrintf("OffsetHigh = %x\n", idxbuf.OffsetHigh ); //DPrintf("OffsetLow = %x\n", idxbuf.OffsetLow ); // read next index header do { ulActuCurrXfer = fread( &idxhdrbufnext, 1, 20, fdrIdx ); //DPrintf("\nGet index : %x\n", ftell(fdrIdx)); if (!ulActuCurrXfer) { DPrintf("\n No more 2nd index data, back to normal playback!\n"); bIndexExist = 0; trickmode.trickmode = 0; trickmode.dir = 0; trickmode.gopskip = 0; trickmode.framerepeat = 0; bGOPJumpDir = trickmode.dir; // back to forward bGOPJumpSpeed = trickmode.gopskip; bGOPJumpCount = 0; Err= ioctl(hDecDev, QL201_DEC_S_TRICK_MODE, &trickmode); break; } } while (idxhdrbufnext.InfoPattern != 0xFFFF); if (!bIndexExist) { goto check_index; } ulIndexStartNext = ftell( fdrIdx ) - 20; //DPrintf("\nIndex header next: %x\n", ftell(fdrIdx)); //DPrintf("InfoPattern= %x\n", idxhdrbufnext.InfoPattern); //DPrintf("UpdateField= %x\n", idxhdrbufnext.UpdateField); //DPrintf("BFrameCount= %x\n", idxhdrbufnext.BFrameCount); //DPrintf("GOPSize = %x\n", idxhdrbufnext.GOPSize );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -