s3c6410硬件mfc解码分析-H264

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

H264的解码流程:

@函数Test_Display_H264:

1 打开源文件,返回文件描述符in_fd,函数open()

2 将文件的相关信息存放的结构体stat中,函数fstat(),比如文件的大小

3 将文件映射到内存中,函数mmap()返回首地址,in_addr

4 打开post processor,返回文件描述符,pp_fd

5 打开frame buffer,返回文件描述符fb_fd;

6 函数FrameExtractorInit,初始化帧提取器

FrameExtractorInit(FRAMEX_IN_TYPE_MEM, delimiter_h264, sizeof(delimiter_h264), 1);

参数:

FRAMEX_IN_TYPE_MEM:类型是枚举类型FRAMEX_IN_TYPE,指明输入文件的类型,在此说明是从内存读取文件,还可以是FRAMEX_IN_TYPE_FILE

delimiter_h264:类型是字符数组,有四个成员分别是0x00,0x00,0x00,0x01,与h264编码方式有关;

函数功能:

构建类型FRAMEX_CTX,并利用参数填充,最后返回其指针pFrameExCtx;

7 将文件在内存的起始地址,当前地址以及结束地址保存到类型为FRAMEX_STRM_PTR的量file_strm中;

8 函数FrameExtractorFirst,提取第一个帧?

FrameExtractorFirst(pFrameExCtx, &file_strm)

参数:

pFrameExCtx:初始化函数返回的指针

file_strm:包含文件地址信息

函数功能:

根据pFrameExCtx中保存的数据输入类型,选择进入函数:next_delimiter_mem(pCTX, (FRAMEX_STRM_PTR *) in, NULL, 0, NULL);

#函数next_delimiter_mem

#(FRAMEX_CTX *pCTX, FRAMEX_STRM_PTR *strm_ptr, unsigned char *outbuf, const int outbuf_size, int *n_fill)

#参数:

#pCTX:就是在帧提取器初始化函数返回的量:保存了文件输入类型以及一个4个字符的字符数组

#strm_ptr:保存了文件地址的指针

#函数功能:

#初始化一个字符数组queue[12],容量为12,依次取出源数据的前4个字符与pCTX中的比较,相等的话就将相应字符填充到queue[12]中,也就是说本次函数执行实现的就是将源数据的前四个个字符内容复制到queue[12]中,同时存储文件地址的量中的当前指针递增。(strm_ptr->p_cur++)

9 函数SsbSipH264DecodeInit()创建一个实例

返回值:

_MFCLIB_H264_DEC类型的指针

函数功能:

打开mfc设备,并将其映射到内存中,构建类型_MFCLIB_H264_DEC,并执行初始化填充,保存设备打开的描述符,内存地址,还有一个_MFCLIB_H264_DEC_MAGIC_NUMBER=0x92241002,

返回指向_MFCLIB_H264_DEC的指针handle

10 函数SsbSipH264DecodeGetInBuf,获取输入buffer

SsbSipH264DecodeGetInBuf(handle, nFrameLeng)

参数:

handle,创建实例是返回的类型_MFCLIB_H264_DEC,保存mfc设备的内存映射地址

nFrameLeng,初值为0;

函数功能:

构建类型统一体MFC_ARGS,应该是要传递给mfc的一些参数配置,并将mfc内存的首地址保存到此类型中,调用函数ioctl

ioctl(pCTX->hOpen, IOCTL_MFC_GET_LINE_BUF_ADDR, &mfc_args)

类型MFC_ARGS中的结构体MFC_GET_BUF_ADDR_ARG中会保存返回的数据:输出buffer的地址,输出buffer的大小,

返回输出buffer的地址

11 函数ExtractConfigStreamH264//H264 CONFIG stream extraction

ExtractConfigStreamH264(pFrameExCtx, &file_strm, pStrmBuf, INPUT_BUFFER_SIZE, NULL);

参数:

pFrameExCtx:初始化函数FrameExtractorInit返回的指向结构体FRAMEX_CTX的指针

file_strm:类型FRAMEX_STRM_PTR,保存文件映射到内存的首地址和结束地址

pStrmBuf:函数SsbSipH264DecodeGetInBuf返回的输出buffer的地址

INPUT_BUFFER_SIZE:宏定义:204800

结构体:H264_CONFIG_DATA,成员是长和宽,在此为NULL

