我正在将基于Android AOSP的发行版从Android K移植到AndroidN。它包括Media Player的修改版本,该版本可解码DVD字幕。 在这两个版本之间,媒体播放器的体系结构发生了很大的变化。特别是,现在它分为3个进程(请参见https://source.android.com/devices/media/framework-hardening)。
因此,我试图使用共享内存使 MediaCodecService 将解码的位图字幕发送到 MediaServer 。我修改了先前由 MediaCodecService 创建的结构的内容,并向解码的位图字幕添加了 subtitle_fd 属性,文件描述符。当 MediaServer 的 Nuplayer 接收到一条消息以进行渲染时,代码将尝试映射上述文件描述符。
不幸的是,调用 :: 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;
非常感谢您!