bm_image device memory 管理
bm_image 结构需要关联相关 device memory,并且 device memory 中有你所需要的数据时,才能够调用之后的 bmcv API。无论是调用 bm_image_alloc_dev_mem 内部申请,还是调用 bm_image_attach 关联外部内存,均能够使得 bm_image 对象关联 device memory。
判断 bm_image 对象是否已经关联了,可以调用以下 API:
bool bm_image_is_attached( bm_image image );
传入参数说明:
bm_image image
输入参数。待判断的 bm_image 对象
返回值说明:
如果 bm_image 对象未创建,则返回 false;
该函数返回 bm_image 对象是否关联了一块 device memory,如果已关联,则返回 true,否则返回 false
注意事项:
一般情况而言,调用 bmcv api 要求输入 bm_image 对象关联 device memory,否则返回失败。而输出 bm_image 对象如果未关联 device memory,则会在内部调用 bm_image_alloc_dev_mem 函数,内部申请内存。
bm_image 调用 bm_image_alloc_dev_mem 所申请的内存都由内部自动管理,在调用 bm_image_destroy、 bm_image_detach 或者 bm_image_attach 其他 device memory 时自动释放,无需调用者管理。相反,如果 bm_image_attach 一块 device memory 时,表示这块 memory 将由调用者自己管理。无论是 bm_image_destroy、bm_image_detach,或者再调用 bm_image_attach 其他 device memory,均不会释放,需要调用者手动释放。
目前 device memory 分为三块内存空间:heap0、heap1和heap2。三者的区别在于bm1684 处理器的硬件 VPP 模块是否有读取权限,其他完全相同,因此如果某一 API 需要指定使用bm1684 硬件VPP模块来实现,则必须保证该 API 的输入 bm_image 保存在 heap1 或者 heap2 空间上。 bm1684x vpp无此限制。
heap id |
bm1684 VPP |
bm1684x VPP |
---|---|---|
heap0 |
不可读 |
可读 |
heap1 |
可读 |
可读 |
heap2 |
可读 |
可读 |