当前位置: 首页 > news >正文

上海建设安全协会网站长沙网站推广服务公司

上海建设安全协会网站,长沙网站推广服务公司,向公司申请请做网站,快应用 小程序概述瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不同芯片的差异,为使用者提供统…
  1. 概述

瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的

通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不

同芯片的差异,为使用者提供统一的视频媒体处理接口(Media Process Interface,缩写 MPI)。MPP

提供的功能包括:

视频解码:

H.265 / H.264 / H.263 / VP9 / VP8 / MPEG-4 / MPEG-2 / MPEG-1 / VC1 / MJPEG

视频编码:

H.264 / VP8 / MJPEG

视频处理:

视频拷贝,缩放,色彩空间转换,场视频解交织(Deinterlace)

  1. MPP源码下载

git clone https://github.com/rockchip-linux/mpp.git

  1. 编码demo测试

mpi_enc_test -w 720 -h 480 -t 7 -i /sdcard/soccer_720x480_30fps.yuv -o /sdcard/out.h264 -n 1000

mpi_enc_test 的命令参数中,图像宽度(w)图像高度(h),码流类型(t)为强制要求参数,其他参

数如输入文件(i),输出文件(o),编码帧数(n)等为可选参数。

执行完测试程序在/sdcard目录下会生成out.h264文件。

将out.h264在VLC media player播放器播放:

  1. MPI接口使用流程

创建 MPP context 和 MPP api 接口

ret = mpp_create(&p->ctx, &p->mpi);

初始化 MPP

ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); // 初始化MPP

设置一些MPP的模式

ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode);

编码就是喂MppFrame,输出MppPacket;

输入frame

ret = mpi->encode_put_frame(ctx, frame); 

输出packet

ret = mpi->encode_get_packet(ctx, &packet); 

  1. RK官方编码demo mpi_enc_test.c简化

