void                renderImgBuf(sp<IImgBuf>const& pImgBuf)
                        {
                            char const aColor[] = {0, 128, 255};
                            static int idxColor = 0;
                            MY_LOGD("[TestThread::renderImgBuf]");

                            ::memset(pImgBuf->getVirAddr(), aColor[idxColor], pImgBuf->getBufSize());
                            idxColor = (idxColor+1) % (sizeof(aColor)/sizeof(aColor[0]));
                        }
bool
RecordClient::
performRecordCallback(int32_t bufIdx, sp<ICameraImgBuf>const& pCameraImgBuf, int32_t const msgType)
{
    nsecs_t timeDiff;
    //
    if  ( pCameraImgBuf != 0 )
    {
        //  [1] Dump image if wanted.
        if  ( 0 < mi4DumpImgBufCount )
        {
            MY_LOGD("<dump image> mi4DumpImgBufCount(%d) > 0", mi4DumpImgBufCount);
            Mutex::Autolock _lock(mDumpMtx);
            saveBufToFile(
                String8::format(
                    "%s_%s-(%d)%dx%d_%03d.yuv", 
                    ms8DumpImgBufPath.string(), 
                    pCameraImgBuf->getImgFormat().string(), 
                    pCameraImgBuf->getImgWidthStride(), 
                    pCameraImgBuf->getImgWidth(), 
                    pCameraImgBuf->getImgHeight(), 
                    mi4DumpImgBufIndex
                ), 
                (uint8_t*)pCameraImgBuf->getVirAddr(), 
                pCameraImgBuf->getBufSize()
            );
            ::android_atomic_dec(&mi4DumpImgBufCount);
            ::android_atomic_inc(&mi4DumpImgBufIndex);
        }

        if(!isMsgEnabled())
        {
            MY_LOGW_IF(ENABLE_LOG_PER_FRAME, "No REC CB: isEnabledState(%d), isMsgEnabled(%d)", isEnabledState(), isMsgEnabled());
            return false;
        }
        //
        if(mLastTimeStamp >= pCameraImgBuf->getTimestamp())
        {
            MY_LOGW("TimeStamp:Last(%d.%06d) >= Cur(%d.%06d)",
                    (uint32_t)((mLastTimeStamp/1000)/1000000), 
                    (uint32_t)((mLastTimeStamp/1000)%1000000),
                    (uint32_t)((pCameraImgBuf->getTimestamp()/1000)/1000000), 
                    (uint32_t)((pCameraImgBuf->getTimestamp()/1000)%1000000));
            return false;
        }
        mLastTimeStamp = pCameraImgBuf->getTimestamp();
        //  [2] Callback
        CamProfile profile(__FUNCTION__, "RecordClient");
        ::android_atomic_inc(&mi4CallbackRefCount);
        mi8CallbackTimeInMs = MtkCamUtils::getTimeInMs();
        //
        mFrameCount++;
        mTimeEnd = systemTime();
        timeDiff = mTimeEnd - mTimeStart; 
        if(timeDiff > FPS_CNT_TIME)
        {
            MY_LOGD("FPS(%d)",mFrameCount);
            mFrameCount = 0;
            mTimeStart = mTimeEnd;
        }
        //
        {
            Mutex::Autolock _l(mModuleMtx);
            //
            mvRecBufInfo.editItemAt(bufIdx).Sta = REC_BUF_STA_CB;
        }
        //
        mpCamMsgCbInfo->mDataCbTimestamp(
            (nsecs_t)pCameraImgBuf->getTimestamp(),
            (int32_t)CAMERA_MSG_VIDEO_FRAME,
            pCameraImgBuf->get_camera_memory(), 
            pCameraImgBuf->getBufIndex(), 
            mpCamMsgCbInfo->mCbCookie
        );
        MY_LOGD("CB:FC(%d),VA(0x%08X)",mFrameCount,pCameraImgBuf->getVirAddr());
        //
        ::android_atomic_dec(&mi4CallbackRefCount);
        //profile.print_overtime(10, "mDataCb(%x) - index(%d)", msgType, pCameraImgBuf->getBufIndex());
        return true;
    }
    return false;
}