[cpp] #include "hi_comm_ive.h" #include "mpi_ive.h" #pragma pack(1) typedef struct{ short type; int size; short reserved1; short reserved2; int offset; } BMPHeader; typedef struct{ int size; int width; int height; short planes; short bitsPerPixel; unsigned compression; unsigned imageSize; int xPelsPerMeter; int yPelsPerMeter; int clrUsed; int clrImportant; } BMPInfoHeader; #pragma pack() int saveBMPFile(unsigned char* src, int width, int height, const char* name){ BMPHeader hdr; BMPInfoHeader infoHdr; int ret = 0; FILE* fp = NULL; if(NULL == src) { return (-1); } fp = fopen(name,"wb"); if(NULL == fp) { printf("saveBMPFile: Err: Open!\n"); return (-1); } infoHdr.size = sizeof(BMPInfoHeader); infoHdr.width = width; infoHdr.height = 0 - height; infoHdr.planes = 1; infoHdr.bitsPerPixel = 24; infoHdr.compression = 0; infoHdr.imageSize = width*height; infoHdr.xPelsPerMeter = 0; infoHdr.yPelsPerMeter = 0; infoHdr.clrUsed = 0; infoHdr.clrImportant = 0; hdr.type = 0x4D42; hdr.size = 54 + infoHdr.imageSize*3; hdr.reserved1 = 0; hdr.reserved2 = 0; hdr.offset = 54; //BGR2RGB int i; int temp; for(i = 0;i < width*height;i++) { temp = src[i*3]; src[i*3] = src[i*3 + 2]; src[i*3 + 2] = temp; } fwrite(&hdr, sizeof(hdr), 1, fp); fwrite(&infoHdr, sizeof(infoHdr), 1, fp); fwrite(src, sizeof(unsigned char), width*height*3, fp); //TODO: fflush(fp); if(ferror(fp)){ printf("saveBMPFile: Err: Unknown!***\n"); } fclose(fp); fp = NULL; return 0; } int main() { HI_VOID *pVirtSrc = NULL; HI_VOID *pVirtDst = NULL; IVE_SRC_INFO_S stSrc; IVE_MEM_INFO_S stDst; unsigned int * pImage = NULL; stSrc.enSrcFmt = IVE_SRC_FMT_SP422; stSrc.stSrcMem.u32Stride = nWidth; stSrc.stSrcMem.u32PhyAddr = frameInfo->phyAddr; stSrc.u32Width = nWidth; stSrc.u32Height = nHeight; stDst.u32Stride = nWidth; IVE_HANDLE IveHandle; HI_BOOL bInstant = HI_TRUE; IVE_CSC_CTRL_S stCscCtrl; stCscCtrl.enOutFmt = IVE_CSC_OUT_FMT_PACKAGE; stCscCtrl.enCscMode = IVE_CSC_MODE_VIDEO_BT601_AND_BT656; //s32Ret = HI_MPI_SYS_MmzAlloc_Cached (&pstSrc->stSrcMem.u32PhyAddr,&pVirtSrc,"User", HI_NULL, pstSrc->u32Height * pstSrc->stSrcMem.u32Stride*2); //memset(pVirtSrc,1,pstSrc->u32Height * pstSrc->stSrcMem.u32Stride); ret = HI_MPI_SYS_MmzAlloc_Cached (&stDst.u32PhyAddr, &pVirtDst,"User", HI_NULL, stSrc.u32Height * stDst.u32Stride); //s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrc, &stDst, bInstant); //HI_MPI_SYS_MmzFree(stSrc.stSrcMem.u32PhyAddr, pVirtSrc); HI_MPI_SYS_MmzFree(stDst.u32PhyAddr, pVirtDst); ret=HI_MPI_IVE_CSC(&IveHandle,&stSrc,&stDst,&stCscCtrl,bInstant); if(ret==HI_FAILURE) { printf("YUV Convert to RGB failed!\n"); return HI_FAILURE; } pImage = HI_MPI_SYS_Mmap(stDst.u32PhyAddr, nLengthImage/2*3); if(NULL == pImage) { msg_print( "HI_MPI_SYS_Mmap err!\n"); return NVD_FALSE; } www.2cto.com ret = saveBMPFile((Byte*)pImage, nWidth, nHeight, "/mnt/rgb.dib"); if(0 != ret) { printf( "saveBMPFile error\n"); return; } printf("saveBMPFile done!\n"); //uninit(); }