Я получаю сообщение об ошибке при остановке 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;
}
}