关于海思Hi3510应用于视频解码的困惑

linrui6 2009-09-24 05:42:47
硬件平台: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;
}
...全文
430 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mahaizhen 2011-11-04
  • 打赏
  • 举报
回复
您好,我也在弄3515的板子,不知道大家弄的怎么样了,是否可以加我为QQ好友,共同学习,共同进步409469515
fyx010641 2010-11-11
  • 打赏
  • 举报
回复
这个内核中的地址,你需要把它从内核中拷贝到应用层才能打印@

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