亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? v4l.c

?? Linux下的USB攝像頭拍照程序
?? C
字號:
/**********************************************************************
*
*
* 文 件 名:  v4l.c
*
* 內容描述:  視頻監控系統源文件
*
*
*/

#include "v4l.h"

/*********************************************************************
*
*
* 函數名:v4l_open
*
* 功  能: 打開設備
*
* 輸  入: dev
*                 vd
*                
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_open(const char *dev, v4l_device *vd )
{
    if( !dev )
    {
        dev=DEFAULT_DEVICE ;
    }
      
    if( ( vd->fd = open( dev, O_RDWR ) )  < 0 )
    {
        perror( "v4l_open error" );
        return -1;
    }
     
    #ifdef DEBUG_PRINT
    printf( "you have open dev successfully" );
    #endif  
    
   return 0;
}

/*********************************************************************
*
*
* 函數名: v4l_get_capability
*
* 功  能: 獲取設備屬性
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_get_capability( v4l_device *vd )
{
    if( ioctl( vd->fd, VIDIOCGCAP, &( vd->capability ) ) <0 )
    {
        perror( "v4l_get_capability" );
        return -1 ;
    }

    #ifdef DEBUG_PRINT
    printf( "\nname=%s\n,maxwidth=%d, maxheight=%d\nminwidth=%d, minheight=%d\nchannels=%d, type=%d,audios=%d\n",
              vd->capability.name,
              vd->capability.maxwidth,vd->capability.maxheight,vd->capability.minwidth,
              vd->capability.minheight,vd->capability.channels, vd->capability.type,
              vd->capability.audios );
    #endif
    
    return 0; 
}

/*********************************************************************
*
*
* 函數名:v4l_get_picture
*
* 功  能:獲取圖片屬性
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_get_picture( v4l_device *vd )
{
    if( ioctl( vd->fd,VIDIOCGPICT,&( vd->picture ) ) < 0 )
    {
         return -1;
    } 

    #ifdef DEBUG_PRINT
    printf("brightness=%d,hue=%d \ncolour=%d,contrast=%d \nwhiteness=%d,depth=%d,palette=%d\n" , 
        vd->picture.brightness,vd->picture.hue, 
        vd->picture.colour,vd->picture.contrast,vd->picture.whiteness,
        vd->picture.depth,vd->picture.palette ) ;
    #endif
    
    return 0;
}

/*********************************************************************
*
*
* 函數名:v4l_set_picture
*
* 功  能:設置圖片屬性
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_set_picture( v4l_device *vd ) 
{
    if( ioctl( vd->fd, VIDIOCSPICT, &( vd->picture ) ) < 0 )
    {
        return -1;
    }

    
    return 0;
}

/*********************************************************************
*
*
* 函數名:v4l_get_channels
*
* 功  能:獲取通道信息
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_get_channels( v4l_device *vd )
{
    int i;

    for( i=0;i < vd->capability.channels ; i++ )
    {
         vd->channel[i].channel = i;               //確定通道
  
         if( ioctl( vd->fd , VIDIOCGCHAN, &( vd->channel[i] ) ) <0 )
         {
              perror( "v4l_get_channel" );
              return -1;
          }
    }
    return 0;
}

/*********************************************************************
*
*
* 函數名:v4l_get_window(v4l_device *vd);
*
* 功  能:獲取window信息
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_get_window(v4l_device *vd)
{

    if( ioctl( vd->fd, VIDIOCGWIN, &( vd->window ) ) < 0 )
    {
        return -1;
    }
    return 0;
}


/*********************************************************************
*
*
* 函數名:v4l_get_mbuf
*
* 功  能:獲取內存映射信息
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  -1----失敗
*                   0----成功
*
*/
int v4l_get_mbuf( v4l_device *vd )
{
    if( ioctl( vd->fd,VIDIOCGMBUF,&( vd->mbuf ) ) <0 )
    {
         perror( "get_mbuf:" );
         return -1;
    }
    
    if ( ( vd->map = ( unsigned char * )mmap( 0, vd->mbuf.size, 
    	PROT_READ | PROT_WRITE, MAP_SHARED, vd->fd, 0 ) ) < 0 )
   {
       perror("v4l_mmap_init:mmap");
       return -1;
    }
    
    return 0 ;
}

