当前位置:编程学习 > C/C++ >>

YUV422转BGR888(海思3516平台)

[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.zzzyk.com
  
    ret = saveBMPFile((Byte*)pImage, nWidth, nHeight, "/mnt/rgb.dib");  
    if(0 != ret)  
    {  
        printf( "saveBMPFile error\n");  
        return;  
    }  
    printf("saveBMPFile done!\n");  
  
    //uninit();  
}  
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,