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

📄 encode.c~

📁 cam ui application for linux
💻 C~
📖 第 1 页 / 共 5 页
字号:
                                //DPrintf("HSize      = %x\n", idxhdrbufnext.HSize      );                                //DPrintf("VSize      = %x\n", idxhdrbufnext.VSize      );                                //DPrintf("Reserved1  = %x\n", idxhdrbufnext.Reserved1  );                                //DPrintf("FrameRate  = %x\n", idxhdrbufnext.FrameRate  );                                //DPrintf("Reserved2  = %x\n", idxhdrbufnext.Reserved2  );                                // read next index                                ulActuCurrXfer = fread( &idxbufnext, 1, 20, fdrIdx );                                //DPrintf("\nIndex next  : %x\n", ftell(fdrIdx));                                //DPrintf("bSlice     = %x\n", idxbufnext.bSlice     );                                //DPrintf("bReserved  = %x\n", idxbufnext.bReserved  );                                //DPrintf("bFrameType = %x\n", idxbufnext.bFrameType );                                //DPrintf("bBlockSize = %x\n", idxbufnext.bBlockSize );                                //DPrintf("pts        = %x\n", idxbufnext.pts        );                                //DPrintf("dts        = %x\n", idxbufnext.dts        );                                //DPrintf("OffsetHigh = %x\n", idxbufnext.OffsetHigh );                                //DPrintf("OffsetLow  = %x\n", idxbufnext.OffsetLow  );                                if (idxbufnext.OffsetHigh != idxbuf.OffsetHigh)                                 {                                    DPrintf("High update: Next(%x %x) Curr(%x %x)!!\n", idxbufnext.OffsetHigh, idxbufnext.OffsetLow, idxbuf.OffsetHigh, idxbuf.OffsetLow);                                    ulGOPXferByte = (0xFFFFFFFFUL - idxbuf.OffsetLow);                                    ulGOPXferByte = ulGOPXferByte + idxbufnext.OffsetLow + 1;                                } else {                                    ulGOPXferByte = idxbufnext.OffsetLow - idxbuf.OffsetLow;                                }                                // Andy 2007.09.20: commented out due to use new scheme                                //if (ulGOPXferByte > 0xFFFFF) {                                //    DPrintf("Error! bitstream length 0x%x bytes of this GOP is too long!\n", ulGOPXferByte);                                //    DPrintf("Error! Curr offset(H-0x%x L-0x%x) Prev offset(H-0x%x L-0x%x)!!\n", idxbufnext.OffsetHigh, idxbufnext.OffsetLow, idxbuf.OffsetHigh, idxbuf.OffsetLow);                                //}                                gopsize[gopsizecnt] = ulGOPXferByte;                                // Andy 2007.09.20: use new scheme                                //if ((ulIndexStartNext - ulIndexStart) > 0xFFF) {                                //    DPrintf("Error! index length 0x%x bytes of this GOP is too long!\n", (ulIndexStartNext - ulIndexStart));                                //}                                //gopsize[gopsizecnt] += ((ulIndexStartNext - ulIndexStart) << 20);   // NOTE: only support 12 bits, max 4095 bytes of index data for one GOP                                fseek( fdrIdx, -40, SEEK_CUR );   // back to the starting point of the next index header                            } // if (bGOPJumpDir)                            // if jump                            if (bGOPJumpSpeed != 0)                             {                                if (bGOPJumpDir)                                 {                                    // fast reverse                                    // FR 1x means 1x reverse                                    for (bGOPJumpCount=0; bGOPJumpCount<=bGOPJumpSpeed; bGOPJumpCount++)                                    {                                        if (gopsizecnt < 2)                                         {                                            DPrintf("\n Already back to file start!\n");                                            //bIndexExist = 0;                                            gopsizecnt = 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);                                            fseek( fdrIdx, 0, SEEK_SET );                                            fseek( fdr, 0, SEEK_SET );                                            //PBTrickModeProcess(hDecDev,KEY_FUN_0);                                            goto check_index;                                        }                                        gopsizecnt--;                                        // Andy 2007.09.20: new scheme                                        fseek( fdrIdx, 16, SEEK_CUR );                                        fread( &ulGOPXferByte, 1, 4, fdrIdx );                                        //DPrintf("previous index offset is %x\n", ulGOPXferByte);                                        fseek( fdrIdx, ulGOPXferByte, SEEK_SET );                                        ulGOPXferByte = gopsize[gopsizecnt];                                        //ulGOPXferByte = gopsize[gopsizecnt] >> 20;                                        //fseek( fdrIdx, 0 - (long)ulGOPXferByte, SEEK_CUR );                                        //ulGOPXferByte = gopsize[gopsizecnt] & 0xFFFFF;                                        fseek( fdr, 0 - (long)ulGOPXferByte, SEEK_CUR );                                    }                                    // Andy 2007.09.20: new scheme                                    fseek( fdrIdx, 16, SEEK_CUR );                                    fread( &ulGOPXferByte, 1, 4, fdrIdx );                                    //DPrintf("previous index offset is %x\n", ulGOPXferByte);                                    fseek( fdrIdx, ulGOPXferByte, SEEK_SET );                                    //ulGOPXferByte = gopsize[gopsizecnt] >> 20;                                    //fseek( fdrIdx, ulGOPXferByte, SEEK_CUR );                               } else                                {                                    // fast forward                                    // FF 1x means normal playback                                    if (bGOPJumpCount < (bGOPJumpSpeed-1))                                     	{                                        // Andy 2007.09.20: new scheme                                        ulGOPXferByte = gopsize[gopsizecnt];                                        //ulGOPXferByte = gopsize[gopsizecnt] & 0xFFFFF;                                        fseek( fdr, ulGOPXferByte, SEEK_CUR );                                        gopsizecnt++;                                        bGOPJumpCount++;                                        goto check_index;                                     } else                                      {                                        bGOPJumpCount = 0;                                     }                                }                                // Andy 2007.09.20: new scheme                                ulGOPXferByte = gopsize[gopsizecnt];                                //ulGOPXferByte = gopsize[gopsizecnt] & 0xFFFFF;                            } // if (bGOPJumpSpeed != 0)                            //complete this GOP analysis                            gopsizecnt++;                            bGOPChecked = 1;                        } // end of if (bGOPCheck == 0)                        // Andy 2007.07.28: for trick mode                        if (ulGOPXferByte > v4lbuf.length)                         {                            if (ulGOPXferByteRemain)                             {                                ulActuCurrXfer = ulGOPByteSkip + fread( (char*)(v4lbuf.m.userptr + ulGOPByteSkip), 1, ulGOPXferByteRemain, fdr);                                if (ulActuCurrXfer)                                 {                                    ulGOPXferByte -= ulGOPXferByteRemain;                                }                            } else                             {                                ulActuCurrXfer = fread( (char*)v4lbuf.m.userptr, 1, v4lbuf.length, fdr);                                if (ulActuCurrXfer)                                 {                                    ulGOPXferByte -= ulActuCurrXfer;                                }                            }                            ulGOPXferByteRemain = 0;                            ulGOPByteSkip = 0;                        } else                         {                            if (bIndexExist)                             {                                ulActuCurrXfer 		= fread( (char*)v4lbuf.m.userptr, 1, ulGOPXferByte, fdr);                                ulGOPByteSkip 		= ulActuCurrXfer;   // already read these bytes                                ulGOPXferByteRemain = v4lbuf.length - ulGOPXferByte;                                bGOPChecked 		= 0;   // need to check index of the next GOP                                goto check_index;                            } else                             {                                ulActuCurrXfer = fread( (char*)v4lbuf.m.userptr, 1, v4lbuf.length, fdr);                            }                        }                    } // end of if (bIndexExist)                    //DPrintf("Read %d bytes from %s (%x) (ptr=%x, size=%x) \n", ulActuCurrXfer, FName, fdr,                    //       v4lbuf.m.userptr, v4lbuf.length); #else // originally                    ulActuCurrXfer= fread( (char*)v4lbuf.m.userptr, 1, v4lbuf.length, fdr);                    //DPrintf("Read %d bytes from %s (%x) (ptr=%x, size=%x) \n", ulActuCurrXfer, FName, fdr,                    //       v4lbuf.m.userptr, v4lbuf.length); #endif#endif                }                if(!ulActuTotalXfer)  time(&tStartTime);                if(!ulActuCurrXfer)                 {                    DPrintf("\n No more data xfer to driver buffer! (%d); UDP max pkt size (%d) \n", ulActuCurrXfer, maxrecdpktsize);                    stop_immediate= 0; //Stop after decoding all buffers                    bCtrlCReceived = TRUE;                    //PBTrickModeProcess(hDecDev,KEY_FUN_0);                    //sleep(2);                } else                 { //Buffer is full enough! let's send it to the driver                    if(fdw)                     {                        fwrite((void*)v4lbuf.m.userptr, 1, ulActuCurrXfer, fdw);                    }                    if(!Err)                     {                        v4lbuf.bytesused= ulActuCurrXfer;                        Err= ioctl(hDecDev, VIDIOC_QBUF, &v4lbuf);                        // Dont need to set the VIDIOC_STREAMON again.KEVIN 20070912                        //if(mcastaddr && !ulActuTotalXfer) Err= ioctl(hDecDev, VIDIOC_STREAMON, &type);                        ulActuTotalXfer+= ulActuCurrXfer;                        if(Err)                         {                            DPrintf("QBUF ioctl failed %d %s\n", errno, strerror(errno));                        }                        tElapsedTime= time(0)-tStartTime;                        #if 0                                                print_cnt++;                        if (print_cnt== 0x08)                         {                            print_cnt= 0;                            DPrintf("\r%02d:%02d:%02d - %d MB, ~Rate=%05d Kbps,pkt=%05d(%04d) A=%06x,size=%04x",                                    tElapsedTime/3600,                                    (tElapsedTime/60)%60,                                    tElapsedTime%60,                                    ulActuTotalXfer/(1024*1024),                                    (tElapsedTime ? (DWORD)(((unsigned long long)(ulActuTotalXfer)*8)/(1000*tElapsedTime)) : 0),                                   pktcnt,                                    (pktcnt?(ulActuTotalXfer/pktcnt):0),                                    v4lbuf.m.userptr,                                    v4lbuf.bytesused);                        }#endif                        snprintf( Time, 9, "%02d:%02d:%02d",tElapsedTime/3600, (tElapsedTime/60)%60, tElapsedTime%60);                       // osd_text_show(TIMESTMP_X,TIMESTMP_Y_1,Time,OSD_BLACK);                    }                }                if(playbacktimeout && (tElapsedTime>=playbacktimeout))                 {                    bCtrlCReceived = TRUE;                }                if(Err)                 {                    bCtrlCReceived = TRUE;                }                fflush(stdout);            } else             {#ifdef DEC_TRICK_MODE                Err= ioctl(hDecDev, QL201_DEC_G_TRICK_MODE, &trickmode);                if(trickmode.trickmode== 0)                 {#endif                     //break; //EOS                     if(errno==EAGAIN)                      {                           if(bStopped)                            {                               break; //EOS                           } else                           {                              Err= 0; //continue if driver doesn't have data#ifdef FULL_DUPLEX                              sleep(1);   // Andy 2007.07.20: wait for a while#endif                          }                      }                      DPrintf("\nDQBUF ioctl failed %d (EAGAIN=%d) %s", errno, EAGAIN, strerror(errno));   #ifdef DEC_TRICK_MODE           	} else //trickmode.trickmode != 0              {                     DPrintf("\nBuffer is full due to halt playback by trick mode\n");                     Err= 0;   // wait              }#endif                           if(retrycnt++ >= MAX_RETRY_COUNT)                { //something is wrong! so exit now	              bStopped= TRUE;	              type 	= V4L2_BUF_TYPE_VIDEO_OUTPUT;	              Err	= ioctl(hDecDev, QL201_DEC_S_STOP_IMMEDIATE, &stop_immediate); //Set to Stop immediate	              Err	= ioctl(hDecDev, VIDIOC_STREAMOFF, &type);	              if(Err==-1) 	              {	                   DPrintf("STREAMOFF ioctl returns Err=%d, errnot=%d %s\n", Err, errno, strerror(errno));	              }	              break;              }                          }            pauseloop:                       //=============== get the key input event ===================            //key = PBTrickModeProcess(hDecDev,get_keypad());            /*if(key == 2)//pause            {                  usleep(10);                   goto  pauseloop;	            }else            if(key == 0)	            {            	   bCtrlCReceived = TRUE;            }*/                        if(playbacktimeout && (tElapsedTime>=playbacktimeout))                  bCtrlCReceived = TRUE;            if(bCtrlCReceived && !bStopped)           {                bStopped= TRUE;                bCtrlCReceived = FALSE;                Err= ioctl(hDecDev, QL201_DEC_S_STOP_IMMEDIATE, &stop_immediate); //Set to Stop immediate                type = V4L2_BUF_TYPE_VIDEO_OUTPUT;                Err= ioctl(hDecDev, VIDIOC_STREAMOFF, &type);                if(Err==-1)                 {                    DPrintf("STREAMOFF ioctl returns Err=%d, errnot=%d %s\n", Err, errno, strerror(errno));                }                break;           }           usleep(10);       }//while            tElapsedTime= time(0)-tStartTime;      DPrintf("\r%02d:%02d:%02d - %d MB, ~Rate=%05d Kbps,pkt=%05d(%04d) A=%06x,size=%04x",                tElapsedTime/3600,                (tElapsedTime/60)%60,                tElapsedTime%60,                ulActuTotalXfer/(1024*1024),                (tElapsedTime ? (DWORD)((unsigned long long)(ulActuTotalXfer*8)/(1000*tElapsedTime)) : 0),               pktcnt,                (pktcnt?(ulActuTotalXfer/pktcnt):0),                v4lbuf.m.userptr,                v4lbuf.bytesused);    } else     {        DPrintf("STREAMON ioctl failed %d %s\n", errno, strerror(errno));    }        //osd_text_clear(TIMESTMP_X - 2*FONT_WIDTH, TIMESTMP_Y_0,0,FName+0x0a);    //osd_text_clear(TIMESTMP_X,TIMESTMP_Y_1,0,Time);    //QL_clear_PbModeOSD();    SET_VO_MODE(VID_BYPASS);    if(hDecDev) {        close(hDecDev);        hDecDev= 0;    }    if(fdr) {        fflush(fdr);        fclose(fdr);        fdr= 0;    }#ifdef DEC_TRICK_MODE    // Andy 2007.08.20    if(fdrIdx) {        fflush(fdrIdx);        fclose(fdrIdx);        fdr= 0;    }#endif    if(fdw) {        fflush(fdw);        fclose(fdw);        fdw= 0;    }    DPrintf("\n");    return Err;}#elselong DecodeAndStreamv4(char *FName, unsigned int playbacktimeout) {    long Err= 0;    FILE *fdr= 0, *fdw= 0;

⌨️ 快捷键说明

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