Использование разделяемой памяти Android Nougat для декодирования медиа

Я портирую свой Android AOSP-дистрибутив с Android K на Android N. Он включает модифицированную версию Media Player, которая декодирует субтитры на DVD. Архитектура Media Player сильно изменилась между этими двумя версиями. В частности, теперь он разделен на 3 процесса (см. https://source.android.com/devices/media/framework-hardening).

Таким образом, я пытаюсь использовать общую память, чтобы MediaCodecService отправлял декодированные растровые субтитры на MediaServer. Я изменил содержимое структуры, которая была ранее создана MediaCodecService, и добавил атрибут subtitle_fd, дескриптор файла к декодированному растровому субтитру. Когда Nuplayer MediaServer получает сообщение для рендеринга, код пытается отобразить вышеупомянутый дескриптор файла.

К сожалению, результат вызова ::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;
    

Спасибо вам большое!

0 ответов

Другие вопросы по тегам