camera_source

本文档展示了如何使用V4L2(Video for Linux Two)接口创建一个名为`camera_source`的上下文,以从指定设备捕获视频帧。代码包括初始化、释放上下文、获取和归还帧的函数。它使用内存映射来缓冲帧,并通过ioctl调用来与内核交互。此外,还包含了处理不同像素格式和调整帧尺寸的逻辑。
摘要由CSDN通过智能技术生成

camera_source.h

#ifndef __CAMERA_SOURCE_H__
#define __CAMERA_SOURCE_H__

#include "mpp_frame.h"

typedef struct CamSource CamSource;

#ifdef __cplusplus
extern "C" {
#endif

// Create a new context to capture frames from <fname>. Returns NULL on error.
CamSource* camera_source_init(const char *device, RK_U32 bufcnt, RK_U32 width, RK_U32 height, MppFrameFormat fmt);

// Stop capturing and free a context.
MPP_RET camera_source_deinit(CamSource *ctx);

// Returns the next captured frame and its meta-data.
RK_S32 camera_source_get_frame(CamSource *ctx);

// Tells the kernel it's OK to overwrite a frame captured
MPP_RET camera_source_put_frame(CamSource *ctx, RK_S32 idx);

MppBuffer camera_frame_to_buf(CamSource *ctx, RK_S32 idx);

#ifdef __cplusplus
}
#endif

#endif /* __CAMERA_SOURCE_H__ */
 

camera_source.c

#define MODULE_TAG "camera_source"

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <sys/select.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>

#include "mpp_log.h"
#include "mpp_mem.h"
#include "camera_source.h"

typedef struct CamFrame_t {
    void        *start;
    size_t      length;
    RK_S32      export_fd;
    RK_S32      sequence;
    MppBuffer   buffer;
} CamFrame;

struct CamSource {
    RK_S32              fd;     // Device handle
    RK_U32              bufcnt; // # of buffers
    enum v4l2_buf_type  type;
    MppFrameFormat      fmt;
    CamFrame            fbuf[10];// frame buffers
};

static RK_U32 V4L2_yuv_cfg[MPP_FMT_YUV_BUTT] = {
    V4L2_PIX_FMT_NV12,
    0,
    V4L2_PIX_FMT_NV16,
    0,
    V4L2_PIX_FMT_YVU420,
    V4L2_PIX_FMT_NV21,
    V4L2_PIX_FMT_YUV422P,
    V4L2_PIX_FMT_NV61,
    V4L2_PIX_FMT_YUYV,
    V4L2_PIX_FMT_YVYU,
    V4L2_PIX_FMT_UYVY,
    V4L2_PIX_FMT_VYUY,
    V4L2_PIX_FMT_GREY,
    0,
    0,
    0,
};

static RK_U32 V4L2_RGB_cfg[MPP_FMT_RGB_BUTT - MPP_FRAME_FMT_RGB] = {
    V4L2_PIX_FMT_RGB565,
    0,
    V4L2_PIX_FMT_RGB555,
    0,
    V4L2_PIX_FMT_RGB444,
    0,
    V4L2_PIX_FMT_RGB24,
    V4L2_PIX_FMT_BGR24,
    0,
    0,
    V4L2_PIX_FMT_RGB32,
    V4L2_PIX_FMT_BGR32,
    0,
    0,
};

#define FMT_NUM_PLANES 1

// Wrap ioctl() to spin on EINTR
static RK_S32 camera_source_ioctl(RK_S32 fd, RK_S32 req, void* arg)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值