#if defined(_WIN32)
#include "vld.h"
#endif#define MODULE_TAG "mpi_enc_test"#include <string.h>
#include "rk_mpi.h"
#include "mpp_mem.h"
#include "mpp_common.h"
#include "utils.h"
#include "mpi_enc_utils.h"#include <stdio.h>typedef struct {// base flow contextMppCtx ctx;MppApi *mpi;// global flow control flagRK_U32 frm_eos;RK_U32 pkt_eos;RK_S32 frame_count;// src and dstFILE *fp_output;/* encoder config set */MppEncCfg       cfg;// input / outputMppBufferGroup buf_grp;MppBuffer frm_buf;MppBuffer pkt_buf;MppBuffer md_info;MppEncSeiMode sei_mode;MppEncHeaderMode header_mode;// paramter for resource mallocRK_U32 width;RK_U32 height;RK_U32 hor_stride;RK_U32 ver_stride;MppFrameFormat fmt;MppCodingType type;// resourcessize_t header_size;size_t frame_size;size_t mdinfo_size;} MpiEncTestData;/* For each instance thread return value */
typedef struct {RK_S32          frame_count;
} MpiEncMultiCtxRet;typedef struct {MpiEncTestArgs      *cmd;       // pointer to global command line infoconst char          *name;pthread_t           thd;        // thread for for each instanceMpiEncTestData      ctx;        // context of encoderMpiEncMultiCtxRet   ret;        // return of encoder
} MpiEncMultiCtxInfo;MPP_RET test_ctx_init(MpiEncMultiCtxInfo *info)
{MpiEncTestArgs *cmd = info->cmd;MpiEncTestData *p = &info->ctx;MPP_RET ret = MPP_OK;// 设置编码宽高、对齐后宽高参数p->width        = cmd->width;p->height       = cmd->height;p->hor_stride   = (cmd->hor_stride) ? (cmd->hor_stride) :(MPP_ALIGN(cmd->width, 16));p->ver_stride   = (cmd->ver_stride) ? (cmd->ver_stride) :(MPP_ALIGN(cmd->height, 16));p->fmt          = cmd->format;p->type         = cmd->type;p->mdinfo_size  = (MPP_VIDEO_CodingHEVC == cmd->type) ?(MPP_ALIGN(p->hor_stride, 64) >> 6) *(MPP_ALIGN(p->ver_stride, 64) >> 6) * 32 :(MPP_ALIGN(p->hor_stride, 64) >> 6) *(MPP_ALIGN(p->ver_stride, 16) >> 4) * 8;p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 4;return ret;
}MPP_RET test_ctx_deinit(MpiEncTestData *p)
{if (p) {if (p->fp_output) {fclose(p->fp_output);p->fp_output = NULL;}}return MPP_OK;
}MPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info)
{MpiEncTestData *p = &info->ctx;MppApi *mpi = p->mpi;MppCtx ctx = p->ctx;MppEncCfg cfg = p->cfg;MPP_RET ret;mpp_enc_cfg_set_s32(cfg, "prep:width", p->width);mpp_enc_cfg_set_s32(cfg, "prep:height", p->height);mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride);mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride);mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt);ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); //创建 MPPp->sei_mode = MPP_ENC_SEI_MODE_ONE_FRAME;ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode);  //设置一些MPP的模式if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) {p->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;ret = mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &p->header_mode);}return ret;
}MPP_RET test_mpp_run(MpiEncMultiCtxInfo *info)  //图像编码函数
{MpiEncTestData *p = &info->ctx;MppApi *mpi = p->mpi;MppCtx ctx = p->ctx;MPP_RET ret = MPP_OK;MppMeta meta = NULL;MppFrame frame = NULL;MppPacket packet = NULL; // 存放编码数据void *buf = mpp_buffer_get_ptr(p->frm_buf);ret = fill_image(buf, p->width, p->height, p->hor_stride,p->ver_stride, p->fmt, p->frame_count);ret = mpp_frame_init(&frame);mpp_frame_set_width(frame, p->width);mpp_frame_set_height(frame, p->height);mpp_frame_set_hor_stride(frame, p->hor_stride);mpp_frame_set_ver_stride(frame, p->ver_stride);mpp_frame_set_fmt(frame, p->fmt);mpp_frame_set_eos(frame, p->frm_eos);mpp_frame_set_buffer(frame, p->frm_buf);meta = mpp_frame_get_meta(frame);mpp_packet_init_with_buffer(&packet, p->pkt_buf);mpp_packet_set_length(packet, 0);mpp_meta_set_packet(meta, KEY_OUTPUT_PACKET, packet);mpp_meta_set_buffer(meta, KEY_MOTION_INFO, p->md_info);ret = mpi->encode_put_frame(ctx, frame); //输入frameif (ret) {mpp_frame_deinit(&frame);}mpp_frame_deinit(&frame);ret = mpi->encode_get_packet(ctx, &packet); //输出packetmpp_assert(packet);void *ptr   = mpp_packet_get_pos(packet);size_t len  = mpp_packet_get_length(packet);p->pkt_eos = mpp_packet_get_eos(packet);fwrite(ptr, 1, len, p->fp_output);mpp_packet_deinit(&packet);  return ret;
}void *enc_test(void *arg)  //编码器初始化函数
{MpiEncMultiCtxInfo *info = (MpiEncMultiCtxInfo *)arg;MpiEncTestData *p = &info->ctx;MppPollType timeout = MPP_POLL_BLOCK;MPP_RET ret = MPP_OK;ret = test_ctx_init(info);ret = mpp_buffer_group_get_internal(&p->buf_grp, MPP_BUFFER_TYPE_DRM);ret = mpp_buffer_get(p->buf_grp, &p->frm_buf, p->frame_size + p->header_size);ret = mpp_buffer_get(p->buf_grp, &p->pkt_buf, p->frame_size);ret = mpp_buffer_get(p->buf_grp, &p->md_info, p->mdinfo_size);ret = mpp_create(&p->ctx, &p->mpi);  //创建 MPP context 和 MPP api 接口ret = p->mpi->control(p->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); // 初始化MPPret = mpp_enc_cfg_init(&p->cfg);ret = test_mpp_enc_cfg_setup(info);ret = test_mpp_run(info);ret = p->mpi->reset(p->ctx);test_ctx_deinit(p);return NULL;
}int enc_test_multi(MpiEncTestArgs* cmd, const char *name)
{MpiEncMultiCtxInfo *ctxs = NULL;RK_S32 ret = MPP_NOK;RK_S32 i = 0;ctxs = mpp_calloc(MpiEncMultiCtxInfo, cmd->nthreads);ctxs[i].cmd = cmd;ctxs[i].name = name;ret = pthread_create(&ctxs[i].thd, NULL, enc_test, &ctxs[i]);pthread_join(ctxs[i].thd, NULL);MPP_FREE(ctxs);return ret;
}int main(int argc,char **argv)
{argc = 13;char* argvv[] = {"mpi_enc_test","-w","720","-h","480","-t","7","-i","/sdcard/soccer_720x480_30fps.yuv","-o","/sdcard/out.h264","-n","10"};RK_S32 ret = MPP_NOK;MpiEncTestArgs* cmd = mpi_enc_test_cmd_get();// parse the cmd optionret = mpi_enc_test_cmd_update_by_args(cmd, argc, argvv);mpi_enc_test_cmd_show_opt(cmd);ret = enc_test_multi(cmd, argvv[0]);return ret;
}
http://www.15wanjia.com/news/6614.html

相关文章:

  • 建设网站找哪里sem竞价推广托管
  • 网站底部技术支持搜索引擎排名营销
  • 现在建网站挣钱吗新闻早知道
  • 四川城乡和住房建设厅网站首页品牌网络seo方案外包
  • 学做奶油的网站百度seo优化排名软件
  • 宜宾网站建设多少钱by网站域名
  • 猪八戒做网站怎么赚钱新冠咳嗽一般要咳多少天
  • 怎么把网站放到阿里云培训课程表
  • 沈阳建站怎么免费搭建自己的网站
  • 跳网站查询的二维码怎么做江苏短视频seo搜索
  • jsp做的婚恋网站网络营销策划与推广
  • 自己做电影网站淘宝流量网站
  • 抖音代运营mcn网站seo快速排名优化的软件
  • 郎溪县建设局网站广州企业网站seo
  • 做本地网站需要什么资质湖南长沙疫情最新消息
  • 做电商网站价格营销培训课程内容
  • 移动公司营销网站设计网站权重是怎么提升的
  • 合肥做网站123cms苏州百度搜索排名优化
  • microsoft做网站的seo优缺点
  • 成都十大设计工作室广州网站建设方案优化
  • java做电影广告网站成都网站快速开发
  • 网站公司好做吗下载百度网盘app最新版
  • 安全员B本延期在那个网站做申请新产品上市推广策划方案
  • 湛江专业网站建设公司传统营销
  • 网站做不做备案有什么区别百度一下网页版搜索引擎
  • 求个网站你知道的长沙的seo网络公司
  • 做网站经常用的字体有哪些北京优化网站方法
  • asp婚纱摄影网站源码友链网
  • 做类似360手赚那样的网站广州网站优化排名系统
  • 成都工程网站建设南京网络推广平台