Error_t CCommandLineOptions::process( int argc, char* argv[] )
{
    if (!m_bIsInitialized)
        return kNotInitializedError;

    if (!argv || argc < 2)
        return kFunctionInvalidArgsError;

    for (int i = 1; i < argc; i++)
    {
        int iIdx = getBufferIdx(argv[i]);

        if (iIdx < 0)
            continue;

        assert(iIdx <= m_iNumOfOptions);

        if (m_ppCOptions[iIdx]->getType() == COption::OptionType_t::kBool)
            m_ppCClArgs[iIdx]->setCurrOption();
        else
        {
            if (i < argc-1)
            {
                m_ppCClArgs[iIdx]->setCurrOption(argv[i+1]);
                if (getBufferIdx(argv[i+1]) >= 0)
                {
                    return kInvalidString;
                }
                i++;
            }
        }
    }

    return kNoError;
}
bool CCommandLineOptions::isOptionSet( int iIdentifier ) const
{
    int iIdx = getBufferIdx(iIdentifier);

    if (iIdx >+ m_iNumOfOptions || iIdx < 0)
        return false;
    return m_ppCClArgs[iIdx]->isSet();
}
bool CCommandLineOptions::isOptionSet( std::string argv ) const
{
    int iIdx = getBufferIdx(argv);

    if (iIdx >= m_iNumOfOptions || iIdx < 0)
        return false;
    return m_ppCClArgs[iIdx]->isSet();
}
Error_t CCommandLineOptions::getOption( std::string argv, std::string& sResult ) const
{
    if (!isOptionSet(argv))
        return kNotInitializedError;

    int iIdx = getBufferIdx(argv);

    sResult = m_ppCClArgs[iIdx]->getArg();

    return kNoError;
}
int PreviewStream::allocateBuffers(int /*width*/, int /*height*/,
                        int /*format*/, int /*numBufs*/ )
{
    int index = -1;
    int ret = NO_ERROR;

    //In DeviceAdapter::handleFrameRelease, if mPreviewing is false,
    //will not dec mRefCount. This will happen when performance is low.
    //So need zero ref count.
    for (int i = 0; i < mTotalBuffers; i++) {
       // FLOGI("==== PreviewStream::allocateBuffers, i %d, state %d, ref %d",
         //   i, mCameraBuffer[i].getState(), mCameraBuffer[i].getRefCount());

        mCameraBuffer[i].ZeroRefCount();
    }

    for (int i = 0; i < mMaxProducerBuffers; i++) {
        buffer_handle_t *buf_h = NULL;
        ret = mNativeWindow->dequeue_buffer(mNativeWindow, &buf_h);
        if (ret != 0) {
            FLOGE("dequeueBuffer failed: %s (%d)", strerror(-ret), -ret);
            if (ENODEV == ret) {
                FLOGE("Preview surface abandoned!");
                mNativeWindow = NULL;
            }
            return ret;
        }

        index = getBufferIdx(buf_h);
        if (index < 0 || index >= mTotalBuffers) {
            FLOGE("%s dequeue invalid buffer", __FUNCTION__);
            return BAD_VALUE;
        }
        mCameraBuffer[index].setState(CameraFrame::BUFS_FREE);
		if(mDeviceAdapter.get() && mDeviceAdapter->UseMJPG()) {
			mDeviceAdapter.get()->mVPUPhyAddr[i] = (unsigned char*)mCameraBuffer[index].mPhyAddr;
            mDeviceAdapter.get()->mVPUVirtAddr[i] = (unsigned char*)mCameraBuffer[index].mVirtAddr;
            FLOGI("allocateBuffers, index %d, phyAddr 0x%x", index, mCameraBuffer[index].mPhyAddr);
		}
    }

    for (int i = 0; i < mTotalBuffers; i++) {
        int state = mCameraBuffer[i].getState();
        if (state != CameraFrame::BUFS_FREE) {
            mCameraBuffer[i].setState(CameraFrame::BUFS_IN_SERVICE);

            // The frame held in service.
            // Make sure we dont add one more reference
            // count for it
            if(!mCameraBuffer[i].getRefCount())
                mCameraBuffer[i].addReference();
        }

        if(mDeviceAdapter.get() && mDeviceAdapter->UseMJPG()) {
            mCameraBuffer[i].mBindUVCBufIdx = -1;
            mCameraBuffer[i].mpFrameBuf = NULL;
        }
    }

    dispatchBuffers(&mCameraBuffer[0], mTotalBuffers, BUFFER_CREATE);

    return ret;
}