/*********************************************************************
*
*
* 函數名: v4l_init_mbuff
*
* 功  能:初始化內存映射信息
*
* 輸  入: vd
*
* 輸  出: 無
*
* 返  回:  0----成功
*
*/
int v4l_init_mbuf(v4l_device *vd)
{
    //vd->mmap.frame = 10 ; 
    vd->mmap.width = MAX_WIDTH;
    vd->mmap.height = MAX_HEIGHT;
    vd->mmap.format = vd->picture.palette;
    vd->frame_current = 0;
    vd->frame_using[0] = 0;
    vd->frame_using[1] = 0;

    #ifdef DEBUG_PRINT
    printf( "\nbegin to init device:" );
    #endif
    
    return 0;
}

/*********************************************************************
*
*
* 函數名: v4l_get_address
*
* 功  能:獲取數據在圖像的地址
*
*
*/
unsigned char *v4l_get_address(v4l_device *vd)
{
     return (vd->map + vd->mbuf.offsets[vd->frame_current]);
}

/*********************************************************************
*
*
* 函數名: v4l_grab_frame
* 功  能:捕獲幀
*
*
*/
int v4l_grab_frame(v4l_device *vd, int frame)
{

#ifdef DEBUG_PRINT
     printf("enter grab_frame\n");
#endif
     if (vd->frame_using[frame]) 
     {
         fprintf(stderr, "v4l_grab_frame: frame %d is already used.\n", frame);
         return -1;
     }

     vd->mmap.frame = frame;
     
     if ( ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap ) ) < 0 ) 
     {
            perror( "v4l_grab_frame" );
            return -1;
     }
     
      vd->frame_using[frame] = 1;
      vd->frame_current = frame;

      
      return 0;
      
}

/*********************************************************************
*
*
* 函數名: v4l_grab_sync
*
* 功  能:與內存映射捕獲一致
*
*
*/
int v4l_grab_sync(v4l_device *vd)
{
    // printf("enter grab_sync\n");
     
     if (ioctl(vd->fd, VIDIOCSYNC, &(vd->frame_current)) < 0) 
     {
         perror("v4l_grab_sync");
      }

      vd->frame_using[vd->frame_current] = 0;
    //  printf("leave grab_sync\n");
      return 0;
}

/*********************************************************************
*
*
* 函數名: v4l_munmap
*
* 功  能:停止內存映射
*
*
*/
int v4l_munmap( v4l_device *vd )
{
    if ( munmap( vd->map, vd->mbuf.size ) < 0 ) 
    {
        perror( "v4lmunmap:munmap" );
        return -1;
     }
    
     return 0;
}

/*********************************************************************
*
*
* 函數名: v4l_close
*
* 功  能:關閉設備
*
*
*/
int v4l_close(v4l_device *vd)
{
     close(vd->fd);
     
     return 0;
}

/*********************************************************************
*
*
* 函數名: v4l_grab_movie
*
* 功  能:捕獲連續圖像
*
*/
void  v4l_grab_movie(v4l_device *vd)
 {
    #ifdef DEBUG_PRINT
   {
           printf("video_mbuf include size=%u,frame=%d,offdet=%d\n", \
               vd->mbuf.size, vd->mbuf.frames, vd->mbuf.offsets[1]);
   }
     #endif
     
     v4l_grab_frame(vd, vd->frame_current);/*獲取下一 幀*/
     
     v4l_grab_sync(vd);/*等待傳完一 幀*/
     
     vd->buffer = v4l_get_address(vd);/*得到這一幀的地址*/
     
     vd->frame_current = (vd->frame_current+1)%2; /* 下一幀的frame*/
    
 }


/*
YUV420轉RGB

*/

#define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16)))

