• 大小: 5KB
    文件类型: .gz
    金币: 2
    下载: 1 次
    发布日期: 2021-06-06
  • 语言: 其他
  • 标签: RK3399  MPP  

资源简介

本例程通过调用RK3399的MPP库,实现从USB摄像头采集视频数据,并编码输出为h264帧的视频文件。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include “camerareader.h“

#define CAMERA_WIDTH 1280
#define CAMERA_HEIGHT 720
#define FORCE_FORMAT 1
#define DEVICE_FILE “/dev/video1“
#define MPP_ALIGN(x a)         (((x)+(a)-1)&~((a)-1))

struct MPP_ENC_DATA
{
// global flow control flag
uint32_t frm_eos;
uint32_t pkt_eos;
uint32_t frame_count;
uint64_t stream_size;

// base flow context
MppCtx ctx;
MppApi *mpi;
MppEncPrepCfg prep_cfg;
MppEncRcCfg rc_cfg;
MppEncCodecCfg codec_cfg;

// input / output
MppBuffer frm_buf;
MppEncSeiMode sei_mode;

uint32_t width;
uint32_t height;
uint32_t hor_stride;
uint32_t ver_stride;
MppframeFormat fmt;
MppCodingType type;
uint32_t num_frames;

// resources
size_t frame_size;

int32_t gop;
int32_t fps;
int32_t bps;

FILE *fp_output;
};

enum IO_METHOD
{
    IO_METHOD_READ
    IO_METHOD_MMAP
    //IO_METHOD_USERPTR
};

struct buffer
{
    void   *start;
    size_t  length;
};

static struct buffer *buffers;
static unsigned int n_buffers;
static IO_METHOD io_method;

static MPP_ENC_DATA mpp_enc_data;

CameraReader::CameraReader()
{

}

static void cleanup(void *p)
{
    free(p);
}

static int xioctl(int fh int request void *arg)
{
    int r;
    do
    {
        r = ioctl(fh request arg);
    } while (-1 == r && EINTR == errno);

    return r;
}

static uint8_t check_pix(int a)
{
    if(a < 0)
        a = 0;
    else if(a > 255)
        a = 255;

    return a;
}


bool CameraReader::process_image(uint8_t *p int size)
{
MPP_RET ret = MPP_OK;
    if(size != CAMERA_WIDTH * CAMERA_HEIGHT * 2)
    {
        fprintf(stderr “Invalid image data buffer!\n“);
        return true;
    }

    Mppframe frame = NULL;
    MppPacket packet = NULL;
    void *buf = mpp_buffer_get_ptr(mpp_enc_data.frm_buf);

    //TODO: improve performance here?
    memcpy(buf p size);

    ret = mpp_frame_init(&frame);
    if (ret)
    {
     printf(“mpp_frame_init failed\n“);
     return true;
    }

    mpp_frame_set_width(frame mpp_enc_data.width);
    mpp_frame_set_height(frame mpp_enc_data.height);
    mpp_frame_set_hor_stride(frame mpp_enc_data.hor_stride);
    mpp_frame_set_ver_stride(frame mpp_enc_data.ver_stride);
    mpp_frame_set_fmt(frame mpp_enc_data.fmt);
    mpp_frame_set_buffer(frame mpp_enc_data.frm_buf);
    mpp_frame_set_eos(frame mpp_enc_data.frm_eos);

    ret = mpp_enc_data.mpi->encode_put_frame(mpp_enc_data.ctx frame);
    if (ret)
    {
     printf(“mpp encode put frame failed\n“);
     return true;
    }

    ret = mpp_enc_data.mpi->encode_get_packet(mpp_enc_data.ctx &packet);
    if (ret)
    {
     printf(“mpp encode get packet failed\n“);
     return true;
    }

    if (packet)
    {
     // write packet to file here
     voi

评论

共有 条评论