友善之臂視訊監控方案原始碼學習(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):
- /* open video device and prepare data structure */
- if (init_videoIn(videoIn, dev, width, height, fps, format, 1) <0) {
-
IPRINT("init_VideoIn failed\n");
- closelog();
- exit(EXIT_FAILURE);
- }
init_videoIn函式中呼叫的視訊初始化程式碼如下(mjpg-streamer-mini2440-read-only/plugins/input_uvc/V412uvc.c):
- if (init_v4l2 (vd) <0) {
- fprintf (stderr, " Init v4L2 failed !! exit fatal \n");
- goto error;;
- }
init_v412程式碼如下(mjpg-streamer-mini2440-read-only/plugins/input_uvc/V412uvc.c
- static int init_v4l2(struct vdIn *vd)
- {
- int i;
- int ret = 0;
- if ((vd->fd = open(vd->videodevice, O_RDWR)) == -1) {
- perror("ERROR opening V4L interface");
- return -1;
- }
- memset(&vd->cap, 0, sizeof(struct v4l2_capability));
- ret = ioctl(vd->fd, VIDIOC_QUERYCAP, &vd->cap);
- if (ret <0) {
- fprintf(stderr, "Error opening device %s: unable to query device.\n", vd->videodevice);
- goto fatal;
- }
- if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
- fprintf(stderr, "Error opening device %s: video capture not supported.\n",
- vd->videodevice);
- goto fatal;;
- }
- if (vd->grabmethod) {
- if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) {
- fprintf(stderr, "%s does not support streaming i/o\n", vd->videodevice);
- goto fatal;
- }
- } else {
- if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) {
- fprintf(stderr, "%s does not support read i/o\n", vd->videodevice);
- goto fatal;
- }
- }
- /*
- * set format in
- */
- memset(&vd->fmt, 0, sizeof(struct v4l2_format));
- vd->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->fmt.fmt.pix.width = vd->width;
- vd->fmt.fmt.pix.height = vd->height;
- vd->fmt.fmt.pix.pixelformat = vd->formatIn;
- vd->fmt.fmt.pix.field = V4L2_FIELD_ANY;
- ret = ioctl(vd->fd, VIDIOC_S_FMT, &vd->fmt);
- if (ret <0) {
- perror("Unable to set format");
- goto fatal;
- }
- if ((vd->fmt.fmt.pix.width != vd->width) ||
- (vd->fmt.fmt.pix.height != vd->height)) {
- fprintf(stderr, " format asked unavailable get width %d height %d \n", vd->fmt.fmt.pix.width, vd->fmt.fmt.pix.height);
- vd->width = vd->fmt.fmt.pix.width;
- vd->height = vd->fmt.fmt.pix.height;
- /*
- * look the format is not part of the deal ???
- */
- }
- if(vd->fmt.fmt.pix.pixelformat!=vd->formatIn)
- {
- char fourcc1[5]={0,0,0,0,0};
- char fourcc2[5]={0,0,0,0,0};
- memmove(fourcc1,(char*)&vd->formatIn,4);
- memmove(fourcc2,(char*)&vd->fmt.fmt.pix.pixelformat,4);
- fprintf(stderr, " requested %s but got %s format instead\n",fourcc1,fourcc2);
- vd->formatIn = vd->fmt.fmt.pix.pixelformat;
- }
- /*
- * set framerate
- */
- struct v4l2_streamparm *setfps;
- setfps = (struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm));
- memset(setfps, 0, sizeof(struct v4l2_streamparm));
- setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- setfps->parm.capture.timeperframe.numerator = 1;
- setfps->parm.capture.timeperframe.denominator = vd->fps;
- ret = ioctl(vd->fd, VIDIOC_S_PARM, setfps);
- /*
- * request buffers
- */
- memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers));
- vd->rb.count = NB_BUFFER;
- vd->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->rb.memory = V4L2_MEMORY_MMAP;
- ret = ioctl(vd->fd, VIDIOC_REQBUFS, &vd->rb);
- if (ret <0) {
- perror("Unable to allocate buffers");
- goto fatal;
- }
- /*
- * map the buffers
- */
- for (i = 0; i <NB_BUFFER; i++) {
- memset(&vd->buf, 0, sizeof(struct v4l2_buffer));
-
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