1

我正在将我的基于 Android AOSP 的发行版从 Android K 移植到 Android N。它包括一个可以解码 DVD 字幕的媒体播放器的修改版本。媒体播放器的架构在这两个版本之间发生了很大变化。特别是,它现在分为 3 个进程(请参阅https://source.android.com/devices/media/framework-hardening)。

因此,我试图使用 Shared Memory 使MediaCodecService将解码的位图字幕发送到MediaServer。我修改了之前由MediaCodecService创建的结构的内容,并在解码的位图字幕中添加了subtitle_fd属性,文件描述符。当MediaServerNuplayer接收到要渲染的消息时,代码会尝试映射上述文件描述符。

不幸的是,调用::mmap的结果总是MAP_FAILED

你知道我错过了什么吗?

  • MediaCodecService 部分的代码

    AVSubtitleRect *rect = sub->rects[0];
    size_t len = sizeof(*rect);
    int fd = ashmem_create_region("subtitle rect", len);
    ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
    void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) {
        ALOGI("%s[%d] dvb ptr == MAP_FAILED", __FUNCTION__, __LINE__);
    } else {
        ALOGI("Success creating FD with value %d", fd);
    }
    memcpy(ptr, rect, len);
    sub->subtitle_fd = fd;
    sub->subtitle_size = len;
    
  • MediaServer 部分的代码

    int fd = mSubtitle->subtitle_fd;
    size_t len = mSubtitle->subtitle_size;
    ALOGI("Trying to map shared memory with FD = %d", fd);
    void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) {
        ALOGI("Subtitle mmap ptr==MAP_FAILED %s", strerror(errno));
    } else {
        ALOGI("Subtitle get ptr %p", ptr);
    }
    AVSubtitleRect *rect = (AVSubtitleRect *)ptr;
    

太感谢了 !

4

0 回答 0