rockchip mpp编码开发

mpp 编码264开发关键流程

1. 初始化:

a)设置分配内存类型:

MppBufferGroup grp = nullptr;

mpp_buffer_group_get_internal(&grp, MPP_BUFFER_TYPE_ION);

b)分配每一帧缓存大小

MppBuffer frameBuf;

size_t frameSize;

MppFrameFormat fmt = MPP_FMT_ABGR8888;

if  (fmt == MPP_FMT_BGRA8888) {

        frameSize = 1920* 1080 * 4;

}

mpp_buffer_get(grp, &frameBuf, frameSize);

c)分配编码后的一帧缓存

MppBuffer pktBuf;

mpp_buffer_get(mppEncData.grp, &pktBuf, frameSize);

d)创建编码器

    MppCtx ctx = nullptr;

    MppApi *mpi = nullptr;

mpp_create(&ctx, &mpi);

e)设置编码超时(堵塞)

MppPollType timeout = MPP_POLL_BLOCK;

 mpi->control(ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);

f)初始化编码器

MppCodingType type = MPP_VIDEO_CodingAVC;

mpp_init(ctx, MPP_CTX_ENC, type);

g)初始化编码参数配置

mpp_enc_cfg_init(&cfg);

mpp_enc_cfg_set_s32(cfg, "prep:width", 1920);

    mpp_enc_cfg_set_s32(cfg, "prep:height", 1080);

    mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", 1920);

    mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", 1080);

    mpp_enc_cfg_set_s32(cfg, "prep:format", fmt);

    mpp_enc_cfg_set_s32(cfg, "rc:mode", MPP_ENC_RC_MODE_VBR);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", 0);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", 20);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_in_denorm", 1);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_out_flex", 0);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_out_num", 20);

    mpp_enc_cfg_set_s32(cfg, "rc:fps_out_denorm", 1);

    mpp_enc_cfg_set_s32(cfg, "rc:gop", 50);

    /* drop frame or not when bitrate overflow */

    mpp_enc_cfg_set_u32(cfg, "rc:drop_mode", MPP_ENC_RC_DROP_FRM_DISABLED);

    mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20);        /* 20% of max bps */

    mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1);         /* Do not continuous drop frame */

bps = 1920 * 1080 / 8 * 20;

    mpp_enc_cfg_set_s32(cfg, "rc:bps_target", bps);

    mpp_enc_cfg_set_s32(cfg, "rc:bps_max", bps * 17 / 16);

    mpp_enc_cfg_set_s32(cfg, "rc:bps_min", bps * 1 / 16);

    mpp_enc_cfg_set_s32(cfg, "codec:type", type);

    if (type == MPP_VIDEO_CodingAVC) {

        // rc_mode = MPP_ENC_RC_MODE_VBR

        mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 26);

        mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51);

        mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10);

        mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51);

        mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10);

        mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2);

        mpp_enc_cfg_set_s32(cfg, "h264:profile", 100);

        mpp_enc_cfg_set_s32(cfg, "h264:level", 40);

        mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1);

        mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0);

        mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1);

    }

mpi->control(ctx, MPP_ENC_SET_CFG, cfg);

h)设置帧信息

MppEncSeiMode seiMode = MPP_ENC_SEI_MODE_ONE_FRAME;

    ret = mppEncData.mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &seiMode);

header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;

mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &header_mode);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值