海思hi3531d实现h264视频解码adpcm音频解码和HDMI输出音视频

该博客详细介绍了如何在海思hi3531d芯片上实现H264视频的解码,并结合ADPCM音频解码技术,成功实现通过HDMI接口进行音视频的同步输出。目前所有功能已证实正常运行。
摘要由CSDN通过智能技术生成

把例子化简了,功能目前都正常

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

#include "hi_comm_sys.h"
#include "hi_comm_vb.h"
#include "hi_comm_vdec.h"
#include "hi_comm_vpss.h"
#include "hi_comm_vo.h"
#include "hi_comm_hdmi.h"
#include "hi_comm_aio.h"
#include "hi_comm_adec.h"



#include "mpi_sys.h"
#include "mpi_vb.h"
#include "mpi_vdec.h"
#include "mpi_vpss.h"
#include "mpi_vo.h"
#include "mpi_hdmi.h"
#include "mpi_ai.h"
#include "mpi_ao.h"
#include "mpi_adec.h"




#define VO_BKGRD_RED      0xFF0000    /* red back groud color */
#define VO_BKGRD_GREEN    0x00FF00    /* green back groud color */
#define VO_BKGRD_BLUE     0x0000FF    /* blue back groud color */
#define VO_BKGRD_BLACK    0x000000    /* black back groud color */
#define VO_BKGRD_YELLOW   0xFFFF00    /* yellow back groud color */

typedef struct tagSAMPLE_ADEC_S
{
   
    HI_BOOL bStart;
    HI_S32 AdChn; 
    FILE *pfd;
    pthread_t stAdPid;
} SAMPLE_ADEC_S;


struct Para_Type{
   
	HI_CHAR srcVideoFileName[32];	//要解码的文件名
	HI_CHAR srcAudioFileName[32];
	HI_U32 u32BufSize;			//文件每次读取的大小
	HI_U32 u32Width;			//视频的宽
    HI_U32 u32Height;			//视频的高
	HI_U32 u32Frmt;				//视频的帧率
	HI_U32 u32DecChnId;			//解码通道号
	HI_U32 u32VpssChnId;		//视频处理通道号
	PAYLOAD_TYPE_E encType;		//编码格式H264
	VIDEO_MODE_E encMode;		//
	pthread_t decThread;		//解码并发送给VPSS的线程
	HI_BOOL bStopThread;		//是否停止线程

	AUDIO_DEV   AoDev;			//音频设备
	pthread_t audioThread;		//音频解码线程

}g_Para;
//SAMPLE_ADEC_S stSampleAdec;

HI_VOID * hi_video_send_to_vdec_thread(HI_VOID *args)
{
   
	FILE *fp=NULL;
	HI_U8 *pBuf = NULL;
	HI_S32 s32UsedBytes = 0, s32ReadLen, s32Ret;
	VDEC_STREAM_S stStream = {
   0};

	//二进制方式打开h264视频文件
	fp = fopen(g_Para.srcVideoFileName, "rb");
	pBuf = malloc(g_Para.u32BufSize);

	while (1)
	{
   
		if(g_Para.bStopThread)
			break;
		fseek(fp, s32UsedBytes, SEEK_SET);
		s32ReadLen = fread(pBuf, 1, g_Para.u32BufSize, fp);
		if (s32ReadLen == 0)				//文件已经读完,又重头开始读取,实现循环播放的效果
		{
   
			s32UsedBytes = 0;
			fseek(fp, 0, SEEK_SET); 		//文件指针的位置归零
			s32ReadLen = fread(pBuf, 1, g_Para.u32BufSize, fp);  
		}		
		stStream.u64PTS  = 0;
		stStream.pu8Addr = pBuf;
		stStream.u32Len  = s32ReadLen;
		stStream.bEndOfFrame = HI_FALSE;
		stStream.bEndOfStream = HI_FALSE;
		
		s32Ret = HI_MPI_VDEC_SendStream(g_Para.u32DecChnId, &stStream, 0);
		if (HI_SUCCESS != s32Ret)
        {
   
			sleep(1);
        }
        else
        {
   
            s32UsedBytes += s32ReadLen;
        }
		usleep(20000);
	};
	free(pBuf);
	fclose(fp);
	printf("video thread exit 0\n");
	return NULL;
}

void *hi_audio_send_to_adec_thread(void *parg)
{
   
    AUDIO_STREAM_S stAudioStream;
    HI_U32 u32Len = 1024;
    HI_U32 u32ReadLen;
    HI_S32 s32AdecChn = 0;
    HI_U8 *pAudioBuf = NULL;
    FILE *pfd = fopen(g_Para.srcAudioFileName, "rb");
    pAudioBuf = (HI_U8*)malloc(sizeof(HI_U8)*MAX_AUDIO_STREAM_LEN);

    while (1)
    {
   
        // read from file 
        if(g_Para.bStopThread)
			break;
        stAudioStream.pStream = pAudioBuf;
        u32ReadLen = fread(stAudioStream.pStream, 1, u32Len, pfd);
        if (u32ReadLen <= 0)
        {
   
            fseek(pfd, 0, SEEK_SET);//read file again
            continue;
        }
        // here only demo adec streaming sending mode, but pack sending mode is commended 
        stAudioStream.u32Len = u32ReadLen;
        HI_MPI_ADEC_SendStream(s32AdecChn, &stAudioStream, HI_TRUE);
    }

    free(pAudioBuf);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值