static inline void
v4l_copy_420_block (int yTL, int yTR, int yBL, int yBR, int u, int v,
    int rowPixels, unsigned char * rgb, int bits)
{
    const int rvScale = 91881;
    const int guScale = -22553;
    const int gvScale = -46801;
    const int buScale = 116129;
    const int yScale  = 65536;
    int r, g, b;

    g = guScale * u + gvScale * v;
    r = rvScale * v;
    b = buScale * u;

    yTL *= yScale; yTR *= yScale;
    yBL *= yScale; yBR *= yScale;

    if (bits == 24) {
        /* Write out top two pixels */
        rgb[0] = LIMIT(b+yTL); rgb[1] = LIMIT(g+yTL); rgb[2] = LIMIT(r+yTL);
        rgb[3] = LIMIT(b+yTR); rgb[4] = LIMIT(g+yTR); rgb[5] = LIMIT(r+yTR);

        /* Skip down to next line to write out bottom two pixels */
        rgb += 3 * rowPixels;
        rgb[0] = LIMIT(b+yBL); rgb[1] = LIMIT(g+yBL); rgb[2] = LIMIT(r+yBL);
        rgb[3] = LIMIT(b+yBR); rgb[4] = LIMIT(g+yBR); rgb[5] = LIMIT(r+yBR);
    } else if (bits == 16) {
        /* Write out top two pixels */
        rgb[0] = ((LIMIT(b+yTL) >> 3) & 0x1F) | ((LIMIT(g+yTL) << 3) & 0xE0);
        rgb[1] = ((LIMIT(g+yTL) >> 5) & 0x07) | (LIMIT(r+yTL) & 0xF8);

        rgb[2] = ((LIMIT(b+yTR) >> 3) & 0x1F) | ((LIMIT(g+yTR) << 3) & 0xE0);
        rgb[3] = ((LIMIT(g+yTR) >> 5) & 0x07) | (LIMIT(r+yTR) & 0xF8);

        /* Skip down to next line to write out bottom two pixels */
        rgb += 2 * rowPixels;

        rgb[0] = ((LIMIT(b+yBL) >> 3) & 0x1F) | ((LIMIT(g+yBL) << 3) & 0xE0);
        rgb[1] = ((LIMIT(g+yBL) >> 5) & 0x07) | (LIMIT(r+yBL) & 0xF8);

        rgb[2] = ((LIMIT(b+yBR) >> 3) & 0x1F) | ((LIMIT(g+yBR) << 3) & 0xE0);
        rgb[3] = ((LIMIT(g+yBR) >> 5) & 0x07) | (LIMIT(r+yBR) & 0xF8);
    }
}

