V4L2驅動程序架構-2

3.4 遍歷全部視頻格式,查詢驅動所支持的格式

[csharp] view plaincopyide

  1. 結構  ui

  2. struct v4l2_fmtdes fmtdes;  url

  3. ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmtdes);  spa

  4. struct v4l2_fmtdesc {  .net

  5.     __u32           index;             /* Format number      */  orm

  6.     enum v4l2_buf_type  type;              /* buffer type        */  視頻

  7.     __u32               flags;  blog

  8.     __u8            description[32];   /* Description string */  ip

  9.     __u32           pixelformat;       /* Format fourcc      */  get

  10.     __u32           reserved[4];  

  11. };  

  12. 驅動  

  13. static int s3c_fimc_v4l2_enum_fmt_vid_cap(struct file *filp, void *fh,  

  14.                     struct v4l2_fmtdesc *f)  

  15. {  

  16.     struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh;  

  17.     int index = f->index;  

  18.   

  19.     if (index >= S3C_FIMC_MAX_CAPTURE_FORMATS)  

  20.         return -EINVAL;  

  21.   

  22.     memset(f, 0, sizeof(*f));  

  23.     memcpy(f, ctrl->v4l2.fmtdesc + index, sizeof(*f));  

  24.   

  25.     return 0;  

  26. }  

  27. #define S3C_FIMC_MAX_CAPTURE_FORMATS    ARRAY_SIZE(s3c_fimc_capture_formats)  

  28. const static struct v4l2_fmtdesc s3c_fimc_capture_formats[] = {  

  29.     {  

  30.         .index      = 0,  

  31.         .type       = V4L2_BUF_TYPE_VIDEO_CAPTURE,  

  32.         .flags      = FORMAT_FLAGS_PLANAR,  

  33.         .description    = "4:2:0, planar, Y-Cb-Cr",  

  34.         .pixelformat    = V4L2_PIX_FMT_YUV420,  

  35.     },  

  36.     {  

  37.         .index      = 1,  

  38.         .type       = V4L2_BUF_TYPE_VIDEO_CAPTURE,  

  39.         .flags      = FORMAT_FLAGS_PLANAR,  

  40.         .description    = "4:2:2, planar, Y-Cb-Cr",  

  41.         .pixelformat    = V4L2_PIX_FMT_YUV422P,  

  42.   

  43.     },    

  44.     {  

  45.         .index      = 2,  

  46.         .type       = V4L2_BUF_TYPE_VIDEO_CAPTURE,  

  47.         .flags      = FORMAT_FLAGS_PACKED,  

  48.         .description    = "4:2:2, packed, YCBYCR",  

  49.         .pixelformat    = V4L2_PIX_FMT_YUYV,  

  50.     },  

  51.     {  

  52.         .index      = 3,  

  53.         .type       = V4L2_BUF_TYPE_VIDEO_CAPTURE,  

  54.         .flags      = FORMAT_FLAGS_PACKED,  

  55.         .description    = "4:2:2, packed, CBYCRY",  

  56.         .pixelformat    = V4L2_PIX_FMT_UYVY,  

  57.     }  

  58. };  

  59. const static struct v4l2_fmtdesc s3c_fimc_overlay_formats[] = {  

  60.     {  

  61.         .index      = 0,  

  62.         .type       = V4L2_BUF_TYPE_VIDEO_OVERLAY,  

  63.         .flags      = FORMAT_FLAGS_PACKED,  

  64.         .description    = "16 bpp RGB, le",  

  65.         .pixelformat    = V4L2_PIX_FMT_RGB565,        

  66.     },  

  67.     {  

  68.         .index      = 1,  

  69.         .type       = V4L2_BUF_TYPE_VIDEO_OVERLAY,  

  70.         .flags      = FORMAT_FLAGS_PACKED,  

  71.         .description    = "24 bpp RGB, le",  

  72.         .pixelformat    = V4L2_PIX_FMT_RGB24,         

  73.     },  

  74. };  

  75. 應用層  

  76. static int video_fmtdesc(int fd)  

  77. {  

  78.     /***********Format Enumeration************/  

  79.     int ret = 0;  

  80.     struct v4l2_fmtdesc fmtdes;  

  81.     CLEAR(fmtdes);  

  82.     fmtdes.index = 0;  

  83.     fmtdes.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  

  84.     printf("\n**********vidioc enumeration stream format informations:****\n");  

  85.     while (1) {  

  86.           

  87.         ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmtdes);  

  88.         if (ret < 0)   

  89.             break;  

  90.           

  91.          printf("{ pixelformat = %c%c%c%c, description = %s }\n",  

  92.                 (fmtdes.pixelformat & 0xFF),  

  93.                 (fmtdes.pixelformat >> 8) & 0xFF,  

  94.                 (fmtdes.pixelformat >> 16) & 0xFF,   

  95.                 (fmtdes.pixelformat >> 24) & 0xFF,  

  96.                 fmtdes.description);  

  97.           

  98.         if (fmtdes.type == V4L2_BUF_TYPE_VIDEO_CAPTURE)  

  99.             printf("video capture type:\n");  

  100.         if (fmtdes.pixelformat == V4L2_PIX_FMT_YUYV)  

  101.             printf("V4L2_PIX_FMT_YUYV\n");  

  102.         fmtdes.index++;  

  103.     }  

  104.     return 0;  

  105. }  


