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

📄 encode.c~

📁 cam ui application for linux
💻 C~
📖 第 1 页 / 共 5 页
字号:
           fd = fopen( FName, "w+" );           if( fd == NULL ) {              printf("Unable to open file %s \n", FName);              exit(1);           }           //printf("Opened file %s (handle=%x) \n", FName, fd);    }start_again:    printf("Starting a new capture session \n");        //Now setup capture...    time(&tStartTime);    //========== Open the encode Device ================    pDevName= QlDevEncName[qldevoffset];    hEncDev = open(pDevName, O_RDWR);    if(hEncDev < 0)     {        DPrintf("Unable to Open (%s) hEncDev = (0x%08x)\r\n", pDevName, hEncDev);        return (2);    }    if(!doJpeg && (strmnum==QLSTRM_ENC))     {        enum ql201_v4l2_mpeg_streamtype strmtype= 0xFF;                Err= ioctl(hEncDev, QL201_ENC_G_STRMTYPE, &strmtype);        if ((strmtype & 0xFFFF) == STREAM_TYPE_MPEG4_STREAM)         {            capturingmp4= 1;        }    }    if(!doJpeg && (strmnum != QLSTRM_YUVOUT) && FName)     {        if (1 || capturingmp4)         {            strcpy(FNameIdx, FName);            strcat(FNameIdx, ".idx");            fdIdx = fopen( FNameIdx, "w+" );            if( fdIdx == NULL )             {                fclose(fd);                DPrintf("Unable to open file %s \n", FNameIdx);                exit(1);            }            outbuff= malloc(36*8);            UserIdxData.addr= (unsigned long) outbuff;            UserIdxData.buffsize= (36*8);            UserIdxData.allornone= 1;            if(!outbuff)             {                DPrintf("Unable to allocate memory for index data\n");                fclose(fd);                fclose(fdIdx);                return (2);            }        }        DPrintf("Clip=%s, Index=%s, Vbi=%s \n", FName, FNameIdx, FNameVbi);    }#ifdef Rick_TEST_STORE    if (fd)     {		bStoreStopped=FALSE;//------- setup/init Store_buf//		Store_buf= ((volatile unsigned char *)(0x3600000));		Store_buf= malloc(STORE_BUF_SIZE);		store_wr_ptr=0;		store_rd_ptr=0;		store_end_ptr=0;//------- setup/init Idx_Store_buf		Idx_Store_buf= malloc(IDX_STORE_BUF_SIZE);		idx_store_wr_ptr=0;		idx_store_rd_ptr=0;		idx_store_end_ptr=0;// ------ init StoreThreadProc		store_param.data_fd=fd;		store_param.idx_fd=fdIdx;		store_param.mp4_cap=capturingmp4;		store_param.capturetimeout=capturetimeout;		store_param.FName=FName;//rick debug		store_param.MP4_init_done=0;		pthread_mutex_init(&store_lock,NULL);		Err= pthread_create(&pidStoreThreadID,NULL,(void *)StoreThreadProc, &store_param);		if (Err)		{			DPrintf("\nCreate Store thread fail");			exit(1);		}		//		while (store_param.MP4_init_done ==0)//			usleep(30000);    }#endif    mode = 0;    type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;    Err     = ioctl(hEncDev, QL201_ENC_S_AVSEP, &mode);    //DPrintf("ioctl 0x%08x QL201_ENC_S_AVSEP return %d\n", hEncDev, Err);/* Added by James for test */#ifdef JPEG_ENC    if (doJpeg)     {        DPrintf("Create jpeg thread...\n");        tEncodeParam.hEncDev = hEncDev;        tEncodeParam.dwQuality = 80;        ioctl(hEncDev, QL201_ENC_G_ENC_WIDTH, &tEncodeParam.dwWidth);        ioctl(hEncDev, QL201_ENC_G_ENC_HEIGHT, &tEncodeParam.dwHeight);        tEncodeParam.dwWidth = tEncodeParam.dwWidth & 0xFFF0;        tEncodeParam.dwHeight = tEncodeParam.dwHeight & 0xFFF0;        tEncodeParam.dwHeight = (tEncodeParam.dwHeight<144) ? 144 : tEncodeParam.dwHeight;        tEncodeParam.sub_en = 0;        tEncodeParam.nameBase = argv[cnt++];        tEncodeParam.period = strtoul(argv[cnt++], 0, 10);        DPrintf("JPEG encoding size %dx%d...\n", tEncodeParam.dwWidth, tEncodeParam.dwHeight);        Err = pthread_create(&pidEncodeThreadID, NULL/*&attr*/, (void *)EncodeJPEGThreadProc, &tEncodeParam);        if (Err)        {            DPrintf("error creating thread. (%d)", Err);            goto ravi1;        }    }#endif //JPEG_ENC    //Add By Michael    //ql201_osd_exit();    //ql201_osd_init(LUT1BIT_352X240,VID_ENCODE);        //////////////////////////////////////////////////////////////    //rick debug performance    //DRAM_LOG_START;    Err= ioctl(hEncDev, VIDIOC_STREAMON, &type);    if(!Err)     {        Enable_VO();  //enable VO manually here         //osd_text_show(TIMESTMP_X - FONT_WIDTH, TIMESTMP_Y_0, FName+0x0b,OSD_RED);                 //JAMES_20070117        while(!Err)         {        	if(!Recording){        		Recording=1;			sprintf (aCmdBuf, "<%s_%02d%02d%02d%02d.%s>", aFileType[iFileType], tmTimeNow.tm_mon + 1, tmTimeNow.tm_mday, tmTimeNow.tm_hour, tmTimeNow.tm_min, aExtNmae[iFileType]);            		PANEL_Output (LCM_LINE_1, FName);        	}            v4lbuf.type 	= V4L2_BUF_TYPE_VIDEO_CAPTURE;            v4lbuf.memory = V4L2_MEMORY_MMAP;            Err= ioctl(hEncDev, VIDIOC_DQBUF, &v4lbuf);            if(!Err)             {                retrycnt= 0;                //DPrintf(" dqbuf buf %d, drvaddr=%x, usraddr=%x, size=%x \n", v4lbuf.index, v4lbuf.m.userptr,                 //       (DWORD)appv4lbuf[v4lbuf.index].addr, v4lbuf.bytesused);                ulTotolCaptured += v4lbuf.bytesused;                if(v4lbuf.bytesused&0xFFF) framescnt++;                // Andy 2007.09.20: patch the case of TCP terminated by client                //if (capturetimeout != 1) {                ulActuCurrXfer= v4lbuf.bytesused;                if(!ulActuTotalXfer)                 {                    ioctl(hEncDev, QL201_ENC_S_QL_LATENCY_INFO, &latency_info);                    //DPrintf("\nCalled driver to let know that the 1st frame has been streamed (%d)\n", pktcnt);                }                 ulActuTotalXfer+= ulActuCurrXfer;                if(fd)                 {                    ql201_endianswap((unsigned long *)v4lbuf.m.userptr, v4lbuf.bytesused);//rick debug#ifdef Rick_TEST_STORE		        store_case=0;		        pthread_mutex_lock(&store_lock);		        if ((store_wr_ptr + v4lbuf.bytesused) > STORE_BUF_SIZE)		        {			   store_case=1;			   store_wr_ptr=0;	//wrap around "write" point		        } else		       {		 	  store_case =2;		       }		    		       if ((store_wr_ptr < store_end_ptr) && ((store_wr_ptr + v4lbuf.bytesused) > store_rd_ptr))		       {			   store_case = 3;			   DPrintf("\n Store buffer overflow\n");			   bCtrlCReceived = TRUE;		       }		       pthread_mutex_unlock(&store_lock);			if (store_case !=3)				memcpy((void*)(Store_buf+store_wr_ptr), (void*)v4lbuf.m.userptr, v4lbuf.bytesused);			pthread_mutex_lock(&store_lock);			if (store_case ==1)		//"write" wrap around			{				store_wr_ptr +=v4lbuf.bytesused;			} else if (store_case ==2)			{				store_wr_ptr +=v4lbuf.bytesused;				if (store_wr_ptr > store_end_ptr)					store_end_ptr =store_wr_ptr;			}			pthread_mutex_unlock(&store_lock);//			DPrintf("\nwr=0x%x,rd=0x%x,end=0x%x,len=0x%x\n",store_wr_ptr,store_rd_ptr,store_end_ptr,						v4lbuf.bytesused);#else                    fwrite((void*)v4lbuf.m.userptr, 1, v4lbuf.bytesused, fd);#endif//Rick_TEST_STORE	                }                tElapsedTime= time(0)-tStartTime;                                if ((framescnt & 0x0F) == 1)                 {                  DPrintf("\r%02d:%02d:%02d - %d MB, ~Rate=%05d Kbps, fps=%d(%d),Idx=%dK,Vbi=%dK ",                               tElapsedTime/3600, (tElapsedTime/60)%60, tElapsedTime%60, ulActuTotalXfer/(1024*1024),                              //(tElapsedTime ? (DWORD)((unsigned long long)(ulActuTotalXfer*8)/(1000*tElapsedTime)) : 0),                             (tElapsedTime ? (((ulActuTotalXfer/tElapsedTime)*8)/1000) : 0),                             (tElapsedTime ? (framescnt/tElapsedTime) : 0), framescnt,                             (indexsize/1024), (vbisize/1024) );                  if(pktcnt)                   {                    DPrintf("pkt=%05d(%04d) ", pktcnt, (ulActuTotalXfer/pktcnt));                  }                }                 if(tElapsedTime%60 != prev_time || !prev_time)                {                         prev_time = tElapsedTime%60;                    snprintf( Time, 9, "%02d:%02d:%02d",tElapsedTime/3600, (tElapsedTime/60)%60, tElapsedTime%60);                    //osd_text_show(TIMESTMP_X, TIMESTMP_Y_1,Time,OSD_RED);                }                                fflush(stdout);                // done with the buffer, return it back to the driver                Err= ioctl(hEncDev, VIDIOC_QBUF, &v4lbuf);                if(Err)                 {                    DPrintf("QBUF ioctl failed %d %s\n", errno, strerror(errno));                }            } else             {                if(errno==EAGAIN)                 {                    if(bStopped)                    {                        Err= 0;                        break; //EOS                    } else {                        Err= 0; //continue if driver doesn't have data                    }                }                DPrintf("\nDQBUF ioctl failed errno=%d, %s", errno, strerror(errno));                if(retrycnt++ >= MAX_RETRY_COUNT)                  { //something is wrong! so exit now                    bStopped= TRUE;                    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;                    Err= ioctl(hEncDev, VIDIOC_STREAMOFF, &type);                    if(Err==-1) {                        DPrintf("\nSTREAMOFF ioctl returns Err=%d, errnot=%d %s\n", Err, errno, strerror(errno));                    }                    Err= 1; //We have to return an error condition                    break;                }            }                        nKey = PANEL_KeyScan ();            if((capturetimeout && (tElapsedTime>=capturetimeout))  || (nKey == KEY_KEY2))            {                  bCtrlCReceived = TRUE;                  iStateNext = STATE_STANDBY;            }                                        if(bCtrlCReceived && !bStopped)            {                bStopped= TRUE;                iStateNext = STATE_STANDBY;#ifdef Rick_TEST_STORE		 bStoreStopped=TRUE;#endif                bCtrlCReceived = FALSE;                                if(nKey == KEY_KEY2)                 {                	DPrintf("\nStop key received. Calling STREAMOFF \n");                	 stop_mode = 1;                	 iStateNext = STATE_STANDBY;                }else                {                      DPrintf("\nCTRL+C  received. Calling STREAMOFF \n");                }                type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;                Err     = ioctl(hEncDev, VIDIOC_STREAMOFF, &type);                if(Err==-1)                     DPrintf("STREAMOFF ioctl returns Err=%d, errnot=%d %s\n", Err, errno, strerror(errno));                                //ht1621_disp_string("STOP");		 //LCD_REFRESH;                }            if(fdIdx && outbuff)  //Read and Save Index Data            {                if( (lastindexreadtime!=tElapsedTime) || (bStopped))                 {                    lastindexreadtime= tElapsedTime;                    Err= ioctl(hEncDev, QL201_DIAG_G_INDEX, &UserIdxData);                    if(errno==-EAGAIN)                     {                        lastindexreadtime+= 1;                    } else                     {                        lastindexreadtime= 0; //If data is read, let's try reading again                    }                                        if(!Err && UserIdxData.validsize)                     {			 #if SD_DIRECT_MODE                        ql201_endianswap((unsigned long *)outbuff, UserIdxData.validsize);			 #endif#ifdef Rick_TEST_STORE			indexsize+=  UserIdxData.validsize;			idx_store_case=0;			pthread_mutex_lock(&store_lock);			if ((idx_store_wr_ptr + UserIdxData.validsize) > IDX_STORE_BUF_SIZE)			{				idx_store_case=1;				idx_store_wr_ptr=0;	//wrap around "write" point			} else			{				idx_store_case =2;			}			if ((idx_store_wr_ptr < idx_store_end_ptr) && ((idx_store_wr_ptr + UserIdxData.validsize) > idx_store_rd_ptr))			{				idx_store_case = 3;				DPrintf("\n Idx Store buffer overflow\n");				bCtrlCReceived = TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -