HarmonyOS FFmpeg解码后的rgba数据绘制到Xcomponent有demo提供吗?

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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

但是在调用几次后OH_NativeWindow_NativeWindowRequestBuffer就是崩溃。

Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x006b6b6b6b6b6b6b 
  • 1.
HarmonyOS
2024-12-25 10:38:56
1268浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
FengTianYa
分享
微博
QQ
微信
回复
2024-12-25 13:59:17
相关问题
HarmonyOS XComponent绘制
753浏览 • 1回复 待解决
提供Webview demo哪些?
853浏览 • 1回复 待解决
需要提供c++js通信demo
1346浏览 • 1回复 待解决
解码数据帧送显三种方式
1142浏览 • 1回复 待解决
XComponent、NativeDrawing实现2D图形绘制
2118浏览 • 1回复 待解决
HarmonyOS color文件不支持rgba
819浏览 • 1回复 待解决
求鸿蒙视频编码解码具体demo
7299浏览 • 1回复 待解决
【播放器】硬解码支持Demo
2647浏览 • 1回复 待解决
HarmonyOS 类似骨架屏实现demo
852浏览 • 1回复 待解决