Как исправить ошибку ExoPlayer «родное окно не может обрабатывать защищенные буферы» - PullRequest
1 голос
/ 21 июня 2019

Я получаю сообщение об ошибке при остановке ExoPlayer и размещении моего приложения в фоновом режиме. Поток содержит защищенный Widevine контент и рекламу, которые вставляются на стороне сервера. Я подозреваю, что эта смесь защищенного и незащищенного содержимого вызывает ошибку, но не знаю, с чего начать. Помещение приложения в фоновый режим и его возобновление фактически работает один раз во время незащищенной предварительной рекламы, но не удается при повторной попытке его в основном контенте.

SurfaceUtils регистрирует следующее сообщение: native window cannot handle protected buffers: the consumer should either be a hardware composer or support hardware protection.

Кто-нибудь знает, что это на самом деле означает? К сожалению, я не слишком знаком с внутренней работой ExoPlayer.

Код в SurfaceUtils.cpp, который возвращает ошибку, может быть полезен здесь:

// Make sure to check whether either Stagefright or the video decoder
// requested protected buffers.
if (usage & GRALLOC_USAGE_PROTECTED) {
    // Check if the ANativeWindow sends images directly to SurfaceFlinger.
    int queuesToNativeWindow = 0;
    err = nativeWindow->query(
            nativeWindow, NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, &queuesToNativeWindow);
    if (err != NO_ERROR) {
        ALOGE("error authenticating native window: %s (%d)", strerror(-err), -err);
        return err;
    }
    // Check if the consumer end of the ANativeWindow can handle protected content.
    int isConsumerProtected = 0;
    err = nativeWindow->query(
            nativeWindow, NATIVE_WINDOW_CONSUMER_IS_PROTECTED, &isConsumerProtected);
    if (err != NO_ERROR) {
        ALOGE("error query native window: %s (%d)", strerror(-err), -err);
        return err;
    }
    // Deny queuing into native window if neither condition is satisfied.
    if (queuesToNativeWindow != 1 && isConsumerProtected != 1) {
        ALOGE("native window cannot handle protected buffers: the consumer should either be a hardware composer or support hardware protection");
        return PERMISSION_DENIED;
    }
}
...