OMX_ERRORTYPE OMXVideoDecoderAVCSecure::ProcessorStart(void) { EnableIEDSession(true); uint32_t ret = drm_vendor_api.drm_start_playback(); if (ret != DRM_WV_MOD_SUCCESS) { ALOGE("drm_start_playback failed: (0x%x)", ret); } mSessionPaused = false; return OMXVideoDecoderBase::ProcessorStart(); }
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::ProcessorDeinit(void) { // Session should be torn down in ProcessorStop, delayed to ProcessorDeinit // to allow remaining frames completely rendered. LOGI("Calling Drm_DestroySession."); sec_result_t sepres = Drm_DestroySession(WV_SESSION_ID); if (sepres != 0) { LOGW("Drm_DestroySession returns %#x", sepres); } EnableIEDSession(false); return OMXVideoDecoderBase::ProcessorDeinit(); }
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::ProcessorDeinit(void) { WaitForFrameDisplayed(); // Session should be torn down in ProcessorStop, delayed to ProcessorDeinit // to allow remaining frames completely rendered. ALOGI("Calling Drm_DestroySession."); uint32_t ret = drm_vendor_api.drm_stop_playback(); if (ret != DRM_WV_MOD_SUCCESS) { ALOGE("drm_stop_playback failed: (0x%x)", ret); } EnableIEDSession(false); return OMXVideoDecoderBase::ProcessorDeinit(); }
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::ProcessorStart(void) { uint32_t imrOffset = 0; uint32_t imrBufferSize = IMR_BUFFER_SIZE; uint32_t sessionID; EnableIEDSession(true); sec_result_t sepres = Drm_WV_CreateSession(&imrOffset, &imrBufferSize, &sessionID); if (sepres != 0) { LOGW("Drm_WV_CreateSession failed. Result = %#x", sepres); // Returning error will cause OMX client to crash. //return OMX_ErrorHardware; } if (sessionID != WV_SESSION_ID) { LOGE("Invalid session ID %#x created", sessionID); //return OMX_ErrorHardware; } LOGI("Drm_WV_CreateSession: IMR Offset = %d, IMR size = %#x", imrOffset, imrBufferSize); if (imrBufferSize != IMR_BUFFER_SIZE) { LOGE("Mismatch in IMR size: Requested: %#x Obtained: %#x", IMR_BUFFER_SIZE, imrBufferSize); } drmCommandNone(mDrmDevFd, DRM_PSB_HDCP_DISPLAY_IED_OFF); int ret; struct sigevent sev; memset(&sev, 0, sizeof(sev)); sev.sigev_notify = SIGEV_THREAD; sev.sigev_value.sival_ptr = this; sev.sigev_notify_function = KeepAliveTimerCallback; ret = timer_create(CLOCK_REALTIME, &sev, &mKeepAliveTimer); if (ret != 0) { LOGE("Failed to create timer."); } else { struct itimerspec its; its.it_value.tv_sec = -1; // never expire its.it_value.tv_nsec = 0; its.it_interval.tv_sec = KEEP_ALIVE_INTERVAL; its.it_interval.tv_nsec = 0; ret = timer_settime(mKeepAliveTimer, TIMER_ABSTIME, &its, NULL); if (ret != 0) { LOGE("Failed to set timer."); } } mSessionPaused = false; return OMXVideoDecoderBase::ProcessorStart(); }