1. 程式人生 > >友善之臂視訊監控方案原始碼學習(6)

友善之臂視訊監控方案原始碼學習(6)

【問題描述】在友善之臂視訊監控方案原始碼學習(5) - 輸入控制一文中,介紹了input_run完成的功能。本文結合input_run實現的視訊採集執行緒對視訊採集進行詳細分析。

【解析】

1 涉及到的檔案和目錄

mjpg-streamer-mini2440-read-only/start_uvc.sh

mjpg-streamer-mini2440-read-only/mjpg_streamer.c

mjpg-streamer-mini2440-read-only/mjpg_streamer.h

mjpg-streamer-mini2440-read-only/plugins/input.h

mjpg-streamer-mini2440-read-only/plugins/input_uvc

2 視訊裝置初始化

視訊裝置初始化在input_init函式中完成(mjpg-streamer-mini2440-read-only/plugins/input_uvc/input_uvc.c):

  1. /* open video device and prepare data structure */  
  2.   if (init_videoIn(videoIn, dev, width, height, fps, format, 1) <0) {  
  3.     IPRINT("init_VideoIn failed\n");  
  4.     closelog();  
  5.     exit(EXIT_FAILURE);  
  6.   }  

init_videoIn函式中呼叫的視訊初始化程式碼如下(mjpg-streamer-mini2440-read-only/plugins/input_uvc/V412uvc.c):

  1. if (init_v4l2 (vd) <0) {  
  2.     fprintf (stderr, " Init v4L2 failed !! exit fatal \n");  
  3.     goto error;;  
  4.   }  