int
v4l_yuv420p2rgb (unsigned char *rgb_out, unsigned char *yuv_in,
                 int width, int height, int bits)
{
    const int numpix = width * height;
    const unsigned int bytes = bits >> 3;
    int h, w, y00, y01, y10, y11, u, v;
    unsigned char *pY = yuv_in;
    unsigned char *pU = pY + numpix;
    unsigned char *pV = pU + numpix / 4;
    unsigned char *pOut = rgb_out;

    if (!rgb_out || !yuv_in)
        return -1;

    for (h = 0; h <= height - 2; h += 2) {
        for (w = 0; w <= width - 2; w += 2) {
            y00 = *(pY);
            y01 = *(pY + 1);
            y10 = *(pY + width);
            y11 = *(pY + width + 1);
            u = (*pU++) - 128;
            v = (*pV++) - 128;

            v4l_copy_420_block (y00, y01, y10, y11, u, v, width, pOut, bits);

            pY += 2;
            pOut += bytes << 1;

        }
        pY += width;
        pOut += width * bytes;
    }
    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合色狠狠综合色| 日韩欧美国产一区在线观看| 蜜芽一区二区三区| 亚洲国产精品久久不卡毛片| 一区二区三区精品视频在线| 亚洲天堂免费在线观看视频| 亚洲视频一区在线观看| 国产精品综合二区| 大胆亚洲人体视频| 蜜桃精品视频在线| 一区二区视频在线| 日韩一二三区不卡| 日韩欧美在线观看一区二区三区| 在线观看91av| 日韩精品一区二区三区在线| 日韩欧美在线影院| 久久综合成人精品亚洲另类欧美| 日韩精品一区在线| 久久精品人人爽人人爽| 亚洲欧洲一区二区在线播放| 亚洲高清中文字幕| 精品一区二区三区香蕉蜜桃| 高清在线成人网| 欧美中文字幕一区二区三区亚洲| 在线不卡一区二区| 久久综合久久久久88| 久久精品99久久久| 国产成人在线观看免费网站| 国产女人aaa级久久久级| 欧美精彩视频一区二区三区| 国产女人18毛片水真多成人如厕| 亚洲免费av高清| 日日摸夜夜添夜夜添亚洲女人| 亚洲一区二区三区四区不卡| 久草精品在线观看| 一本高清dvd不卡在线观看| 91麻豆精品国产自产在线观看一区 | 国产亚洲一区二区三区在线观看| 99久久精品国产精品久久| 综合电影一区二区三区 | 欧美日韩国产影片| 精品视频一区二区三区免费| 欧美日韩电影一区| 久久免费视频一区| 青青草国产精品亚洲专区无| 久草精品在线观看| 欧美日韩二区三区| 亚洲综合免费观看高清完整版在线 | 国产日韩三级在线| 亚洲一区成人在线| voyeur盗摄精品| 精品国产不卡一区二区三区| 亚洲成人黄色小说| 欧美日韩视频不卡| 亚洲愉拍自拍另类高清精品| 国产成人免费视频一区| 韩国毛片一区二区三区| 色女孩综合影院| 国产亚洲综合av| 麻豆91精品视频| 91精品国产免费| 亚洲国产视频网站| 一本色道a无线码一区v| 国产精品人妖ts系列视频| 韩国欧美一区二区| 日韩精品一区二区三区四区视频| 午夜视频在线观看一区二区三区| 91丝袜高跟美女视频| 国产精品第四页| 97se亚洲国产综合自在线不卡| 日韩欧美精品三级| 美女网站视频久久| 欧美一区二区三级| 亚洲精品第1页| 亚洲精品第1页| 色一情一乱一乱一91av| 18欧美乱大交hd1984| 丁香天五香天堂综合| 国产精品欧美经典| 不卡的av电影| 尤物av一区二区| 欧美日韩免费高清一区色橹橹| 亚洲综合在线电影| 欧美日韩国产综合久久| 日韩和欧美一区二区| 欧美一区二区免费视频| 韩国av一区二区三区四区| 亚洲精品一区二区三区香蕉| 国产精品小仙女| 亚洲人成网站在线| 欧美三级电影一区| 久久99国产精品免费网站| 欧美tk丨vk视频| 成人免费看的视频| 一区二区三区在线观看国产| 91精品国产丝袜白色高跟鞋| 韩国欧美国产一区| 玉米视频成人免费看| 欧美精品色一区二区三区| 久久精品国产久精国产| 国产精品国产三级国产有无不卡| 在线观看91视频| 久久国产剧场电影| 亚洲欧美日韩中文播放| 日韩午夜激情免费电影| av动漫一区二区| 麻豆国产一区二区| 亚洲欧美自拍偷拍| 日韩精品一区二区三区三区免费| 成人av在线播放网站| 午夜精品福利视频网站| 国产色婷婷亚洲99精品小说| 欧美日韩夫妻久久| 国产电影精品久久禁18| 天天av天天翘天天综合网| 国产日韩精品视频一区| 欧美日韩久久一区| 99久久精品情趣| 精品亚洲aⅴ乱码一区二区三区| 亚洲少妇中出一区| 欧美不卡一区二区| 欧美色窝79yyyycom| 成人丝袜视频网| 美女mm1313爽爽久久久蜜臀| 亚洲综合免费观看高清完整版在线 | 国产精品一区二区久久不卡| 亚洲午夜免费福利视频| 久久香蕉国产线看观看99| 在线视频国内一区二区| 国产成人精品影视| 激情五月婷婷综合| 亚洲第一久久影院| 一区二区三区高清在线| 国产精品美女久久久久高潮 | 在线中文字幕一区二区| 国产呦萝稀缺另类资源| 肉丝袜脚交视频一区二区| 国产精品嫩草影院com| 精品久久久久99| 91啦中文在线观看| 成人蜜臀av电影| 国产在线乱码一区二区三区| 亚洲一区二区三区美女| 亚洲欧洲精品一区二区三区不卡| caoporen国产精品视频| 成人短视频下载| 激情图片小说一区| 免费在线观看视频一区| 亚洲成人精品一区| 亚洲777理论| 亚洲成人777| 国产精品久久久久影院| 欧美v日韩v国产v| 精品久久久久久久一区二区蜜臀| 欧美一区二区大片| 欧美精品色综合| 91热门视频在线观看| 日韩成人免费看| 久久成人麻豆午夜电影| 久久国产福利国产秒拍| 美女www一区二区| 国产一区视频导航| 国产麻豆欧美日韩一区| 亚洲国产婷婷综合在线精品| 久久久久九九视频| 中文字幕av资源一区| 中文字幕第一区综合| 国产女主播一区| 成人免费一区二区三区视频| 亚洲免费av高清| 亚洲成av人片一区二区三区| 日韩国产在线观看| 久久成人羞羞网站| 99国产精品久久久久久久久久| 91视频国产观看| 欧美三级蜜桃2在线观看| 欧美剧情片在线观看| 欧美成人国产一区二区| 亚洲欧美综合色| 日本不卡一二三区黄网| 国产一区 二区| 91麻豆国产在线观看| 日韩亚洲电影在线| 国产精品久久久久影视| 亚洲成av人片在线观看| 激情深爱一区二区| 色综合夜色一区| 日韩免费高清视频| 亚洲婷婷综合久久一本伊一区| 亚洲成a人片综合在线| 国产精品一线二线三线| 色屁屁一区二区| 精品sm在线观看| 亚洲午夜在线视频| 国产精品18久久久久久久久 | 亚洲va欧美va天堂v国产综合| 欧美bbbbb| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美日韩亚洲另类| 中文字幕欧美激情一区|