FFmpeg解码后的rgba数据怎么绘制到Xcomponent上面有没有参考的demo?
使用了NativeImage:
void OhosSWDisplay::CopyToNativeImage(int width, int height, uint8_t *ragaBuffer) {
if (nativeImage_ == nullptr) {
return;
}
// 获取生产者NativeWindow
OHNativeWindow *nativeWindow = OH_NativeImage_AcquireNativeWindow(nativeImage_);
if (!nativeWindow) {
ALOGE("OH_NativeImage_AcquireNativeWindow failed");
return;
}
// 设置NativeWindow的宽高。
int code = SET_BUFFER_GEOMETRY;
int32_t ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, width, height);
if (ret != 0) {
ALOGE("OH_NativeWindow_NativeWindowHandleOpt failed");
return;
}
// 从NativeWindow中获取NativeWindowBuffer。
OHNativeWindowBuffer *buffer = nullptr;
int fenceFd;
// 通过 OH_NativeWindow_NativeWindowRequestBuffer 获取 OHNativeWindowBuffer 实例
ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &buffer, &fenceFd);
if (ret != 0) {
ALOGE("OH_NativeWindow_NativeWindowRequestBuffer failed");
return;
}
BufferHandle *handle = OH_NativeWindow_GetBufferHandleFromNative(buffer);
if (!handle) {
ALOGE("OH_NativeWindow_GetBufferHandleFromNative failed");
return;
}
// 将生产的内容写入NativeWindowBuffer。
// 使用系统mmap接口拿到bufferHandle的内存虚拟地址
void *mappedAddr = mmap(handle->virAddr, handle->size, PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd, 0);
if (mappedAddr == MAP_FAILED) {
ALOGE("mmap failed");
return;
}
uint32_t *pixel = static_cast<uint32_t *>(mappedAddr);
for (uint32_t x = 0; x < width; x++) {
for (uint32_t y = 0; y < height; y++) {
*pixel++ = *ragaBuffer++;
}
}
// 内存使用完记得去掉内存映射
int result = munmap(mappedAddr, handle->size);
if (result == -1) {
ALOGE("munmap failed");
}
// 将NativeWindowBuffer提交到NativeWindow。
// 设置刷新区域,如果Region中的Rect为nullptr,或者rectNumber为0,则认为NativeWindowBuffer全部有内容更改。
Region region{nullptr, 0};
// 通过OH_NativeWindow_NativeWindowFlushBuffer 提交给消费者使用,例如:显示在屏幕上。
OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, buffer, fenceFd, region);
// 用完需要销毁NativeWindow。
OH_NativeWindow_DestroyNativeWindow(nativeWindow);
}
但是在调用几次后OH\_NativeWindow\_NativeWindowRequestBuffer就是崩溃。
Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x006b6b6b6b6b6b6b
可以参考如下demo:https://gitee.com/openharmony/applications\_app\_samples/tree/master/code/BasicFeature/Native/NdkNativeWindow