函数功能://分析源文件获取总共的帧数,并返回nFrameLeng

(1)for循环(100)

(2)调用函数FrameExtractorPeek(pFrameExCtx, fp, frame_type, sizeof(frame_type), (int *)&nFrameSize);

frame_type:容量为10的字符数组,作为输出参数,函数实现就是读取源文件的前十个字符到frame_type中,并相应移动当前指针

(3)取返回数组中的元素frame_type[4]的弟八位,如果不是6,7或8退出函数

(4)函数FrameExtractorNext

#函数next_delimiter_mem

12 函数SsbSipH264DecodeExe(handle, nFrameLeng)

参数:

handle:decode实例化函数SsbSipH264DecodeInit()返回的指向类型_MFCLIB_H264_DEC的指针

根据参数对mfc初始化

调用函数ioctl(),会在mfc_args中返回信息,将这些信息传递给handle

13 函数SsbSipH264DecodeGetConfig(handle, H264_DEC_GETCONF_STREAMINFO, &stream_info);

获取stream的配置信息

参数:

H264_DEC_GETCONF_STREAMINFO:cmd类型

stream_info:类型是SSBSIP_H264_STREAM_INFO,将handle在函数SsbSipH264DecodeExe中获取的信息传递给此量和一个全局量g_stream_info

13 设置pp_param

pp_param的类型是结构体s3c_pp_params_t,是对pp的配置

调用ioctl将参数传递给pp

14 计算framebuffer的大小

fb_size = pp_param.dst_full_width * pp_param.dst_full_height * 2;    // RGB565

fb_size = pp_param.dst_full_width * pp_param.dst_full_height * 4;    // RGB888

并将fb映射到内存

15 设置OSD相关信息,此时在屏幕上就会画出一块巨型,准备显示了

16完成上面的以后就会进入解码环节:

#进入while(1),

#调用函数SsbSipH264DecodeExe,通知mfc开始解码

#函数SsbSipH264DecodeGetConfig(handle, H264_DEC_GETCONF_PHYADDR_FRAM_BUF, pYUVBuf),获取解码后的数据,输出buffer

与上面调用的区别是cmdType不同,调用ioctl,会在mfc_args中返回输出buffer的地址和输出buffer的大小

//////////////////////////

((unsigned int *) value)[0] = mfc_args.get_buf_addr.out_buf_addr;
((unsigned int *) value)[1] = mfc_args.get_buf_addr.out_buf_size;

//////////////////////////

#函数NextFrameH264,更新frame

#将输出buffer的地址传递给pp的配置结构体pp_param,调用ioctl设置pp,后处理并显示

#。。。。。下一帧解码

17 解码结束

deinit decode;

munmap;

close pp fb.

音视频开发系列--H264解码总结 H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)对摄像头采集的每一帧视频需要进行编码,由于视频中存在空间和时间的冗余,需要用算法来去除这些冗余。H264是专门去除这些冗余的算法,我们把这种算法称为H264编码。H264的出现就是为了创建比以前的视频压缩标准更高效的压缩标准,使用更好高效的视频压缩算法来压缩视频的占用空间,提高存储和传输的效率,在获得有效的压缩效果的同时,使得压缩过程引起的失真最小。 阅读详情

相关推荐

ARM11硬件解码(MFC)例程

摘要:介绍基于华恒科技HHS3C6410平台,将摄像头采集的数据通过硬件编码后通过网络发送,客户端(Linux)通过网络实时接收并显示的具体实现;主要介绍S3C6410H264硬件编码特性和V4L2编程。 关键词:S3C6410 H.264 视频监控 V4L2 0 引言     HHS3C6410是华恒科技推出的一款针对高性能手持设备和通用视频处理应用的低功率, 高性能的嵌入式开发板,采用三

JAVAweb学习 1214

sip协议获取h264码流转换成每一帧图片

从nvr中获取视频流,并将视频流转换成每一帧图片。大致流程: nvr中得到rtp包,rtp包得到h264码流,通过ffmpeg从h264中解析得到视频I帧,然后转换成图片。

视频编解码之H.264

h264作为目前最普遍的

jh1988abc的专栏 7133

解码标准-H.264

H.264是MPEG-4家族中的一员,着重强调更高的编码压缩率和传输的可靠性。

键盘敲的劈啪响 5427

