⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encode.c~

📁 cam ui application for linux
💻 C~
📖 第 1 页 / 共 5 页
字号:
			}			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 + -