void NuPlayerVPPProcessor::flushShutdown() {
    LOGV("flushShutdown");

    if(!mThreadRunning)
        return;

    quitThread();

    if (mWorker != NULL) {
        delete mWorker;
        mWorker = NULL;
    }

    printBuffers();

    if (!mThreadRunning) {
        for (uint32_t i = 0; i < mInputBufferNum; i++) {
            if(mInput[i].mStatus != VPP_BUFFER_FREE) {
                postAndResetInput(i);
            }
        }

        for (uint32_t i = 0; i < mOutputBufferNum; i++) {
            if (mOutput[i].mStatus != VPP_BUFFER_RENDERING) {
                ACodec::BufferInfo * info = findBufferByGraphicBuffer(mOutput[i].mGraphicBuffer);
                if (info != NULL) {
                    cancelBufferToNativeWindow(info);
                    mOutput[i].resetBuffer(NULL);
                }
            }
        }
    }
    mInputLoadPoint = 0;
    mOutputLoadPoint = 0;
}
GenericSchedulerThread::~GenericSchedulerThread()
{
    // Ensure the thread is no longer running
    quitThread(false);

    // If blocking here from the main-thread you probably forgot to call waitForThreadToQuitQueued_main_thread() appropriately
    wait();
}
NuPlayerVPPProcessor::~NuPlayerVPPProcessor() {
    quitThread();

    if (mWorker != NULL) {
        delete mWorker;
        mWorker = NULL;
    }

    if (mThreadRunning == false) {
        releaseBuffers();
    }
    mNuPlayerVPPProcessor = NULL;
    LOGI("===== VPPInputCount = %d  =====", mInputCount);
}