multimedia/device/mpp/tools/vpss_chn_dump.c

320 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "hi_common.h"
#include "hi_comm_video.h"
#include "hi_comm_sys.h"
#include "mpi_sys.h"
#include "hi_comm_vb.h"
#include "mpi_vb.h"
#include "hi_comm_vpss.h"
#include "mpi_vpss.h"
#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max)))
#if 1
static HI_S32 s_s32MemDev = -1;
#define MEM_DEV_OPEN() \
do {\
if (s_s32MemDev <= 0)\
{\
s_s32MemDev = open("/dev/mem", O_CREAT|O_RDWR|O_SYNC);\
if (s_s32MemDev < 0)\
{\
perror("Open dev/mem error");\
return -1;\
}\
}\
}while(0)
#define MEM_DEV_CLOSE() \
do {\
HI_S32 s32Ret;\
if (s_s32MemDev > 0)\
{\
s32Ret = close(s_s32MemDev);\
if(HI_SUCCESS != s32Ret)\
{\
perror("Close mem/dev Fail");\
return s32Ret;\
}\
s_s32MemDev = -1;\
}\
}while(0)
HI_VOID* COMM_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size)
{
HI_U32 u32Diff;
HI_U32 u32PagePhy;
HI_U32 u32PageSize;
HI_U8* pPageAddr;
/* The mmap address should align with page */
u32PagePhy = u32PhyAddr & 0xfffff000;
u32Diff = u32PhyAddr - u32PagePhy;
/* The mmap size shuld be mutliples of 1024 */
u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000;
pPageAddr = mmap ((void*)0, u32PageSize, PROT_READ | PROT_WRITE,
MAP_SHARED, s_s32MemDev, u32PagePhy);
if (MAP_FAILED == pPageAddr )
{
perror("mmap error");
return NULL;
}
return (HI_VOID*) (pPageAddr + u32Diff);
}
HI_S32 COMM_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size)
{
HI_U32 u32PageAddr;
HI_U32 u32PageSize;
HI_U32 u32Diff;
u32PageAddr = (((HI_U32)pVirAddr) & 0xfffff000);
u32Diff = (HI_U32)pVirAddr - u32PageAddr;
u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000;
return munmap((HI_VOID*)u32PageAddr, u32PageSize);
}
#endif
/* sp420 ת<><D7AA>Ϊ p420 ; sp422 ת<><D7AA>Ϊ p422 */
void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd)
{
unsigned int w, h;
char* pVBufVirt_Y;
char* pVBufVirt_C;
char* pMemContent;
unsigned char TmpBuff[2000]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ̫С<CCAB><D0A1>ͼ<EFBFBD><CDBC><EFBFBD>ܴ<EFBFBD><DCB4>Ļ<EFBFBD><C4BB><EFBFBD><E6B2BB>
HI_U32 phy_addr, size;
HI_CHAR* pUserPageAddr[2];
PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat;
HI_U32 u32UvHeight;/* <20><>Ϊplanar <20><>ʽʱ<CABD><CAB1>UV<55><56><EFBFBD><EFBFBD><EFBFBD>ĸ߶<C4B8> */
if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat)
{
size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2;
u32UvHeight = pVBuf->u32Height / 2;
}
else
{
size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2;
u32UvHeight = pVBuf->u32Height;
}
phy_addr = pVBuf->u32PhyAddr[0];
//printf("phy_addr:%x, size:%d\n", phy_addr, size);
pUserPageAddr[0] = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, size);
if (NULL == pUserPageAddr[0])
{
return;
}
//printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] );
pVBufVirt_Y = pUserPageAddr[0];
pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height);
/* save Y ----------------------------------------------------------------*/
fprintf(stderr, "saving......Y......");
fflush(stderr);
for (h = 0; h < pVBuf->u32Height; h++)
{
pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0];
fwrite(pMemContent, pVBuf->u32Width, 1, pfd);
}
fflush(pfd);
/* save U ----------------------------------------------------------------*/
fprintf(stderr, "U......");
fflush(stderr);
for (h = 0; h < u32UvHeight; h++)
{
pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1];
pMemContent += 1;
for (w = 0; w < pVBuf->u32Width / 2; w++)
{
TmpBuff[w] = *pMemContent;
pMemContent += 2;
}
fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd);
}
fflush(pfd);
/* save V ----------------------------------------------------------------*/
fprintf(stderr, "V......");
fflush(stderr);
for (h = 0; h < u32UvHeight; h++)
{
pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1];
for (w = 0; w < pVBuf->u32Width / 2; w++)
{
TmpBuff[w] = *pMemContent;
pMemContent += 2;
}
fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd);
}
fflush(pfd);
fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef);
fflush(stderr);
HI_MPI_SYS_Munmap(pUserPageAddr[0], size);
}
HI_VOID* SAMPLE_MISC_VpssDump(VPSS_GRP Grp, VPSS_CHN Chn, HI_U32 u32FrameCnt)
{
VIDEO_FRAME_INFO_S stFrame;
HI_CHAR szYuvName[128];
HI_CHAR szPixFrm[10];
FILE* pfd;
VPSS_GRP VpssGrp = Grp;
VPSS_CHN VpssChn = Chn;
HI_U32 u32Cnt = u32FrameCnt;
HI_U32 u32Depth = 2;
HI_U32 u32OrigDepth = 0;
VPSS_CHN_MODE_S stOrigVpssMode, stVpssMode;
HI_S32 s32MilliSec = 200;
if (HI_MPI_VPSS_GetChnMode(VpssGrp, VpssChn, &stOrigVpssMode) != HI_SUCCESS)
{
printf("get mode error!!!\n");
return (HI_VOID*) - 1;
}
if (HI_MPI_VPSS_GetDepth(VpssGrp, VpssChn, &u32OrigDepth) != HI_SUCCESS)
{
printf("get depth error!!!\n");
return (HI_VOID*) - 1;
}
stVpssMode.enChnMode = stOrigVpssMode.enChnMode;
stVpssMode.enPixelFormat = stOrigVpssMode.enPixelFormat;
stVpssMode.u32Width = stOrigVpssMode.u32Width;
stVpssMode.u32Height = stOrigVpssMode.u32Height;
stVpssMode.enCompressMode = COMPRESS_MODE_NONE;
stVpssMode.bDouble = HI_FALSE;
if (HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, &stVpssMode) != HI_SUCCESS)
{
printf("set mode error!!!\n");
return (HI_VOID*) - 1;
}
if (HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32Depth) != HI_SUCCESS)
{
printf("set depth error!!!\n");
return (HI_VOID*) - 1;
}
memset(&stFrame, 0, sizeof(stFrame));
while (HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stFrame, s32MilliSec) != HI_SUCCESS)
{
printf("get frame error!!!\n");
usleep(40000);
}
switch (stFrame.stVFrame.enPixelFormat)
{
case PIXEL_FORMAT_YUV_SEMIPLANAR_420:
snprintf(szPixFrm, 10, "P420");
break;
case PIXEL_FORMAT_YUV_SEMIPLANAR_422:
snprintf(szPixFrm, 10, "P422");
break;
case PIXEL_FORMAT_SINGLE:
snprintf(szPixFrm, 10, "Single");
break;
default:
snprintf(szPixFrm, 10, "--");
break;
}
/* make file name */
sprintf(szYuvName, "./vpss_grp%d_chn%d_w%d_h%d_%s_%d.yuv", VpssGrp, VpssChn,
stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm, u32Cnt);
printf("Dump YUV frame of vpss chn %d to file: \"%s\"\n", VpssChn, szYuvName);
fflush(stdout);
HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stFrame);
/* open file */
pfd = fopen(szYuvName, "wb");
if (NULL == pfd)
{
return (HI_VOID*) - 1;
}
/* get frame */
while (u32Cnt--)
{
if (HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stFrame, s32MilliSec) != HI_SUCCESS)
{
printf("Get frame fail \n");
usleep(1000);
continue;
}
sample_yuv_dump(&stFrame.stVFrame, pfd);
printf("Get VpssGrp %d frame %d!!\n", VpssGrp, u32Cnt);
/* release frame after using */
HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stFrame);
}
fclose(pfd);
HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32OrigDepth);
HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, &stOrigVpssMode);
return (HI_VOID*)0;
}
HI_S32 main(int argc, char* argv[])
{
VPSS_GRP VpssGrp = 0;
VPSS_CHN VpssChn = 0;
HI_U32 u32FrmCnt = 1;
printf("Usage: ./vpss_dump [Grp] [Chn] [Count] \n");
printf("Grp: vpss Grp id.\n");
printf("Chn: vpss Chn id.\n");
printf("Count: frame count.\n");
if (argc < 4)
{
printf("wrong arg!!!!\n\n");
return -1;
}
VpssGrp = atoi(argv[1]);
if (!VALUE_BETWEEN(VpssGrp, 0, VPSS_MAX_GRP_NUM - 1))
{
printf("grp id must be [0,%d]!!!!\n\n",VPSS_MAX_GRP_NUM - 1);
return -1;
}
VpssChn = atoi(argv[2]);/* chn id*/
if (!VALUE_BETWEEN(VpssChn, 0, VPSS_MAX_PHY_CHN_NUM - 1))
{
printf("chn id must be [0,%d]!!!!\n\n",VPSS_MAX_PHY_CHN_NUM - 1);
return -1;
}
u32FrmCnt = atoi(argv[3]);/* frame count*/
MEM_DEV_OPEN();
SAMPLE_MISC_VpssDump(VpssGrp, VpssChn, u32FrmCnt);
MEM_DEV_CLOSE();
return HI_SUCCESS;
}