实例介绍
【实例截图】
【核心代码】
/******************************************************************************
Copyright (C), 2007-2017, Hisilicon Tech. Co., Ltd.
******************************************************************************
File Name : hi_h264sample.c
Version : Initial Draft
Author : Hisilicon multimedia
Created : 2007/05/17
Description :
History :
1.Date : 2007/07/07
Author : y39262
Modification : Created file
******************************************************************************/
#include "hi_config.h"
#include "hi_h264api.h"
//#define MAX_DEC_NUM 32
#define BYTE_LEN 0x8000
HI_S32 main(HI_S32 argc,HI_U8** argv)
{
HI_S32 end = 0, input_param;
HI_U8 buf[BYTE_LEN];
H264_DEC_ATTR_S dec_attrbute;
H264_DEC_FRAME_S dec_frame;
H264_LIBINFO_S lib_info;
HI_HDL handle = NULL;
LARGE_INTEGER lpFrequency;
LARGE_INTEGER t1;
LARGE_INTEGER t2;
HI_U32 time;
HI_U32 pic_cnt = 0;
HI_U32 ImageEnhanceEnable = 0;
HI_U32 StrenthCoeff = 40;
HI_S32 WatermarkEnable = 0;
HI_S32 DeinterlaceEnable = 0;
HI_S32 DirectOutputEnable = 0;
FILE *h264 = NULL; //input h264 stream file
FILE *yuv = NULL; //file to save yuv
if ( 0 == Hi264DecGetInfo(&lib_info) )
{
fprintf(stderr, "Version: %s\nCopyright: %s\n\n", lib_info.sVersion, lib_info.sCopyRight);
fprintf(stderr, "Function 0x%x\n", lib_info.uFunctionSet);
}
if (argc < 2)
{
fprintf(stderr, "Comand format or no H.264 stream! The Example:\n");
fprintf(stderr, "hi_h264dec_w.exe stream_file.264 [-o yuvfile] [-direct] [-enhance 40] [-deinterlace]\n\n");
goto exitmain;
}
/* open input bitstream file(necessary) */
h264 = fopen(argv[1], "rb");
if (NULL == h264)
{
fprintf(stderr, "Unable to open a h264 stream file %s \n", argv[1]);
goto exitmain;
}
printf("decoding file: %s...\n",argv[1]);
/* parse optional parameters */
for(input_param = 2; input_param<argc; input_param )
{
if(strcmp("-enhance", argv[input_param]) == 0 && (input_param 1)<argc)
{
ImageEnhanceEnable = 1;
StrenthCoeff = atoi(argv[ input_param]);
continue;
}
else if(strcmp("-deinterlace", argv[input_param]) == 0)
{
DeinterlaceEnable = 1;
continue;
}
else if(strcmp("-direct", argv[input_param]) == 0)
{
DirectOutputEnable = 1;
continue;
}
else if(strcmp("-o", argv[input_param]) == 0 && (input_param 1)<argc)
{
/* open yuv file */
yuv = fopen(argv[ input_param], "wb");
if (NULL == yuv)
{
fprintf(stderr, "Unable to open the file to save yuv %s.\n", argv[input_param]);
goto exitmain;
}
printf("save yuv file: %s...\n",argv[input_param]);
}
}
/*init the config info for docoder*/
dec_attrbute.uBufNum = 16; // reference frames number: 16
dec_attrbute.uPicHeightInMB = 36; // D1(720x576)
dec_attrbute.uPicWidthInMB = 45;
dec_attrbute.uStreamInType = 0x00; // bitstream begin with "00 00 01" or "00 00 00 01"
if(DirectOutputEnable)
{
/* bit0 = 1: H.264 normal output mode; bit0 = 0: direct output mode */
dec_attrbute.uWorkMode = 0x00;
}
else
{
dec_attrbute.uWorkMode = 0x01;
}
if(DeinterlaceEnable)
{
/* bit4 = 1: enable deinteralce; bit4 = 0: disable deinterlace */
dec_attrbute.uWorkMode |= 0x10;
}
/*create a decoder*/
handle = Hi264DecCreate(&dec_attrbute);
if(NULL == handle)
{
goto exitmain;
}
/* count decoding time: start */
QueryPerformanceFrequency(&lpFrequency);
QueryPerformanceCounter(&t1);
/* dec the h264 stream file */
while (!end)
{
/* read bitstream from "h264" */
HI_U32 len = fread(buf,1,sizeof(buf),h264);
HI_U32 flags = (len>0)?0:1;
HI_S32 result = 0;
result = Hi264DecFrame(handle, buf, len, 0, &dec_frame, flags);
while(HI_H264DEC_NEED_MORE_BITS != result)
{
if(HI_H264DEC_NO_PICTURE == result) //flush over and all the remain picture are output
{
end = 1;
break;
}
if(HI_H264DEC_OK == result) //get a picture
{
if(ImageEnhanceEnable) //image enhance
{
Hi264DecImageEnhance(handle, &dec_frame, StrenthCoeff);
}
if(NULL != yuv )
{
const HI_U8 *pY = dec_frame.pY;
const HI_U8 *pU = dec_frame.pU;
const HI_U8 *pV = dec_frame.pV;
HI_U32 width = dec_frame.uWidth;
HI_U32 height = dec_frame.uHeight;
HI_U32 yStride = dec_frame.uYStride;
HI_U32 uvStride = dec_frame.uUVStride;
fwrite(pY, 1, height* yStride, yuv);
fwrite(pU, 1, height* uvStride/2, yuv);
fwrite(pV, 1, height* uvStride/2, yuv);
}
pic_cnt ;
}
/* continue decoding the remaining bitstream */
result = Hi264DecFrame(handle, NULL, 0, 0, &dec_frame, flags);
}
}
/* count decoding time: end */
QueryPerformanceCounter(&t2);
time = (HI_U32)((t2.QuadPart-t1.QuadPart)*1000/lpFrequency.QuadPart);
printf("\ntime= %d ms\n", time);
printf("%d frames\n",pic_cnt);
printf("fps: %d\n", pic_cnt*1000/(time 1));
/* destory decoder */
Hi264DecDestroy(handle);
exitmain:
if (NULL != h264)
{
fclose(h264);
}
if (NULL != yuv)
{
fclose(yuv);
}
return 0;
}
标签: h264
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论