init_v412程式碼如下(mjpg-streamer-mini2440-read-only/plugins/input_uvc/V412uvc.c

):

  1. static int init_v4l2(struct vdIn *vd)  
  2. {  
  3.   int i;  
  4.   int ret = 0;  
  5.   if ((vd->fd = open(vd->videodevice, O_RDWR)) == -1) {  
  6.     perror("ERROR opening V4L interface");  
  7.     return -1;  
  8.   }  
  9.   memset(&vd->cap, 0, sizeof(struct v4l2_capability));  
  10.   ret = ioctl(vd->fd, VIDIOC_QUERYCAP, &vd->cap);  
  11.   if (ret <0) {  
  12.     fprintf(stderr, "Error opening device %s: unable to query device.\n", vd->videodevice);  
  13.     goto fatal;  
  14.   }  
  15.   if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {  
  16.     fprintf(stderr, "Error opening device %s: video capture not supported.\n",  
  17.            vd->videodevice);  
  18.     goto fatal;;  
  19.   }  
  20.   if (vd->grabmethod) {  
  21.     if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) {  
  22.       fprintf(stderr, "%s does not support streaming i/o\n", vd->videodevice);  
  23.       goto fatal;  
  24.     }  
  25.   } else {  
  26.     if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) {  
  27.       fprintf(stderr, "%s does not support read i/o\n", vd->videodevice);  
  28.       goto fatal;  
  29.     }  
  30.   }  
  31.   /*  
  32.    * set format in  
  33.    */  
  34.   memset(&vd->fmt, 0, sizeof(struct v4l2_format));  
  35.   vd->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  36.   vd->fmt.fmt.pix.width = vd->width;  
  37.   vd->fmt.fmt.pix.height = vd->height;  
  38.   vd->fmt.fmt.pix.pixelformat = vd->formatIn;  
  39.   vd->fmt.fmt.pix.field = V4L2_FIELD_ANY;  
  40.   ret = ioctl(vd->fd, VIDIOC_S_FMT, &vd->fmt);  
  41.   if (ret <0) {  
  42.     perror("Unable to set format");  
  43.     goto fatal;  
  44.   }  
  45.   if ((vd->fmt.fmt.pix.width != vd->width) ||  
  46.       (vd->fmt.fmt.pix.height != vd->height)) {  
  47.     fprintf(stderr, " format asked unavailable get width %d height %d \n", vd->fmt.fmt.pix.width, vd->fmt.fmt.pix.height);  
  48.     vd->width = vd->fmt.fmt.pix.width;  
  49.     vd->height = vd->fmt.fmt.pix.height;  
  50.     /*  
  51.      * look the format is not part of the deal ???  
  52.      */  
  53.   }  
  54.     if(vd->fmt.fmt.pix.pixelformat!=vd->formatIn)  
  55.     {  
  56.         char fourcc1[5]={0,0,0,0,0};  
  57.         char fourcc2[5]={0,0,0,0,0};  
  58.         memmove(fourcc1,(char*)&vd->formatIn,4);  
  59.         memmove(fourcc2,(char*)&vd->fmt.fmt.pix.pixelformat,4);  
  60.         fprintf(stderr, " requested %s but got %s format instead\n",fourcc1,fourcc2);  
  61.     vd->formatIn = vd->fmt.fmt.pix.pixelformat;  
  62.     }  
  63.   /*  
  64.    * set framerate  
  65.    */  
  66.   struct v4l2_streamparm *setfps;  
  67.   setfps = (struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm));  
  68.   memset(setfps, 0, sizeof(struct v4l2_streamparm));  
  69.   setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  70.   setfps->parm.capture.timeperframe.numerator = 1;  
  71.   setfps->parm.capture.timeperframe.denominator = vd->fps;  
  72.   ret = ioctl(vd->fd, VIDIOC_S_PARM, setfps);  
  73.   /*  
  74.    * request buffers  
  75.    */  
  76.   memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers));  
  77.   vd->rb.count = NB_BUFFER;  
  78.   vd->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  79.   vd->rb.memory = V4L2_MEMORY_MMAP;  
  80.   ret = ioctl(vd->fd, VIDIOC_REQBUFS, &vd->rb);  
  81.   if (ret <0) {  
  82.     perror("Unable to allocate buffers");  
  83.     goto fatal;  
  84.   }  
  85.   /*  
  86.    * map the buffers  
  87.    */  
  88.   for (i = 0; i <NB_BUFFER; i++) {  
  89.     memset(&vd->buf, 0, sizeof(struct v4l2_buffer));  
  90.     vd->buf.index

    相關推薦

    友善視訊監控方案原始碼學習(6)

    【問題描述】在友善之臂視訊監控方案原始碼學習(5) - 輸入控制一文中,介紹了input_run完成的功能。本文結合input_run實現的視訊採集執行緒對視訊採集進行詳細分析。 【解析】 1 涉及到的檔案和目錄 mjpg-streamer-mi

    基於友善ARM-tiny4412--uboot原始碼分析

    /* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instruments <[email protected]>

    友善最新版mini2440學習筆記——u-boot 1.1.6移植(一)

    從本文開始,將記錄博主在進行u-boot 1.1.6移植過程中遇到的問題。本文將涉及兩個問題: 1. u-boot中新增開發板 2. u-boot第一階段啟動程式碼 1. u-boot中新增開發板 1.1. Makefile更改 1.1.1. 增加反彙編檔案輸出 Makef

    SpringMVC原始碼學習request處理流程 springMVC原始碼學習地址 springMVC原始碼學習addFlashAttribute原始碼分析 java reflect反射呼叫方法invoke

    目的:為看原始碼提供呼叫地圖,最長呼叫邏輯深度為8層,反正我是springMVC原始碼學習地址看了兩週才理出來的。 1.處理流程(版本為4.3.18) 入口為spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.Dispatche

    【 專欄 】- 手把手教你從零實現Linux裝置驅動程式(基於友善4412開發板)

    手把手教你從零實現Linux裝置驅動程式(基於友善之臂4412開發板) ARM-tiny4412這款CPU是基於ARMv7架構的晶片,目前在網上開發現成資源較少,為了彌補這一缺陷,本人決定將我所學所用的這塊晶片的開發技巧和方法共享

    從零開始寫linux字元裝置驅動程式(一)(基於友善tiny4412開發板)

    從這篇博文開始,我將開始手把手教會大家寫linux裝置驅動程式這是開篇,如何來寫第一個字元裝置驅動程式。首先,寫一個最簡單的字元裝置驅動程式需要什麼?或者說我們需要了解什麼?1、每一個字元裝置至少需要有一個裝置號2、裝置號 = 主裝置號 + 次裝置號3、同一類裝置的主裝置號一

    手把手教你寫Linux裝置驅動---定時器(一)(基於友善4412開發板)

    這個專題我們來說下Linux中的定時器。在Linux核心中,有這樣的一個定時器,叫做核心定時器,核心定時器用於控制某個函式,也就是定時器將要處理的函式在未來的某個特定的時間內執行。核心定時器註冊的處理函

    Java多執行緒JUC包:Condition原始碼學習筆記

    若有不正之處請多多諒解,並歡迎批評指正。 請尊重作者勞動成果,轉載請標明原文連結: Condition在JUC框架下提供了傳統Java監視器風格的wait、notify和notifyAll相似的功能。 Condition必須被繫結到一個獨佔鎖上使用。ReentrantLock中獲取Conditi

    Java多執行緒JUC包:Semaphore原始碼學習筆記

    若有不正之處請多多諒解,並歡迎批評指正。 請尊重作者勞動成果,轉載請標明原文連結: Semaphore是JUC包提供的一個共享鎖,一般稱之為訊號量。 Semaphore通過自定義的同步器維護了一個或多個共享資源,執行緒通過呼叫acquire獲取共享資源,通過呼叫release釋放。 原始碼:

    Java多執行緒JUC包:CyclicBarrier原始碼學習筆記

    若有不正之處請多多諒解,並歡迎批評指正。 請尊重作者勞動成果,轉載請標明原文連結: CyclicBarrier是java.util.concurrent包中提供的同步工具。通過這個工具我們可以實現n個執行緒相互等待。我們可以通過引數指定達到公共屏障點之後的行為。 先上原始碼:

    畢業設計wifi視訊監控小車(一)

         首先作為一名即將畢業和還在苦苦做畢業的技術菜鳥,像大佬們致敬,說心裡話,技術這一行真的還是很難,但是既然選擇了就不會退縮,自己慢慢學習慢慢成長。    為了提高自己,我畢業設計選擇的是做一個搭載攝像頭的小車,這設計相信很多前輩們已經做過了,網上資料也多,我也很感謝大

    RHEL6下友善交叉編譯工具的安裝

    [[email protected] /]# export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin/ [[email protected] /]# arm-linux-gcc -v Using built-in specs. COL

    友善NanoPC-T3 Plus,s5p6818編譯Linux核心流程

    按照維基教程編譯核心4.4.y:      //我的編譯器是這個,先設定一下1、CROSS_COMPILE=aarch64-linux-gnu-      //配置檔案在 arch/arm64/configs/2、make ARCH=arm64 nanopi3_linux_d

    mini2440編譯x86-qtopia(x86-qtopia)(友善

    cd libraries/qtopia && make -f Makefile make[4]: 正在進入目錄 `/opt/FriendlyARM/mini6410/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/src/libraries/qtopia'

    友善S3C2451開發板如何用MiniTools下載裸機程式

    一開始開發板接在電腦上minitools是檢測不到的,因為電腦裡沒有對應的驅動。解決方法就是下載驅動精靈,安裝好。 開發板開機按k1鍵進入類似bios的介面,然後開啟驅動精靈開始檢測驅動,安裝一個An

    友善-用minitools工具燒寫系統或裸機程式方法(mini2440)

    (1)、先使用Jlink軟體燒寫Superboot2440.bin檔案到NOR FLASH中,此時S2開關撥在NOR位置。              a、 載入工程:File -> Open project -> 選擇s3c2440a_embedclub.j

    手把手教你從頭開始搭建友善ARM-tiny4412開發環境(史上最詳細!!)

    建立一個ARM目錄 mkdir   /disk/A9  -p 接下來你需要準備以下的東西 1、arm-linux-gcc-4.5.1     交叉編譯器 2、linux-3.5-tiny4412   

    入手友善Cortex-A9 Tiny4412 開發板

    轉眼就到了2016年,時間過得真快,一直以來,部落格更新的比較慢,也比較少,尤其是原創的更少。 從今天開始,準備每週更新4篇文章,讓自己動起來。 淘寶逛了一圈,發現這個還可以。 一個瑕疵就是 音訊驅

    友善tiny4412使用SD卡燒錄uboot,並使開發板從SD卡啟動進入uboot過程記錄。

    一、前提準備: 建議:為保持過程的一致性,建議使用和以下描述中一樣的軟硬體。其它軟硬體不保證過程的可行性。以下描述的過程,博主已多次驗證,可行。 1.安裝了ubuntu系統的電腦一臺,我使用的是14.04 LTS版。 2.友善之臂的tiny4412 ADK 1312開發板。

    struts1原始碼學習6(doPost和doGet)

    ActionServlet中的doPost和doGet的程式碼是一樣的,都是呼叫process 直接看process程式碼 protected void process(HttpServletRequest request, HttpServletResponse re