資源簡介
本例程通過調用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
評論
共有 條評論