3.5 設置視頻捕獲格式(重要)


[csharp] view plaincopy

  1. 結構體  

  2. 幀格式包括寬度和高度  

  3. struct v4l2_format fmt;  

  4. ret = ioctl(fd, VIDIOC_S_FMT, &fmt);  

  5. struct v4l2_format {  

  6.     enum v4l2_buf_type type;//數據流類型,必須是V4L2_BUF_TYPE_VIDEO_CAPTURE  

  7.     union {  

  8.         struct v4l2_pix_format      pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */  

  9.         struct v4l2_window      win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */  

  10.         struct v4l2_vbi_format      vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */  

  11.         struct v4l2_sliced_vbi_format   sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */  

  12.         __u8    raw_data[200];                   /* user-defined */  

  13.     } fmt;  

  14. };  

  15. struct v4l2_pix_format  {  

  16.     __u32 pixelformat;//視頻數據存儲類型,例如是YUV4:2:2仍是RGB  

  17. }  

  18. 驅動  

  19. static int s3c_fimc_v4l2_s_fmt_vid_cap(struct file *filp, void *fh,  

  20.                     struct v4l2_format *f)  

  21. {  

  22.   

  23.     struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh;  

  24.     ctrl->v4l2.frmbuf.fmt = f->fmt.pix;  

  25.   

  26.     if (f->fmt.pix.priv == V4L2_FMT_IN)  

  27.         s3c_fimc_set_input_frame(ctrl, &f->fmt.pix);  

  28.     else  

  29.         s3c_fimc_set_output_frame(ctrl, &f->fmt.pix);  

  30.   

  31.     return 0;  

  32. }  

  33. int s3c_fimc_set_input_frame(struct s3c_fimc_control *ctrl,  

  34.                 struct v4l2_pix_format *fmt)  

  35. {  

  36.     s3c_fimc_set_input_format(ctrl, fmt);  

  37.   

  38.     return 0;  

  39. }  

  40.   

  41. static void s3c_fimc_set_input_format(struct s3c_fimc_control *ctrl,  

  42.                     struct v4l2_pix_format *fmt)  

  43. {  

  44.     struct s3c_fimc_in_frame *frame = &ctrl->in_frame;  

  45.   

  46.     frame->width = fmt->width;  

  47.     frame->height = fmt->height;  

  48.   

  49.     switch (fmt->pixelformat) {  

  50.     case V4L2_PIX_FMT_RGB565:  

  51.         frame->format = FORMAT_RGB565;  

  52.         frame->planes = 1;  

  53.         break;  

  54.   

  55.     case V4L2_PIX_FMT_RGB24:  

  56.         frame->format = FORMAT_RGB888;  

  57.         frame->planes = 1;  

  58.         break;  

  59.   

  60.     case V4L2_PIX_FMT_NV12:  

  61.         frame->format = FORMAT_YCBCR420;  

  62.         frame->planes = 2;  

  63.         frame->order_2p = LSB_CBCR;  

  64.         break;  

  65.   

  66.     case V4L2_PIX_FMT_NV21:  

  67.         frame->format = FORMAT_YCBCR420;  

  68.         frame->planes = 2;  

  69.         frame->order_2p = LSB_CRCB;  

  70.         break;  

  71.   

  72.     case V4L2_PIX_FMT_NV12X:  

  73.         frame->format = FORMAT_YCBCR420;  

  74.         frame->planes = 2;  

  75.         frame->order_2p = MSB_CBCR;  

  76.         break;  

  77.   

  78.     case V4L2_PIX_FMT_NV21X:  

  79.         frame->format = FORMAT_YCBCR420;  

  80.         frame->planes = 2;  

  81.         frame->order_2p = MSB_CRCB;  

  82.         break;  

  83.   

  84.     case V4L2_PIX_FMT_YUV420:  

  85.         frame->format = FORMAT_YCBCR420;  

  86.         frame->planes = 3;  

  87.         break;  

  88.   

  89.     case V4L2_PIX_FMT_YUYV:  

  90.         frame->format = FORMAT_YCBCR422;  

  91.         frame->planes = 1;  

  92.         frame->order_1p = IN_ORDER422_YCBYCR;  

  93.         break;  

  94.   

  95.     case V4L2_PIX_FMT_YVYU:  

  96.         frame->format = FORMAT_YCBCR422;  

  97.         frame->planes = 1;  

  98.         frame->order_1p = IN_ORDER422_YCRYCB;  

  99.         break;  

  100.   

  101.     case V4L2_PIX_FMT_UYVY:  

  102.         frame->format = FORMAT_YCBCR422;  

  103.         frame->planes = 1;  

  104.         frame->order_1p = IN_ORDER422_CBYCRY;  

  105.         break;  

  106.   

  107.     case V4L2_PIX_FMT_VYUY:  

  108.         frame->format = FORMAT_YCBCR422;  

  109.         frame->planes = 1;  

  110.         frame->order_1p = IN_ORDER422_CRYCBY;  

  111.         break;  

  112.   

  113.     case V4L2_PIX_FMT_NV16:  

  114.         frame->format = FORMAT_YCBCR422;  

  115.         frame->planes = 2;  

  116.         frame->order_1p = LSB_CBCR;  

  117.         break;  

  118.   

  119.     case V4L2_PIX_FMT_NV61:  

  120.         frame->format = FORMAT_YCBCR422;  

  121.         frame->planes = 2;  

  122.         frame->order_1p = LSB_CRCB;  

  123.         break;  

  124.   

  125.     case V4L2_PIX_FMT_NV16X:  

  126.         frame->format = FORMAT_YCBCR422;  

  127.         frame->planes = 2;  

  128.         frame->order_1p = MSB_CBCR;  

  129.         break;  

  130.   

  131.     case V4L2_PIX_FMT_NV61X:  

  132.         frame->format = FORMAT_YCBCR422;  

  133.         frame->planes = 2;  

  134.         frame->order_1p = MSB_CRCB;  

  135.         break;  

  136.   

  137.     case V4L2_PIX_FMT_YUV422P:  

  138.         frame->format = FORMAT_YCBCR422;  

  139.         frame->planes = 3;  

  140.         break;  

  141.     }  

  142. }  

  143. 應用層  

  144. static int video_setfmt(int fd)  

  145. {  

  146.   /***********set Stream data format********/  

  147.   int ret = 0;  

  148.   struct v4l2_format fmt;  

  149.     CLEAR(fmt);  

  150.     fmt.type            =   V4L2_BUF_TYPE_VIDEO_CAPTURE;  

  151.     fmt.fmt.pix.width   =   640;  

  152.     fmt.fmt.pix.height  =   480;  

  153.     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//for PAL  

  154.     fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;  

  155.       

  156.     ret = ioctl(fd, VIDIOC_S_FMT, &fmt);  

  157.     if (ret < 0) {  

  158.         perror("VIDIOC_S_FMT");  

  159.         return ret;  

  160.     }  

  161.       

  162.     return 0;  

相關文章
相關標籤/搜索