硬件平台:Hi3510
库: libhiapi.a
整个流程:从摄像头采集之后,送至编码通道编码,然后送至解码通道解码,然后输出。
出现的问题:
在送到解码通道之后,用HI_VDEC_Receive函数接收相关解码后的视频流,然后直接打印出视频流的内容(虽然很有可能是乱码)。但是会被linux直接killed
相关结构体及其说明:
【目的】解码输出视频帧描述结构。
【语法】
typedef struct hiVDEC_FRAMEINFO_S
{
HI_BOOL value;
VDEC_CHN ChanID;
PIXEL_FORMAT_E enPixelFormat;
HI_U32 width;
HI_U32 height;
HI_U64 pts;
HI_U32 u32PhyAddr[3];
HI_U32 u32Stride[3];
HI_U32 u32MaskHandle;
} VDEC_FRAMEINFO_S, *PTR_VDEC_FRAMEINFO_S;
【参数】
参数名称
描述
value
有无视频帧数据。
HI_TRUE有,HI_FALSE无。
ChanID
通道号。
enPixelFormat
解码后视频数据格式。
width
图像宽。
height
图像高。
pts
该视频帧时间戳。
u32PhyAddr[3]
A/B/C分量物理地址。
u32Stride[3]
A/B/C分量的行距。
u32MaskHandle
视频帧Buffer掩码,用于Buffer管理。
相关代码:
#include <iostream>
#include "debugMsg.h"
#include "videoCapture.h"
#include "hi_common_api.h"
#include <sys/mman.h>
#include <fstream>
using namespace std;
#define LENGTH(v,a) ((((v) + ((a)-1)) & (~((a)-1))))
bool flag = true;
void recvData(void*)
{
CmdErrorTip("IN THE FUNCTION");
VDEC_FRAMEINFO_S frameInfo;
// FILE* fb = fopen("decRecode","wb+");
ofstream outfile("decRecode");
int mmapsize,mmapoffset,mmapbase;
unsigned char* pymap;
unsigned char* py;
while(flag)
{
if( HI_SUCCESS != HI_VDEC_Receive(0,&frameInfo,NULL,HI_TRUE) )
{
CmdErrorTip("Release video buffer failed");
return ;
}
else
{ //CmdErrorTip("recv data"); //Get the stream
std::cout << frameInfo.enPixelFormat << std::endl;
if(frameInfo.value == HI_TRUE)
{
CmdErrorTip("Receive frame");
std::cout << "frameInfo.u32PhyAddr[0]:\t" << frameInfo.u32PhyAddr[0] << std::endl;
unsigned char* p = (unsigned char* )frameInfo.u32PhyAddr[0];
std::cout << *(&p) << std::endl;
}
if( HI_SUCCESS != HI_VDEC_ReleaseVideoBuf(0,&frameInfo) )
{
CmdErrorTip("release buffer failed");
}
}
usleep(10000);
}
}
int main()
{
VI_CHN viChn = 0;
VENC_CHN vencChn = 0;
VO_CHN voChn = 0;
VDEC_CHN vdecChn = 0;
VENC_STREAM_S vencStream;
FILE* file = fopen("videoRecord.h264","wb+");
if(file == NULL)
{
std::cout << "open file error" << std::endl;
}
int i = 1000;
VideoCap vc;
vc.initVideoCap(D1,PAL,VENC_FORMAT_H264,viChn,&vencChn);
vc.initVideoExp(voChn,vdecChn,PAL);
pthread_t id;
pthread_create(&id,NULL,(void*(*)(void *))recvData,NULL);
unsigned long long pts = 0;
while(i--)
{
std::cout << i << std::endl;
vc.getStream(&vencChn,&vencStream);
VDEC_STREAM_S decStream;
for(unsigned int j=0;j < vencStream.u32DataNum;j++)
{
decStream.Dataaddr = (ADDR)(vencStream.struData[j].pAddr);
std::cout << decStream.Dataaddr << std::endl;
decStream.pts = pts++;
decStream.Datalen = vencStream.struData[j].u32Len;
usleep(0);
HI_S32 hiRet;
hiRet = HI_VDEC_SendStream(vdecChn,&decStream,HI_TRUE);
switch(hiRet)
{
case HI_SUCCESS: //std::cout << "send success" << std::endl;
break;
case HI_ERR_VDEC_NOT_OPEN: std::cout << "have not open the decode device" << std::endl;
break;
case HI_ERR_VDEC_INVALID_PARA: std::cout << "error input para" << std::endl;
break;
case HI_ERR_VDEC_INVALID_CHANID: std::cout << "wrong channel ID"<< std::endl; break;
case HI_ERR_VDEC_SENDSTREAM_FAILED: std::cout << "send stream failed" << std::endl; break;
case HI_ERR_VDEC_NO_INPUTBUF: std::cout << "no input buffer" << std::endl; break;
case HI_ERR_VDEC_NO_MSGBUF: std::cout << "no msg buffer" << std::endl; break;
default: std::cout << "default error" << std::endl; break;
}
}
vc.releaseStream(&vencChn,&vencStream);
usleep(100000);
}
fclose(file);
flag=false;
pthread_join(id,NULL);
vc.stopVideoCap(&vencChn);
return 0;
}