HermanChen / mpp

Rockchip MPP(Media Process Platfrom)
172 stars 72 forks source link

请教如何使用 `MPP_BUFFER_TYPE_EXT_DMA` 进行编码 #68

Closed Meonardo closed 2 months ago

Meonardo commented 3 months ago

背景:

问题:

注:

Meonardo commented 3 months ago

直接使用解码后的 DMA buffer 在进行编码是正常的, 解码是纯外部模式分配buffer, 通过 mpp_buffer_get_fd(mpp_frame_get_buffer(frame)) 获取解码后的 DMA fd.

我的操作系统是: Android 13, MPP 版本为mpp version: bebc9961 author: Herman Chen 2024-04-19 docs: Update 1.0.5 CHANGELOG.md.

HermanChen commented 3 months ago

使用 DMA_HEAP 的方式导入呢? 正常应该是可以引入的,pagefault 一般是 buffer 不够大导致的,加大下 buffer 看看

Meonardo commented 3 months ago

@HermanChen 感谢回复.

使用 DMA_HEAP 的方式导入呢?

尝试过使用 MPP_BUFFER_TYPE_DMA_HEAP, 还是出现主楼描述的问题,

正常应该是可以引入的,pagefault 一般是 buffer 不够大导致的,加大下 buffer 看看

这里指在导入MppBuffer 构建 MppBufferInfo 时候传入 size 大小吗? 我在这里有设置 size 为 1920*1088*3/2, 我的图像格式为 NV12.

// 输入
enc_params.width = 1920;
enc_params.height = 1080;

...

MppBufferInfo info;
memset(&info, 0, sizeof(MppBufferInfo));
info.type = MPP_BUFFER_TYPE_EXT_DMA;
info.fd = rga_buffer->fd;
info.size = 1920*1088*3/2;
info.index = rga_buffer->fd;
ret = mpp_buffer_import(&buffer, &info);
if (ret) {
  LOGE(TAG, "mpp_buffer_import failed ret %d", ret);
  return ret;
}

ret = mpp_frame_init(&frame);
if (ret) {
  LOGE(TAG, "mpp_frame_init failed ret %d", ret);
  return ret;
}

mpp_frame_set_width(frame, enc_params.width);
mpp_frame_set_height(frame, enc_params.height);
mpp_frame_set_hor_stride(frame, enc_params.hor_stride);
mpp_frame_set_ver_stride(frame, enc_params.ver_stride);
mpp_frame_set_fmt(frame, enc_params.fmt);
mpp_frame_set_eos(frame, frm_eos);
mpp_frame_set_buffer(frame, buffer);
...
Meonardo commented 3 months ago

MPP 日志:

MPP_ENC_SET_RC_CFG bps 6480000 [6075000 : 6885000] fps [25:25] gop 25
MPP_ENC_SET_PREP_CFG w:h [1920:1080] stride [1920:1088]
mode cbr bps [6075000:6480000:6885000] fps fix [25/1] -> fix [25/1] gop i [25] v [0]
HermanChen commented 3 months ago

直接 w h 2 看看

Meonardo commented 2 months ago

buffer size 问题.