LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: realtang

大家一起来讨论video for linux的编程。

[复制链接]
 楼主| 发表于 2004-8-6 13:13:48 | 显示全部楼层
framebuffer好像没有队列的概念,我阅读了一下有关framebuffer的api没有创建和管理队列的概念。
提供了缓冲队列的概念,并提供了若干函数操作它。
实现画中画肯定要利用fb直接写屏了。下面提供一个写屏的例子:
fbtools.h

  1. #ifndef _FBTOOLS_H_
  2. #define _FBTOOLS_H_

  3. #include <linux/fb.h>

  4. //a framebuffer device structure;
  5. typedef struct fbdev{
  6.         int fb;
  7.         unsigned long fb_mem_offset;
  8.         unsigned long fb_mem;
  9.         struct fb_fix_screeninfo fb_fix;
  10.         struct fb_var_screeninfo fb_var;
  11.         char dev[20];
  12. } FBDEV, *PFBDEV;

  13. //open & init a frame buffer
  14. //to use this function,
  15. //you must set FBDEV.dev="/dev/fb0"
  16. //or "/dev/fbX"
  17. //it's your frame buffer.
  18. int fb_open(PFBDEV pFbdev);

  19. //close a frame buffer
  20. int fb_close(PFBDEV pFbdev);

  21. //get display depth
  22. int get_display_depth(PFBDEV pFbdev);


  23. //full screen clear
  24. void fb_memset(void *addr, int c, size_t len);

  25. #endif
复制代码


fbtools.c



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/mman.h>
  8. #include <asm/page.h>

  9. #include "fbtools.h"

  10. #define TRUE         1
  11. #define FALSE        0
  12. #define MAX(x,y)        ((x)>(y)?(x)y))
  13. #define MIN(x,y)        ((x)<(y)?(x)y))

  14. //open & init a frame buffer
  15. int fb_open(PFBDEV pFbdev)
  16. {
  17.         pFbdev->fb = open(pFbdev->dev, O_RDWR);
  18.         if(pFbdev->fb < 0)
  19.         {
  20.                 printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
  21.                 return FALSE;
  22.         }
  23.         if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
  24.         {
  25.                 printf("ioctl FBIOGET_VSCREENINFO\n");
  26.                 return FALSE;
  27.         }
  28.         if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
  29.         {
  30.                 printf("ioctl FBIOGET_FSCREENINFO\n");
  31.                 return FALSE;
  32.         }
  33.        
  34.         //map physics address to virtual address
  35.         pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
  36.         pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len + pFbdev->fb_mem_offset,
  37.                 PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
  38.         if (-1L == (long) pFbdev->fb_mem)
  39.         {
  40.                 printf("mmap error! mem:%d offset:%d\n", pFbdev->fb_mem, pFbdev->fb_mem_offset);
  41.                 return FALSE;
  42.         }
  43.        
  44.         return TRUE;
  45. }

  46. //close frame buffer
  47. int fb_close(PFBDEV pFbdev)
  48. {
  49.         close(pFbdev->fb);
  50.         pFbdev->fb=-1;
  51. }

  52. //get display depth
  53. int get_display_depth(PFBDEV pFbdev);
  54. {
  55.         if(pFbdev->fb<=0)
  56.         {
  57.                 printf("fb device not open, open it first\n");
  58.                 return FALSE;
  59.         }
  60.         return pFbdev->fb_var.bits_per_pixel;
  61. }

  62. //full screen clear
  63. void fb_memset (void *addr, int c, size_t len)
  64. {
  65.     memset(addr, c, len);
  66. }

  67. //use by test
  68. #define DEBUG
  69. #ifdef DEBUG
  70. main()
  71. {
  72.         FBDEV fbdev;
  73.         memset(&fbdev, 0, sizeof(FBDEV));
  74.         strcpy(fbdev.dev, "/dev/fb0");
  75.         if(fb_open(&fbdev)==FALSE)
  76.         {
  77.                 printf("open frame buffer error\n");
  78.                 return;
  79.         }
  80.        
  81.         fb_memset(fbdev.fb_mem + fbdev.fb_mem_offset, 0, fbdev.fb_fix.smem_len);
  82.        
  83.         fb_close(&fbdev);
  84. }

复制代码
发表于 2004-8-6 20:53:41 | 显示全部楼层
我今天调试楼主的第一页中关于stermeio时给出如下错误:
VIDIO_QUERYCAP:bad file descriptor
我在代码中还加入了下一行:
......
#include <include/videodev2.h>
........
videodev2.h是我从/usr/src/linux-2.6.6/include/linux/videodev2.h拷贝的!
发表于 2004-8-10 17:26:54 | 显示全部楼层
楼主曾提到, SDL----下载安装后,其源码下的include 默认的被安装到/usr/include下面,该include为应用程序提供了必要的函数后数据结构的头文件"xxx.h", 但是源码中的除了include目录以外还有其他目录的大量的.c和.h文件, 他们好像并未安装到/usr/include/SDL下,那么他们又有什么作用呢?谢谢!
发表于 2004-8-12 15:51:25 | 显示全部楼层
寻人启示
relating到那里去了?
发表于 2006-11-17 10:46:10 | 显示全部楼层
我是一个初学者,问一个小问题,请问有没有video for linux方面的书?
回复 支持 反对

使用道具 举报

发表于 2006-11-17 18:40:45 | 显示全部楼层
什么时候能有linux下的小日本那样的视频转换程序?
回复 支持 反对

使用道具 举报

发表于 2006-11-17 18:40:56 | 显示全部楼层
什么时候能有linux下的小日本那样的视频转换程序?
回复 支持 反对

使用道具 举报

发表于 2006-11-17 21:09:04 | 显示全部楼层
Post by superman
什么时候能有linux下的小日本那样的视频转换程序?

跑题了。

不过可以给点提示: mplayer 里的 mencoder
回复 支持 反对

使用道具 举报

发表于 2008-7-18 14:54:29 | 显示全部楼层

求助:v4l2问题

dmesg 后出现:
Linux video capture interface: v2.00         
表示我的应用层编程接口不能用V4L,只能用V4L2,对吧?

用ARM-LINUX-GCC  把VIDEO CAPTURE EXAMPLE 例子编译一把,通过,在目标板上运行后,出现 VIDIOC_STREAMON error 16, Device or resource busy,不知道是什么原因?  (我的摄相头芯片是ZC0301P,内核是linux-2.6.20)
回复 支持 反对

使用道具 举报

发表于 2008-7-18 15:08:22 | 显示全部楼层
补充一点,  插上 ZC0301P的摄相头 ,DEBUG口 出现如下信息:
usb 1-1: new full speed USB device using at91_ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: ZC0301[P] Image Processor and Control Chip detected (vid/pid 0x0AC8/0x3
01B)
usb 1-1: PB-0330 image sensor detected
usb 1-1: Initialization succeeded
usb 1-1: V4L2 device registered as /dev/video1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表