视频H264解码知识

H264有严格的规范,以00 00 00 01分割之后的下一个字节就是NALU类型,用来描述此帧的意义。NALU类型:(1)第1位禁止位,值为1表示语法出错(2)第2~3位为参考级别(3)第4~8为是nal单元类型以通常的首帧来看:10,未使用1,不分区,非IDR图像的片2,片分区A 3,片分区B 4,片分区C5,IDR图像的片段6,补充增强信息单元(SEI)7,序列参数集sps8,图像参数集pps。

liveweb视频汇聚平台 1993

h264解码器,s3c6410硬件mfc解码分析-H264

http://www.rosoo.net/a/201110/15157.html H264解码流程: @函数Test_Display_H264: 1 打开源文件,返回文件描述符in_fd,函数open() 2 将文件的相关信息存放的结构体stat中,函数fstat(),比如文件的大小 3 将文件映射到内存中,函数mmap()返回首地址,in_addr 4 打开post processor,返回

Adrian 博客 1261

S3C6410 MFC H264 编码流程分析

转自:http://blog.sina.com.cn/s/blog_65f6a0520100rgg7.html 在代码分析开始前需要对一个概念进行解释,就是MFC。 Multi Format Codec的缩写,是ARM微处理器内部一种支持多种硬件编码方式的硬件电路,能够编码/解码MPEG-4/H.263/H.264(30fps)等多种格式的多媒体影像。 TOP6410开发板使用的是ARM

leo115的专栏 7064

S3C2440和S3C6410性能比较

 比较项目 S3C2440 S3C6410 内核 ARM920T ARM1176JZF-S 主频 400MHZ 533MHZ/667MHZ 处理器类型 16/32-bit RISC 16/32-bit RISC 设计目标 高性能、低功耗 高性能、低功耗、高性价比 主要应用 手持设备 2.5G和3G通信服务 内部总线结构 32/16-bit 64/32-bit 多媒体硬件编码器/解码器 无 有(支持...

无语僧 7503

基于6410H264采集、硬编码、软解码的源代码解析

//这个是友善之臂专题8的源代码,不过没有注释,现在加上了注释,提供下载链接,也可以不下载,对照着这里看。因为这个过程包括采集、硬编码、软解码等过程, //调用的函数是规范的,所以不是用tiny6410的也可以看看,不是用ARM的也可以看看解码部分! //我只在tiny6410上尝试,但是因为这里涉及的都是lcd设备节点和摄像头设备节点,基于S3C6410MFC,所以其他6410应该可以通用

c熊 2618

S3C6410 MFC视频硬件解码

<br />做了一个星期的s3c6410,有很多弄懂得,也有很多没清楚的,感觉比较混乱,还是理一下思路。<br />0. 知识点<br /><br /> <br />1. 视频解码的整个流程大致如下:<br /> <br /><br /> <br /> <br />说明了视频文件解码的整个过程,而在做s3c6410硬件解码中,我们需要关注的是怎样把一个视频文件(avi/mkv/mp4)拿来,然后做demuxer变成raw video stream,接着就能输入到硬件中:<br /><br />得到raw v

暂时为空 5145

S3C6410 MFC decode H.264流程

内核启动初始化:1)执行s3c_mfc_init(),打印“S3C6400 MFC Driver, (c) 2007 Samsung Electronics”;2)注册平台设备platform_driver_register(&s3c_mfc_driver);3)进入s3c_mfc_probe();4)获取时钟、打开时钟,映射寄存器物理地址,获取中断、注册中断;5)调用s3c_get_media_memory(S3C_MDEV_MFC),获取显存空间;6)调用s3c_mfc_setup_memory(),设

激情成就梦想--关注移动互联网 5497

S3C6410 MFC H264 编码

自己的MID平台播放视频支持的格式有限,按照应用要求需要扩展更多的格式。6410自己是带MFC(multi formatcodec),支持MPEG4,H263H264的硬解码。通过ls -l/dev可以得知s3c-mfc的驱动模块已经加载了,在android中操纵MFC的编解码部分是在external/opencore/codecs_v2/video/s3c_mfc目录下,发出IO控制。在SD卡

leo115的专栏 5183
上一篇: BusyBox tftp使用
下一篇: ICE(Internet Communications Engine)介绍(一)
ccskyer
博客等级 码龄17年 84粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值