int main_testPostProc(IMEM_BUF_INFO rInMem, int width, int height, int format) 
{
    MY_LOGD("+"); 
    MUINT32 u4DispW = 1280; 
    MUINT32 u4DispH = 960; 

    // (1). Create Instance 
    IPostProcPipe    *pPostProcPipe = IPostProcPipe::createInstance(eSWScenarioID_CAPTURE_NORMAL, eScenarioFmt_RAW); 
    if (pPostProcPipe != NULL) 
    {
        MY_LOGD("Pipe (Name, ID, IDName) = (%s, %d)", pPostProcPipe->getPipeName(), pPostProcPipe->getPipeId()); 
    }
    
    // (2). Query port property
    vector<PortProperty> rInPortProperty; 
    vector<PortProperty> rOutPortProperty;     
    if (pPostProcPipe->queryPipeProperty(rInPortProperty,rOutPortProperty))
    {
        MY_LOGD("Port Property (IN, OUT): (%d, %d)", rInPortProperty.size(), rOutPortProperty.size()); 
        for (MUINT32 i = 0; i < rInPortProperty.size(); i++)
        {
            MY_LOGD("IN: (type,index,inout) = (%d, %d, %d)", rInPortProperty.at(i).type, rInPortProperty.at(i).index, rInPortProperty.at(i).inout); 
            MY_LOGD("IN: (fmt, rot, flip) = (%d, %d, %d)", rInPortProperty.at(i).u4SupportFmt,
                                         rInPortProperty.at(i).fgIsSupportRotate, rInPortProperty.at(i).fgIsSupportFlip); 
        }       
        for (MUINT32 i = 0; i < rOutPortProperty.size(); i++)
        {
            MY_LOGD("OUT: (type,index,inout) = (%d, %d, %d)", rOutPortProperty.at(i).type, rOutPortProperty.at(i).index, rOutPortProperty.at(i).inout); 
            MY_LOGD("OUT: (fmt, rot, flip) = (%d, %d, %d)", rOutPortProperty.at(i).u4SupportFmt,
                                         rOutPortProperty.at(i).fgIsSupportRotate, rOutPortProperty.at(i).fgIsSupportFlip); 
        } 
    }    

    // (3). init 
    pPostProcPipe->init(); 

    // (4). setCallback
    pPostProcPipe->setCallbacks(NULL, NULL, NULL); 

    // (5). Config pipe 
    // 
    MUINT32 u4RawStride[3] = {width, 0, 0}; 
    MemoryInPortInfo rMemInPort(ImgInfo(eImgFmt_BAYER8, width, height), 
                                0, u4RawStride, Rect(0, 0, width, height)); 
    //
    MUINT32 u4DispStride[3] = {u4DispW, 0, 0}; 
    MemoryOutPortInfo rDispPort(ImgInfo(eImgFmt_YUY2, u4DispW, u4DispH), 
                               u4DispStride, 0, 0); 
    //
    vector<PortInfo const*> vCdpInPorts;  
    vector<PortInfo const*> vCdpOutPorts; 
    //
    vCdpInPorts.push_back(&rMemInPort); 
    vCdpOutPorts.push_back(&rDispPort); 
#if VIDEO_PORT_ON
    MUINT32 u4VdoStride[3] = {u4DispW, 0, 0}; 
    MemoryOutPortInfo rVdoPort(ImgInfo(eImgFmt_YUY2, u4DispW, u4DispH), 
                               u4VdoStride, 0, 0);   
    rVdoPort.index = 1;   
    vCdpOutPorts.push_back(&rVdoPort); 
#endif 
    //
    pPostProcPipe->configPipe(vCdpInPorts, vCdpOutPorts); 

    // (6). Enqueue, In buf
    // 
    QBufInfo rInBuf; 
    rInBuf.vBufInfo.clear(); 
    BufInfo rBufInfo(rInMem.size, rInMem.virtAddr, rInMem.phyAddr, rInMem.memID);  
    rInBuf.vBufInfo.push_back(rBufInfo); 
    pPostProcPipe->enqueBuf(PortID(EPortType_MemoryIn, 0, 0), rInBuf); 

    // (6.1) Enqueue, Out Buf
    // 
    IMEM_BUF_INFO rDispMem; 
    rDispMem.size = ((u4DispW * u4DispH * 2) + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1);     
    allocMem(rDispMem);     
    // 
    QBufInfo rOutBuf; 
    rOutBuf.vBufInfo.clear(); 
    rBufInfo.u4BufSize = rDispMem.size; 
    rBufInfo.u4BufVA = rDispMem.virtAddr; 
    rBufInfo.u4BufPA = rDispMem.phyAddr; 
    rBufInfo.i4MemID = rDispMem.memID; 
    rOutBuf.vBufInfo.push_back(rBufInfo); 
    pPostProcPipe->enqueBuf(PortID(EPortType_MemoryOut, 0, 1), rOutBuf); 

    //
#if  VIDEO_PORT_ON
    IMEM_BUF_INFO rVdoMem; 
    rVdoMem.size = ((u4DispW * u4DispH * 2)+ L1_CACHE_BYTES - 1) & ~(L1_CACHE_BYTES - 1); 
    allocMem(rVdoMem);    
    //
    rOutBuf.vBufInfo.at(0).u4BufSize = rVdoMem.size; 
    rOutBuf.vBufInfo.at(0).u4BufVA = rVdoMem.virtAddr; 
    rOutBuf.vBufInfo.at(0).u4BufPA = rVdoMem.phyAddr; 
    rOutBuf.vBufInfo.at(0).i4MemID = rVdoMem.memID; 
    pPostProcPipe->enqueBuf(PortID(EPortType_MemoryOut, 1, 1), rOutBuf); 
#endif 

    // (7). start
    pPostProcPipe->start(); 

    // (8). Dequeue
    QTimeStampBufInfo rQDispOutBuf;         
    QTimeStampBufInfo rQVdoOutBuf; 
    pPostProcPipe->dequeBuf(PortID(EPortType_MemoryOut, 0, 1), rQDispOutBuf); 

#if VIDEO_PORT_ON
    pPostProcPipe->dequeBuf(PortID(EPortType_MemoryOut, 1, 1), rQVdoOutBuf); 
#endif 
    // (8.1) Dequeue In Buf 
    QTimeStampBufInfo rQInBuf;             
    pPostProcPipe->dequeBuf(PortID(EPortType_MemoryIn, 0, 0), rQInBuf); 
 
    // (9). Stop 
    pPostProcPipe->stop();
    // (10). uninit 
    pPostProcPipe->uninit(); 
    // (11). destory instance 
    pPostProcPipe->destroyInstance(); 

    char filename[256]; 
    sprintf(filename, "/data/disp%dx%d.yuv", u4DispW, u4DispH);     
    saveBufToFile(filename, reinterpret_cast<MUINT8*>(rDispMem.virtAddr), u4DispW * u4DispH * 2); 
    deallocMem(rDispMem); 
#if VIDEO_PORT_ON
    sprintf(filename, "/data/vdo%dx%d.yuv", u4DispW, u4DispH);     
    saveBufToFile(filename, reinterpret_cast<MUINT8*>(rVdoMem.virtAddr), u4DispW * u4DispH * 2); 
    deallocMem(rVdoMem); 
#endif 
    //
    return 0; 
}
MBOOL 
SingleShot::
createYuvRawImg(ImgBufInfo const & rSrcImgBufInfo, Rect const rSrcCropRect, MUINT32 u4Img1Rot, MUINT32 u4Img1Flip, ImgBufInfo const & rDstImgBufInfo)
{
    FUNCTION_LOG_START;
    AutoCPTLog cptlog(Event_SShot_createYuvRawImg);
    if (!lock(RES_MGR_DRV_SCEN_HW_IP, PIPE_MGR_DRV_PIPE_MASK_POST_PROC, 3000))
    {
        MY_LOGE("[createYuvRawImg] lock resource fail"); 
        return MFALSE; 
    }
    // (1). Create Instance 
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "init");
    IPostProcPipe    *pPostProcPipe = IPostProcPipe::createInstance(eSWScenarioID_CAPTURE_NORMAL,  static_cast<EScenarioFmt>(mapScenarioType(rSrcImgBufInfo.eImgFmt))); 
    CHECK_OBJECT(pPostProcPipe); 
   
    // (2). Query port property
    // (3). init 

    pPostProcPipe->init(); 
    // (4). setCallback
    pPostProcPipe->setCallbacks(NULL, NULL, NULL); 

    // (5). Config pipe 
    // 
    MemoryInPortInfo rMemInPort(ImgInfo(rSrcImgBufInfo.eImgFmt, rSrcImgBufInfo.u4ImgWidth, rSrcImgBufInfo.u4ImgHeight), 
                                0, rSrcImgBufInfo.u4Stride, Rect(rSrcCropRect.x, rSrcCropRect.y, rSrcCropRect.w, rSrcCropRect.h)); 
    //
    MemoryOutPortInfo rVdoPort(ImgInfo(rDstImgBufInfo.eImgFmt, rDstImgBufInfo.u4ImgWidth, rDstImgBufInfo.u4ImgHeight), 
                               rDstImgBufInfo.u4Stride, u4Img1Rot, u4Img1Flip);   
    rVdoPort.index = 1;   
    //
    vector<PortInfo const*> vInPorts;  
    vector<PortInfo const*> vOutPorts; 
    //
    vInPorts.push_back(&rMemInPort); 
    vOutPorts.push_back(&rVdoPort); 
    //
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "configPipe");
    pPostProcPipe->configPipe(vInPorts, vOutPorts); 
    // (6). Enqueue, In buf
    // 
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "enqueBuf");
    QBufInfo rInQBuf; 
    BufInfo rInBufInfo(rSrcImgBufInfo.u4BufSize, rSrcImgBufInfo.u4BufVA, rSrcImgBufInfo.u4BufPA, rSrcImgBufInfo.i4MemID);  
    rInQBuf.vBufInfo.push_back(rInBufInfo); 
    pPostProcPipe->enqueBuf(PortID(EPortType_MemoryIn, 0, 0), rInQBuf); 

    // (6.1) Enqueue, Yuv out Buf
    QBufInfo rVdoQBuf; 
    BufInfo rVdoBufInfo(rDstImgBufInfo.u4BufSize, rDstImgBufInfo.u4BufVA, rDstImgBufInfo.u4BufPA, rDstImgBufInfo.i4MemID); 
    rVdoQBuf.vBufInfo.push_back(rVdoBufInfo); 
    pPostProcPipe->enqueBuf(PortID(EPortType_MemoryOut, 1, 1), rVdoQBuf); 

    // (7). start
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "start");
    pPostProcPipe->start(); 
    // (8). YUV Dequeue
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "dequeBuf");
    QTimeStampBufInfo rQVdoOutBuf; 
    pPostProcPipe->dequeBuf(PortID(EPortType_MemoryOut, 1, 1), rQVdoOutBuf); 
    // (8.1) In buffer dequeue 
    QTimeStampBufInfo rQInBuf; 
    pPostProcPipe->dequeBuf(PortID(EPortType_MemoryIn, 0, 0), rQInBuf); 

    // (9). Stop 
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "stop");
    pPostProcPipe->stop();    

    if (mu4DumpFlag) 
    {
        char fileName[256] = {'\0'}; 
        sprintf(fileName, "/%s/shot_yuv%dx%d.yuv", MEDIA_PATH, rDstImgBufInfo.u4ImgWidth, rDstImgBufInfo.u4ImgHeight); 
        MtkCamUtils::saveBufToFile(fileName, reinterpret_cast<MUINT8*>( rDstImgBufInfo.u4BufVA), rDstImgBufInfo.u4BufSize);         
   }
    // (10). uninit 
    CPTLogStr(Event_SShot_createYuvRawImg, CPTFlagSeparator, "uninit");
    pPostProcPipe->uninit(); 
    // (11). destory instance 
    pPostProcPipe->destroyInstance(); 

    unlock(PIPE_MGR_DRV_PIPE_MASK_POST_PROC); 
    FUNCTION_LOG_END;

    return MTRUE; 
}