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();
}
コード例 #2
0
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();
}
コード例 #4
0
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();
}