MINT32
S3dshotClient::
CreateMotionSrc(MVOID * srcbufadr, int ImgWidth, int ImgHeight, MVOID * dstbufadr)
{
    bool ret = true;
    MY_LOGD("[CreateMotionSrc] +");
    DpBlitStream Motionstream; 

    unsigned int src_addr_list[3];
    unsigned int src_size_list[3];
    unsigned int dst_addr_list[3];
    unsigned int dst_size_list[3];
    
    unsigned char *src_yp;
    unsigned char *dst_rgb;
    
    int src_ysize = ImgWidth * ImgHeight;
    int src_usize, src_vsize;
    src_usize = src_vsize = src_ysize / 4;
    MY_LOGD("[CreateMotionSrc] src_ysize %d adr 0x%x w %d h %d",src_ysize,srcbufadr,ImgWidth,ImgHeight);
    int plane_num = 3;
    src_yp = (unsigned char *)srcbufadr;
    src_addr_list[0] = (unsigned int)src_yp;
    src_addr_list[1] = (unsigned int)(src_yp + src_ysize);
    src_addr_list[2] = (unsigned int)(src_yp + src_ysize + src_usize);
    
    src_size_list[0] = src_ysize;
    src_size_list[1] = src_vsize;
    src_size_list[2] = src_usize;
    //*****************************************************************************//
    Motionstream.setSrcBuffer((void**)src_addr_list, src_size_list, plane_num);
    Motionstream.setSrcConfig(ImgWidth,ImgHeight, eYUV_420_3P_YVU);
    
     //***************************dst RGB565********************************//
    dst_rgb = (unsigned char *)dstbufadr;
    MY_LOGD("[CreateMotionSrc] tar size %d adr 0x%x w %d h %d", (MOTION_MAX_IN_WIDTH * MOTION_MAX_IN_HEIGHT*2),dst_rgb,MOTION_MAX_IN_WIDTH,MOTION_MAX_IN_HEIGHT);
    Motionstream.setDstBuffer((void *)dst_rgb, (MOTION_MAX_IN_WIDTH * MOTION_MAX_IN_HEIGHT*2));
    Motionstream.setDstConfig(MOTION_MAX_IN_WIDTH, MOTION_MAX_IN_HEIGHT, eRGB565);
    Motionstream.setRotate(0);
    
    //*****************************************************************************//
    
     MY_LOGD("DDP_Performance_RGB565 Start");   
    
    // set & add pipe to stream
    if (!Motionstream.invalidate())  //trigger HW
    {
          MY_LOGD("FDstream invalidate failed");
          return false;
    }
    #ifdef debug
    char sourceFiles[80];
    sprintf(sourceFiles, "%s%d_%dx%d.rgb565", "/sdcard/motion", Mcount,MOTION_MAX_IN_WIDTH,MOTION_MAX_IN_HEIGHT);
    dumpBufToFile((char *) sourceFiles, (MUINT8 *)dst_rgb , (MOTION_MAX_IN_WIDTH * MOTION_MAX_IN_HEIGHT * 2));
    Mcount++;
    #endif
    MY_LOGD("DDP_Performance_RGB565 End");  
    return ret;    
}
예제 #2
0
bool
ZsdShot::
imageTransform  (ImgBufInfo const & rSrcImgBufInfo, ImgBufInfo const & rDstImgBufInfo, int const & rot)
{
    FUNCTION_LOG_START;
    //return MFALSE;
    //AutoCPTLog cptlog(Event_MShot_convertImage);

    //MY_LOGD("convertImage, src (VA, PA, Size, ID) = (0x%x, 0x%x, %d, %d)", rSrcImgBufInfo.u4BufVA, rSrcImgBufInfo.u4BufPA, rSrcImgBufInfo.u4BufSize, rSrcImgBufInfo.i4MemID);
    //MY_LOGD("convertImage, dst (VA, PA, Size, ID) = (0x%x, 0x%x, %d, %d)", rDstImgBufInfo.u4BufVA, rDstImgBufInfo.u4BufPA, rDstImgBufInfo.u4BufSize, rDstImgBufInfo.i4MemID);
    MY_LOGD("%d@%dx%d->%d@%dx%d(rot:%d)",
        rSrcImgBufInfo.eImgFmt, rSrcImgBufInfo.u4ImgWidth, rSrcImgBufInfo.u4ImgHeight,
        rDstImgBufInfo.eImgFmt, rDstImgBufInfo.u4ImgWidth, rDstImgBufInfo.u4ImgHeight, rot);

    //MtkCamUtils::CamProfile profile("convertImage", "MultiShot");

    DpBlitStream thumbnailStream;
    DpColorFormat dp_in_fmt;
    DpColorFormat dp_out_fmt;
    DpInterlaceFormat dp_interlace_fmt = eInterlace_None;

    switch (rSrcImgBufInfo.eImgFmt) {
        case eImgFmt_YV12:
            dp_in_fmt = eYUV_420_3P;
            break;
        case eImgFmt_YUY2:
            dp_in_fmt = eYUY2;
            break;
        default:
            MY_LOGE("not support src format %d", rSrcImgBufInfo.eImgFmt);
            return false;
            break;
    }

    unsigned char *src_yp = (unsigned char *)(rSrcImgBufInfo.u4BufVA); //
    int src_ysize = rSrcImgBufInfo.u4ImgWidth * rSrcImgBufInfo.u4ImgHeight; //
    int src_usize, src_vsize;  //
    src_usize = src_vsize = src_ysize / 4;  //

    unsigned int src_addr_list[3];//
    unsigned int src_size_list[3];//
    int plane_num;//
    // set & register src buffer
    switch(rSrcImgBufInfo.eImgFmt) {
        case eImgFmt_YV12:
            src_addr_list[0] = (unsigned int)src_yp;
            src_addr_list[1] = (unsigned int)(src_yp + src_ysize * 5 / 4);
            src_addr_list[2] = (unsigned int)(src_yp + src_ysize);

            src_size_list[0] = src_ysize;
            src_size_list[1] = src_vsize;
            src_size_list[2] = src_usize;

            plane_num = 3;
            thumbnailStream.setSrcBuffer((void**)src_addr_list, src_size_list, plane_num);
            break;
        case eImgFmt_YUY2:
            src_addr_list[0] = (unsigned int)src_yp;

            src_size_list[0] = src_ysize*2;
            plane_num = 1;
            thumbnailStream.setSrcBuffer((void*)src_yp, src_ysize*2);
            break;
        default:
            return false;
            break;
    }

    unsigned char *dst_yp = (unsigned char *)(rDstImgBufInfo.u4BufVA);
    //unsigned char *ori_yp;
    //ori_yp  = (unsigned char *)(mPostViewImgBufInfoRead.u4BufVA);

    int dst_ysize = rDstImgBufInfo.u4ImgWidth*rDstImgBufInfo.u4ImgHeight;
    int dst_usize, dst_vsize;
    dst_usize = dst_vsize = dst_ysize / 4;
    unsigned int dst_addr_list[3];
    unsigned int dst_size_list[3];
    int plane_num_out;//
    switch(rDstImgBufInfo.eImgFmt) {
        case eImgFmt_YV12:
            dst_addr_list[0] = (unsigned int)dst_yp;
            dst_addr_list[1] = (unsigned int)(dst_yp + dst_ysize * 5 / 4);
            dst_addr_list[2] = (unsigned int)(dst_yp + dst_ysize);

            dst_size_list[0] = dst_ysize;
            dst_size_list[1] = dst_vsize;
            dst_size_list[2] = dst_usize;

            plane_num_out = 3;
            dp_out_fmt = eYUV_420_3P;
            thumbnailStream.setDstBuffer((void**)dst_addr_list, dst_size_list, plane_num_out);
            break;
         case eImgFmt_YUY2:
            dst_addr_list[0] = (unsigned int)dst_yp;

            dst_size_list[0] = dst_ysize*2;
            plane_num_out = 1;
            dp_out_fmt = eYUY2;

            thumbnailStream.setDstBuffer((void*)dst_yp, dst_ysize*2);
            break;
        default:
            return false;
            break;
    }


    //MY_LOGD("src addr (0, 1, 2) = (%p, %p, %p)", src_addr_list[0], src_addr_list[1], src_addr_list[2]);
    //MY_LOGD("dst addr (0, 1, 2) = (%p, %p, %p)", dst_addr_list[0], dst_addr_list[1], dst_addr_list[2]);

    //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "set src buffer");

    // set src buffer
    //thumbnailStream.setSrcBuffer((void**)src_addr_list, src_size_list, plane_num);

    //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "set src config");
    thumbnailStream.setSrcConfig(rSrcImgBufInfo.u4ImgWidth, rSrcImgBufInfo.u4ImgHeight, dp_in_fmt, dp_interlace_fmt);

    //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "set dst buffer");
    //thumbnailStream.setDstBuffer((void**)dst_addr_list, dst_size_list, plane_num_out);

   //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "set dst config");
    thumbnailStream.setDstConfig(rDstImgBufInfo.u4ImgWidth, rDstImgBufInfo.u4ImgHeight, dp_out_fmt);

    thumbnailStream.setRotate(rot);
    //*****************************************************************************//
    //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "invalidate");
    if (!thumbnailStream.invalidate())  //trigger HW
    {
          MY_LOGW("thumbnailStream invalidate failed");
          return false;
    }
    //CPTLogStr(Event_MShot_convertImage, CPTFlagSeparator, "invalidate end");
    //profile.print();
    if (mu4DumpFlag)
    {
        //char fileNames[256] = {'\0'};
        //sprintf(fileNames, "/sdcard/zsd_sub_src_%dx%d.bin", rSrcImgBufInfo.u4ImgWidth, rSrcImgBufInfo.u4ImgHeight);
        //android::MtkCamUtils::saveBufToFile(fileNames, reinterpret_cast<MUINT8*>( rSrcImgBufInfo.u4BufVA), rSrcImgBufInfo.u4BufSize);
        /*
        char fileName[256] = {'\0'};
        sprintf(fileName, ZSD_DUMP_PATH "zsd_cap_thumb_%dx%d.bin",  rDstImgBufInfo.u4ImgWidth, rDstImgBufInfo.u4ImgHeight);
        MtkCamUtils::saveBufToFile(fileName, reinterpret_cast<MUINT8*>( rDstImgBufInfo.u4BufVA), rDstImgBufInfo.u4BufSize);
        */
        usleep(1000*1000);
    }

    FUNCTION_LOG_END;

    return true;
}